Posted to tcl by Napier at Wed Aug 20 18:57:24 GMT 2014view pretty
# 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 } }