-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathdiscovery-plain-ssdp.js
58 lines (53 loc) · 1.89 KB
/
discovery-plain-ssdp.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
54
55
56
57
58
// This test file doesn't use the sonos library. Instead it uses plain sockets just to debug discovery.
// see https://github.com/svrooij/node-sonos-ts/issues/150#issuecomment-1006086581
// credits: https://gist.github.com/chrishulbert/895382
const dgram = require('dgram')
// Broadcast to specific address, port with specific message
const PORT = 1900
const ADDRESS = '239.255.255.250'
// Alternatives - both work for SONOS. First provides only the group!
// ST urn:smartspeaker-audio:service:SpeakerGroup:1
// ST urn:schemas-upnp-org:device:ZonePlayer:1
//
// To discover also NON-SONOS devices use:
// ST ssdp:all
//
// MAN should use " " although SONOS works without.
const messageAsBuffer = Buffer.from(
'M-SEARCH * HTTP/1.1\r\n'
+ `HOST: ${ADDRESS}:${PORT}\r\n`
+ 'MAN: "ssdp:discover"\r\n'
+ 'MX: 1\r\n'
+ 'ST: urn:schemas-upnp-org:device:ZonePlayer:1\r\n',
)
const socket = dgram.createSocket({ type: 'udp4', reuseAddr: true })
// set up error, listening, messages
socket.on('error', (err) => {
console.log(JSON.stringify(err))
socket.close()
})
socket.on('listening', () => {
// following are not needed
// socket.setBroadcast(true)
// socket.addMembership(ADDRESS)
// socket.setMulticastTTL(128)
console.log('Start listening ...')
})
socket.on('message', (msg, rinfo) => {
// msg is buffer and contains line breaks.
const msgArray = msg.toString().split(/\r\n|\n|\r/)
// LOCATION is in line 4 -> so it is number 3
console.log(rinfo.address + '-->' + msgArray[3].replace('LOCATION: ', '').trim())
})
// bind with random port and send broadcast. bind is async!
socket.bind(() => {
console.log('random port:' + socket.address().port)
socket.send(messageAsBuffer, 0, messageAsBuffer.length, PORT, ADDRESS, (err) => {
if (err) {
console.log(JSON.stringify(err))
socket.close()
} else {
console.log('OK broadcast was sent!')
}
})
})