Class: IntesisBox::Discovery

Inherits:
Object
  • Object
show all
Defined in:
lib/intesis_box/discovery.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(timeout: nil) ⇒ Discovery

Returns a new instance of Discovery.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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

Class Method Details

.discover(timeout: 1, expected_count: nil, expect: nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
# 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

Instance Method Details

#closeObject



55
56
57
58
# File 'lib/intesis_box/discovery.rb', line 55

def close
  @receive_thread&.kill
  @socket.close
end

#discoverObject



60
61
62
# 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_discoveriesObject



64
65
66
67
# File 'lib/intesis_box/discovery.rb', line 64

def pending_discoveries
  result, @found = @found, []
  result
end