class IntesisBox::Discovery
Public Class Methods
discover(timeout: 1, expected_count: nil, expect: nil)
click to toggle source
# File lib/intesis_box/discovery.rb, line 6 def discover(timeout: 1, expected_count: nil, expect: nil) wmps = {} discovery = new(timeout: timeout) do |wmp| wmps[wmp[:mac]] = wmp next false if wmps.length == expected_count next false if expect && wmp[:mac] == expect true end wmps ensure discovery&.close end
new(timeout: nil) { |wmp| ... }
click to toggle source
# File lib/intesis_box/discovery.rb, line 20 def initialize(timeout: nil) @socket = UDPSocket.new @socket.bind("0.0.0.0", 3310) @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true) @found = [] receive_lambda = -> do loop do if IO.select([@socket], nil, nil, timeout) @socket.wait_readable msg, _ = @socket.recvfrom(128) next unless msg.start_with?("DISCOVER:") msg = msg[9..-1] model, mac, ip, protocol, version, rssi, name, _, _ = msg.split(",") wmp = { mac: mac, model: model, ip: ip, protocol: protocol, version: version, rssi: rssi, name: name } if block_given? break unless yield wmp else @found << wmp end else break end end end if timeout discover receive_lambda.call else @receive_thread = Thread.new(&receive_lambda) end end
Public Instance Methods
close()
click to toggle source
# File lib/intesis_box/discovery.rb, line 55 def close @receive_thread&.kill @socket.close end
discover()
click to toggle source
# File lib/intesis_box/discovery.rb, line 60 def discover @socket.sendmsg("DISCOVER\r\n", 0, Socket.sockaddr_in(3310, '255.255.255.255')) end
pending_discoveries()
click to toggle source
# File lib/intesis_box/discovery.rb, line 64 def pending_discoveries result, @found = @found, [] result end