Posted to tcl by Napier at Wed Aug 20 18:57:24 GMT 2014view raw

  1. # discovery
  2.  
  3.  
  4. set disc_socket -1
  5. proc discover {} {
  6. global disc_socket
  7. if {$disc_socket != -1} {
  8. closeSocket $disc_socket
  9. }
  10. set disc_socket [connect 3 "239.255.255.250" 1900]
  11. if {$disc_socket == 0} {
  12. puts "__Failed to Connect to Discover"
  13. } else {
  14. puts "__Send Discover"
  15. 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"
  16. send $disc_socket $message
  17.  
  18. set ::discovered 2
  19. clearTimer $::discoveryTimer
  20. set ::discoveryTimer [setTimer 60000]
  21. puts "$::discoveryTimer"
  22. }
  23. }
  24.  
  25. #Retrieve serial from xml data returned by discovery
  26. proc getMIOSserial {data} {
  27. set manufacturer ""
  28. set friendlyName ""
  29. set serial 0
  30.  
  31. set xmlData [dom parse $data]
  32. set rootNode [$xmlData documentElement]
  33. #puts "rootNode: [$rootNode nodeName]"
  34. foreach node [$rootNode childNodes] {
  35. #puts "node = [$node nodeName]"
  36. if {[$node nodeName] == "device"} {
  37. foreach subnode [$node childNodes] {
  38. #puts "node = [$subnode nodeName]"
  39. if {[$subnode nodeName] == "friendlyName"} {
  40. set friendlyName [[$subnode firstChild] nodeValue]
  41. #puts "friendly = $friendlyName"
  42. }
  43. if {[$subnode nodeName] == "manufacturer"} {
  44. set manufacturer [[$subnode firstChild] nodeValue]
  45. #puts "manu = $manufacturer"
  46. }
  47.  
  48. if {$manufacturer != "" && $friendlyName != ""} {
  49. break
  50. }
  51. }
  52.  
  53. break
  54. }
  55. }
  56.  
  57. if {$manufacturer == "MiOS, Ltd." && $friendlyName != ""} {
  58. set serial [string range $friendlyName 5 end ]
  59. }
  60.  
  61. return $serial
  62. }
  63.  
  64. #Retrieve MAC from xml data returned by discovery
  65. proc getMIOSmac {data} {
  66. set manufacturer ""
  67. set MacAddress ""
  68. set mac 0
  69.  
  70. set xmlData [dom parse $data]
  71. set rootNode [$xmlData documentElement]
  72. #puts "rootNode: [$rootNode nodeName]"
  73. foreach node [$rootNode childNodes] {
  74. #puts "node = [$node nodeName]"
  75. if {[$node nodeName] == "device"} {
  76. foreach subnode [$node childNodes] {
  77. #puts "node = [$subnode nodeName]"
  78. if {[$subnode nodeName] == "MacAddress"} {
  79. set MacAddress [[$subnode firstChild] nodeValue]
  80. #puts "friendly = $friendlyName"
  81. }
  82. if {[$subnode nodeName] == "manufacturer"} {
  83. set manufacturer [[$subnode firstChild] nodeValue]
  84. #puts "manu = $manufacturer"
  85. }
  86.  
  87. if {$manufacturer != "" && $MacAddress != ""} {
  88. break
  89. }
  90. }
  91.  
  92. break
  93. }
  94. }
  95.  
  96. if {$manufacturer == "MiOS, Ltd." && $MacAddress != ""} {
  97. set mac $MacAddress
  98. }
  99.  
  100. return $mac
  101. }
  102.  
  103. #
  104. proc getDetails {data} {
  105. #puts "$data"
  106.  
  107. #find LOCATION: 192.168.42.4:etc
  108. set index1 [string first "LOCATION: " $data]
  109. #puts "index1 $index1"
  110. set index2 [string first "\r\n" $data $index1]
  111. #puts "index2 $index2"
  112. if {$index1 != -1 && $index2 != -1} {
  113. set location [string range $data [expr { $index1 + 10}] [expr { $index2 - 1}]]
  114. # puts "location: $location"
  115. } else {
  116. set location ""
  117. }
  118.  
  119. #find ST: urn:schemas-micasaverde-com:device:HomeAutomationGateway:1
  120. set index1 [string first "ST: " $data]
  121. set index2 [string first "\r\n" $data $index1]
  122. if {$index1 != -1 && $index2 != -1} {
  123. set st [string range $data [expr { $index1 + 4}] [expr { $index2 - 1}]]
  124. #puts "ST: $st"
  125. } else {
  126. set st ""
  127. }
  128.  
  129. if {$st == "urn:schemas-micasaverde-com:device:HomeAutomationGateway:1" && $location != ""} {
  130. set http [::http::geturl $location -keepalive 1 -timeout 500 ]
  131. set html [::http::data $http]
  132. ::http::cleanup $http
  133. #puts $html
  134. set serial [getMIOSserial $html]
  135. set mac [getMIOSmac $html]
  136. puts "__Discovery found MIOS serial: $serial and MAC Address: $mac"
  137.  
  138. #if matching serial
  139. if {$::serial == $serial || [string equal -nocase $::MAC $mac] == 1} {
  140. set index1 [string first "://" $location]
  141. set index2 [string first ":" $location [ expr { $index1 + 3 }]]
  142. if {$index1 != -1 && $index2 != -1} {
  143. set varIfAddressTemp [string range $location [expr { $index1 + 3}] [expr { $index2 - 1}]]
  144. if {$::varIfAddress != $varIfAddressTemp} {
  145. set ::varIfAddress $varIfAddressTemp
  146. set ::discovered 1
  147. puts "__Discovery Found IP: $::varIfAddress . READY TO CONNECT"
  148. } else {
  149. set ::discovered 0
  150. puts "__Discovery Found IP: $::varIfAddress . SAME IP DO NOT CONNECT"
  151. }
  152. clearTimer $::discoveryTimer
  153. set ::discoveryTimer -1
  154. set ::discoveryTimer [setTimer 3600000]
  155. }
  156. }
  157. }
  158. }
  159.  
  160. proc isDiscovered {} {
  161. if {$::discovered == 0} {
  162. return 1
  163. } else {
  164. return 0
  165. }
  166. }
  167.