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
	}
}