Skip to content

Commit

Permalink
NVT discovery
Browse files Browse the repository at this point in the history
  • Loading branch information
agsh committed Mar 16, 2015
1 parent 15abffe commit ec2fb95
Showing 1 changed file with 53 additions and 37 deletions.
90 changes: 53 additions & 37 deletions lib/onvif.js
Expand Up @@ -821,69 +821,85 @@ Cam.prototype._panTiltZoomVectors = function(ptz) {
: '';
};

var Discovery = Object.create(new events.EventEmitter);
var Discovery = Object.create(new events.EventEmitter());

/**
* Discover NVT devices in subnetwork
* @param {object} [options]
* @param {number} [options.timeout] timeout for discovery responses
* @param {boolean} [options.resolve] set to `false` if you want omit creating of Cam objects
* @param {function(Array<Cam|object>)} [callback]
*/
Discovery.probe = function(options, callback) {
/*if (callback === undefined) {
callback = options;
options = {};
}*/
if (callback === undefined) {
if (typeof options === 'function') {
callback = options;
options = {};
} else {
options = options || {};
}
}
callback = callback || function() {};

var socket = dgram.createSocket('udp4');
var cams = []
, messageID = 'urn:uuid:' + '01234567-dead-beef-baad-abcdeffedcba' // No needs for real uuid here
, request = new Buffer(
'<s:Envelope ' +
'xmlns:s="http://www.w3.org/2003/05/soap-envelope" ' +
'xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">' +
'<s:Header>' +
'<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</a:Action>' +
'<a:MessageID>' + messageID + '</a:MessageID>' +
'<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>' +
'<a:To s:mustUnderstand="1">urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01</a:To>' +
'</s:Header>' +
'<s:Body>' +
'<Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">' +
'<d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:dp0="http://www.onvif.org/ver10/network/wsdl">dp0:NetworkVideoTransmitter</d:Types>' +
'</Probe>' +
'</s:Body>' +
'</s:Envelope>'
)
, socket = dgram.createSocket('udp4');

socket.on('error', function (err) {
throw err;
callback(err);
});

var messageID = 'urn:uuid:' + '01234567-dead-beef-baad-abcdeffedcba'; // No needs for real uuid here

var listener = function(msg, rinfo) {
parseSOAPString(msg, function(err, data, xml) {
if (err || !data[0].probeMatches) {
Discovery.emit('error', 'Wrong SOAP message from ' + rinfo.address + ':' + rinfo.port, xml);
} else {
data = _linerase(data);
var camUri = url.parse(data.probeMatches.probeMatch.XAddrs);

var cam = new Cam({
hostname: camUri.hostname
, port: camUri.port
, path: camUri.path
});
var cam;
if (options.resolve !== false) {
var camUri = url.parse(data.probeMatches.probeMatch.XAddrs);
cam = new Cam({
hostname: camUri.hostname
, port: camUri.port
, path: camUri.path
});
} else {
cam = data;
}
cams.push(cam);
Discovery.emit('device', cam, rinfo);
}
});
};
var request = new Buffer(
'<s:Envelope ' +
'xmlns:s="http://www.w3.org/2003/05/soap-envelope" ' +
'xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">' +
'<s:Header>' +
'<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</a:Action>' +
'<a:MessageID>' + messageID + '</a:MessageID>' +
'<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>' +
'<a:To s:mustUnderstand="1">urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01</a:To>' +
'</s:Header>' +
'<s:Body>' +
'<Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">' +
'<d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:dp0="http://www.onvif.org/ver10/network/wsdl">dp0:NetworkVideoTransmitter</d:Types>' +
'</Probe>' +
'</s:Body>' +
'</s:Envelope>'
);

socket.on('message', listener);
socket.send(request, 0, request.length, 3702, '239.255.255.250');

setTimeout(function() {
socket.removeListener('message', listener);
socket.close();
callback();
callback(null, cams);
}.bind(this), options.timeout || 5000);
};

module.exports = {
Cam: Cam
, Discovery: Discovery
};

module.exports.Cam = Cam;
};

0 comments on commit ec2fb95

Please sign in to comment.