Posted to tcl by Napier at Wed Aug 20 18:57:24 GMT 2014view raw
- # discovery
- set disc_socket -1
- proc discover {} {
- global disc_socket
- if {$disc_socket != -1} {
- closeSocket $disc_socket
- }
- set disc_socket [connect 3 "239.255.255.250" 1900]
- if {$disc_socket == 0} {
- puts "__Failed to Connect to Discover"
- } else {
- puts "__Send Discover"
- set message "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 5\r\nST: ssdp:all\r\nContent-Length: 0\r\n\r\n"
- send $disc_socket $message
- set ::discovered 2
- clearTimer $::discoveryTimer
- set ::discoveryTimer [setTimer 60000]
- puts "$::discoveryTimer"
- }
- }
- #Retrieve serial from xml data returned by discovery
- proc getMIOSserial {data} {
- set manufacturer ""
- set friendlyName ""
- set serial 0
- set xmlData [dom parse $data]
- set rootNode [$xmlData documentElement]
- #puts "rootNode: [$rootNode nodeName]"
- foreach node [$rootNode childNodes] {
- #puts "node = [$node nodeName]"
- if {[$node nodeName] == "device"} {
- foreach subnode [$node childNodes] {
- #puts "node = [$subnode nodeName]"
- if {[$subnode nodeName] == "friendlyName"} {
- set friendlyName [[$subnode firstChild] nodeValue]
- #puts "friendly = $friendlyName"
- }
- if {[$subnode nodeName] == "manufacturer"} {
- set manufacturer [[$subnode firstChild] nodeValue]
- #puts "manu = $manufacturer"
- }
- if {$manufacturer != "" && $friendlyName != ""} {
- break
- }
- }
- break
- }
- }
- if {$manufacturer == "MiOS, Ltd." && $friendlyName != ""} {
- set serial [string range $friendlyName 5 end ]
- }
- return $serial
- }
- #Retrieve MAC from xml data returned by discovery
- proc getMIOSmac {data} {
- set manufacturer ""
- set MacAddress ""
- set mac 0
- set xmlData [dom parse $data]
- set rootNode [$xmlData documentElement]
- #puts "rootNode: [$rootNode nodeName]"
- foreach node [$rootNode childNodes] {
- #puts "node = [$node nodeName]"
- if {[$node nodeName] == "device"} {
- foreach subnode [$node childNodes] {
- #puts "node = [$subnode nodeName]"
- if {[$subnode nodeName] == "MacAddress"} {
- set MacAddress [[$subnode firstChild] nodeValue]
- #puts "friendly = $friendlyName"
- }
- if {[$subnode nodeName] == "manufacturer"} {
- set manufacturer [[$subnode firstChild] nodeValue]
- #puts "manu = $manufacturer"
- }
- if {$manufacturer != "" && $MacAddress != ""} {
- break
- }
- }
- break
- }
- }
- if {$manufacturer == "MiOS, Ltd." && $MacAddress != ""} {
- set mac $MacAddress
- }
- return $mac
- }
- #
- proc getDetails {data} {
- #puts "$data"
- #find LOCATION: 192.168.42.4:etc
- set index1 [string first "LOCATION: " $data]
- #puts "index1 $index1"
- set index2 [string first "\r\n" $data $index1]
- #puts "index2 $index2"
- if {$index1 != -1 && $index2 != -1} {
- set location [string range $data [expr { $index1 + 10}] [expr { $index2 - 1}]]
- # puts "location: $location"
- } else {
- set location ""
- }
- #find ST: urn:schemas-micasaverde-com:device:HomeAutomationGateway:1
- set index1 [string first "ST: " $data]
- set index2 [string first "\r\n" $data $index1]
- if {$index1 != -1 && $index2 != -1} {
- set st [string range $data [expr { $index1 + 4}] [expr { $index2 - 1}]]
- #puts "ST: $st"
- } else {
- set st ""
- }
- if {$st == "urn:schemas-micasaverde-com:device:HomeAutomationGateway:1" && $location != ""} {
- set http [::http::geturl $location -keepalive 1 -timeout 500 ]
- set html [::http::data $http]
- ::http::cleanup $http
- #puts $html
- set serial [getMIOSserial $html]
- set mac [getMIOSmac $html]
- puts "__Discovery found MIOS serial: $serial and MAC Address: $mac"
- #if matching serial
- if {$::serial == $serial || [string equal -nocase $::MAC $mac] == 1} {
- set index1 [string first "://" $location]
- set index2 [string first ":" $location [ expr { $index1 + 3 }]]
- if {$index1 != -1 && $index2 != -1} {
- set varIfAddressTemp [string range $location [expr { $index1 + 3}] [expr { $index2 - 1}]]
- if {$::varIfAddress != $varIfAddressTemp} {
- set ::varIfAddress $varIfAddressTemp
- set ::discovered 1
- puts "__Discovery Found IP: $::varIfAddress . READY TO CONNECT"
- } else {
- set ::discovered 0
- puts "__Discovery Found IP: $::varIfAddress . SAME IP DO NOT CONNECT"
- }
- clearTimer $::discoveryTimer
- set ::discoveryTimer -1
- set ::discoveryTimer [setTimer 3600000]
- }
- }
- }
- }
- proc isDiscovered {} {
- if {$::discovered == 0} {
- return 1
- } else {
- return 0
- }
- }