11import udp from 'dgram'
2+ import os from 'os'
23
34export type Device = {
45 ip : string
@@ -9,9 +10,32 @@ export type Device = {
910type Callback = ( devices : Device [ ] ) => void
1011
1112const DBX_UDP_PORT = 19272
12- const CLIENT_UDP_PORT = 52990
13+ const CLIENT_UDP_PORT = 0 // Leave it to OS
14+
15+ const getBroadcastAddresses = ( ) : string [ ] => {
16+ const interfaces = os . networkInterfaces ( )
17+ const addrs : string [ ] = [ ]
18+
19+ for ( const name in interfaces ) {
20+ const iface = interfaces [ name ]
21+ if ( ! iface ) continue
22+
23+ for ( const addr of iface ) {
24+ if ( addr . family === 'IPv4' && ! addr . internal && ! addr . address . startsWith ( '169.254.' ) ) {
25+ const ip = addr . address . split ( '.' ) . map ( Number )
26+ const netmask = addr . netmask . split ( '.' ) . map ( Number )
27+ const broadcast = ip . map ( ( byte , i ) => byte | ( ~ netmask [ i ] & 255 ) ) . join ( '.' )
28+ addrs . push ( broadcast )
29+ }
30+ }
31+ }
32+
33+ if ( addrs . length === 0 ) {
34+ return [ '255.255.255.255' ]
35+ }
1336
14- const BROADCAST_IP = '192.168.1.255'
37+ return addrs
38+ }
1539const BROADCAST_PACKET = `
1640 delay 100
1741 get \\\\Node\\AT\\Class_Name
@@ -42,7 +66,10 @@ export class Discovery {
4266 server . setBroadcast ( true )
4367
4468 const timer = setInterval ( ( ) => {
45- server . send ( Buffer . from ( BROADCAST_PACKET ) , DBX_UDP_PORT , BROADCAST_IP )
69+
70+ for ( const ip of getBroadcastAddresses ( ) ) {
71+ server . send ( Buffer . from ( BROADCAST_PACKET ) , DBX_UDP_PORT , ip )
72+ }
4673
4774 this . devices = this . devices . filter ( ( device ) => {
4875 if ( Date . now ( ) - device . lastSeen > 5000 ) {
0 commit comments