class SimpleUpnp::Discovery
Constants
- MAX_RECEIVE_LENGTH
- M_SEARCH
- SSDP_ADDR
- SSDP_PORT
Public Class Methods
find(seconds_to_listen=5) { |device| ... }
click to toggle source
Signal the uPnP Multicast address and wait for responses, which can be processed by an input block accepting a SimpleUpnp::Device
Use break to exit the block once you have found the device being looked for
# File lib/simple_upnp/discovery.rb, line 27 def self.find(seconds_to_listen=5, &block) open_socket do |socket| process_messages(socket, seconds_to_listen) do |message| device = SimpleUpnp::Device.new(message) yield device end end end
search(seconds_to_listen=5)
click to toggle source
Signal the uPnP Multicast address and wait for responses, returning an array of SimpleUpnp::Devices
# File lib/simple_upnp/discovery.rb, line 13 def self.search(seconds_to_listen=5) devices = [] open_socket do |socket| process_messages(socket, seconds_to_listen) do |message| device = SimpleUpnp::Device.new(message) index = devices.index { |x| x.usn == device.usn } devices << device if index.nil? end end devices end
Private Class Methods
open_socket() { |socket| ... }
click to toggle source
# File lib/simple_upnp/discovery.rb, line 38 def self.open_socket(&block) begin socket = UDPSocket.new socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, [1].pack('i')) socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, [1].pack('i')) socket.send(M_SEARCH, 0, SSDP_ADDR, SSDP_PORT) yield socket ensure socket.close end end
process_messages(socket, seconds_to_listen) { |message| ... }
click to toggle source
# File lib/simple_upnp/discovery.rb, line 50 def self.process_messages(socket, seconds_to_listen, &block) begin Timeout::timeout(seconds_to_listen) do while true message, _ = socket.recvfrom(MAX_RECEIVE_LENGTH) yield message end end rescue Timeout::Error # Finished Listening end end