-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiscovery.js
92 lines (86 loc) · 3.45 KB
/
discovery.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
var dgram = require('dgram');
var ipadress = require('./ipadress');
var ip = ipadress.getIpAddress();
var port = 80;
// Credit to Sagen here - this response, and the UPnP M-SEARCH response
// taken from https://github.com/sagen/hue-upnp
var discoveryResponse = '<?xml version="1.0"?>\
<root xmlns="urn:schemas-upnp-org:device-1-0">\
<specVersion>\
<major>1</major>\
<minor>0</minor>\
</specVersion>\
<URLBase>http://' + ip + (port == 80 ? '' : port) +'/</URLBase>\
<device>\
<deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>\
<friendlyName>Philips hue Bridge Router</friendlyName>\
<manufacturer></manufacturer>\
<manufacturerURL>http://github.com/sagen</manufacturerURL>\
<modelDescription>Philips hue Personal Wireless Lighting Bridge Router</modelDescription>\
<modelName>Philips hue bridge 2012 Router</modelName>\
<modelNumber>929000226503</modelNumber>\
<modelURL>http://www.meethue.com</modelURL>\
<serialNumber>nope</serialNumber>\
<UDN>uuid:2f402f80-da50-11e1-9b23-nydalenlys</UDN>\
<serviceList>\
<service>\
<serviceType>(null)</serviceType>\
<serviceId>(null)</serviceId>\
<controlURL>(null)</controlURL>\
<eventSubURL>(null)</eventSubURL>\
<SCPDURL>(null)</SCPDURL>\
</service>\
</serviceList>\
<presentationURL>index.html</presentationURL>\
<iconList>\
<icon>\
<mimetype>image/png</mimetype>\
<height>48</height>\
<width>48</width>\
<depth>24</depth>\
<url>hue_logo_0.png</url>\
</icon>\
<icon>\
<mimetype>image/png</mimetype>\
<height>120</height>\
<width>120</width>\
<depth>24</depth>\
<url>hue_logo_3.png</url>\
</icon>\
</iconList>\
</device>\
</root>';
exports.addRoutes = function(server) {
};
exports.enableDiscovery = function() {
var s = dgram.createSocket('udp4');
s.bind(1900, undefined, function() {
console.log('UPnP discovery started')
s.addMembership('239.255.255.250');
s.on('message', function(msg, rinfo) {
var msgString = msg.toString();
if (msgString.substr(0, 10) == 'M-SEARCH *') {
console.log('M-SEARCH Message received')
console.log(rinfo);
var response = "HTTP/1.1 200 OK\r\n\
CACHE-CONTROL: max-age=100\r\n\
EXT:\r\n\
LOCATION: http://" + ip + ":" + port + "/description.xml\r\n\
SERVER: FreeRTOS/6.0.5, UPnP/1.0, IpBridge/0.1\r\n\
ST: upnp:rootdevice\r\n\
USN: uuid:2fa00080-d000-11e1-9b23-001f80007bbe::upnp:rootdevice\r\n";
var responseBuffer = new Buffer(response);
s.send(responseBuffer, 0, responseBuffer.length, rinfo.port, rinfo.address);
}
})
});
var server = require('hapi').createServer('0.0.0.0', 1902);
server.route( {
method: 'GET'
, path: '/description.xml'
, handler: function(request) {
request.reply(discoveryResponse)
.header('Content-Type', 'text/xml');
}});
server.start();
};