class SimpleUpnp::Discovery

Constants

MAX_RECEIVE_LENGTH
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

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