module Sonycam::Scanner
Public Instance Methods
scan(ip = nil, timeout: 10)
click to toggle source
returns array of device description XML URL
# File lib/sonycam/scanner.rb, line 8 def scan ip = nil, timeout: 10 m_search = <<-EOS M-SEARCH * HTTP/1.1\r HOST: 239.255.255.250:1900\r MAN: ssdp:discover\r MX: #{timeout}\r ST: urn:schemas-sony-com:service:ScalarWebAPI:1\r \r EOS addresses = ip ? Array(Addrinfo.ip(ip)) : Socket.ip_address_list.reject{ |a| a.ipv4_loopback? || a.ipv6_loopback? || a.ipv6_linklocal? } locations = [] addresses.map do |addr_info| Thread.new do begin sock = UDPSocket.new sock.bind(addr_info.ip_address, 0) sock.send(m_search, 0, '239.255.255.250', 1900) Timeout::timeout(timeout) do response = sock.recv(1024) headers = Hash[response.split("\r\n").map{|x| x[/^([^:]*)\s*:\s*(.*)$/]; [$1, $2]}] locations << headers['LOCATION'] if headers['ST'] == 'urn:schemas-sony-com:service:ScalarWebAPI:1' end rescue Timeout::Error rescue puts $!.inspect, $@ end end end.each(&:join) locations end