|
1 | 1 | const dgram = require('dgram'); |
| 2 | +const net = require('net'); |
2 | 3 |
|
3 | 4 | const DISCOVERY_PORT = 20000; |
| 5 | +const DISCOVERY_TCP_PORT = 20001; |
4 | 6 |
|
5 | 7 | module.exports.scanDevices = () => { |
6 | 8 | return new Promise(resolve => { |
7 | 9 | const requestId = Date.now(); |
8 | 10 | const devices = []; |
9 | | - const socket = dgram.createSocket('udp4'); |
10 | | - |
11 | | - socket.on('listening', () => { |
12 | | - socket.setBroadcast(true); |
13 | | - socket.send(JSON.stringify({requestId}), DISCOVERY_PORT, '255.255.255.255'); |
14 | | - console.log('Starting device scan.'); |
15 | | - }); |
16 | | - |
17 | | - socket.on('message', (message, remote) => { |
| 11 | + const handleResponse = message => { |
18 | 12 | try { |
19 | 13 | message = JSON.parse(message); |
20 | 14 | if(message.requestId == requestId && !!message.ip && !!message.name) { |
| 15 | + if(devices.find(dev => dev.ip == message.ip)) return; |
21 | 16 | delete message.requestId; |
22 | 17 | devices.push(message); |
23 | 18 | console.log('Discovered device: '+JSON.stringify(message)); |
24 | 19 | } |
25 | 20 | } catch(e) {} |
| 21 | + }; |
| 22 | + const socket = dgram.createSocket('udp4'); |
| 23 | + |
| 24 | + // Request |
| 25 | + socket.on('listening', () => { |
| 26 | + socket.setBroadcast(true); |
| 27 | + socket.send(JSON.stringify({requestId}), DISCOVERY_PORT, '255.255.255.255'); |
| 28 | + console.log('Starting device scan.'); |
| 29 | + }); |
| 30 | + |
| 31 | + // UDP Response |
| 32 | + socket.on('message', handleResponse); |
| 33 | + |
| 34 | + // TCP Response |
| 35 | + const tcpServer = net.createServer(socket => { |
| 36 | + socket.on('data', handleResponse); |
26 | 37 | }); |
| 38 | + tcpServer.listen(DISCOVERY_TCP_PORT); |
27 | 39 |
|
28 | 40 | setTimeout(() => { |
| 41 | + tcpServer.close(); |
29 | 42 | socket.close(); |
30 | 43 | resolve(devices); |
31 | 44 | }, 2000); |
|
0 commit comments