node-opcua
Advanced tools
Comparing version 0.0.4 to 0.0.5
var readline = require('readline'); | ||
var fs = require("fs"); | ||
var treeify = require('treeify'); | ||
var OPCUAClient = require("../lib/opcua-client.js").OPCUAClient; | ||
var utils = require('../lib/utils'); | ||
var opcua = require('../lib/nodeopcua'); | ||
var color = require('colors'); | ||
var ec = require("../lib/encode_decode"); | ||
var browse_service = require("../lib/browse_service"); | ||
var sprintf = require('sprintf'); | ||
var opcua = require(".."); | ||
var OPCUAClient = opcua.OPCUAClient; | ||
var utils = require('../lib/utils'); | ||
function completer(line) { | ||
@@ -63,24 +66,13 @@ | ||
var variables = require("./../lib/opcua_node_ids").Variable; | ||
function get_variable_nodeid(value1,value2) { | ||
if(variables.hasOwnProperty(value1)) { | ||
nodeId = get_variable_nodeid(variables[value1],0); | ||
console.log("node 0 ",nodeId); | ||
} else if (parseInt(value1).toString() === value1 ) { | ||
nodeId= ec.makeNodeId(parseInt(value1),parseInt(value2)); | ||
console.log("node 1 ",parseInt(value1),nodeId); | ||
} else { | ||
nodeId = ec.makeNodeId(value1,parseInt(value2)); | ||
console.log("node 2 ",nodeId); | ||
} | ||
return nodeId; | ||
function colorize(value) { | ||
return ("" + value).yellow.bold; | ||
} | ||
if (rl.history) { | ||
var hostname = require("os").hostname(); | ||
rl.history.push("open opc.tcp://" + hostname + ":51210/UA/SampleServer"); | ||
rl.history.push("open opc.tcp://" + hostname + ":4841"); | ||
rl.history.push("b ObjectsFolder"); | ||
rl.history.push("r ns=2;s=Furnace_1.Temperature"); | ||
} | ||
@@ -160,24 +152,19 @@ | ||
rl.pause(); | ||
nodes = []; | ||
nodes.push( { | ||
nodeId: get_variable_nodeid(args[1],args[2]), | ||
includeSubtypes: true, | ||
browseDirection: browse_service.BrowseDirection.Both | ||
}); | ||
console.log(" browse "); | ||
console.log(treeify.asTree(nodes,true) ); | ||
the_sesssion.browse(nodes,function(err,nodes) { | ||
nodes = [ args[1] ]; | ||
the_sesssion.browse(nodes,function(err,nodeResults) { | ||
if (err ) { | ||
console.log(err); | ||
console.log(nodes); | ||
console.log(nodeResults); | ||
} else { | ||
//xx console.log(nodes.continuationPoint.toString("hex")); | ||
//xx console.log(nodes[0].references[0]); | ||
var summary = {}; | ||
nodes[0].references.forEach(function(node){ | ||
summary[node.browseName.name] = "id: " + (node.isForward ? "->" : "<-") + node.nodeId.toString() ; | ||
}); | ||
console.log(treeify.asTree(summary,true)); | ||
for (var i = 0; i < nodeResults.length; i++ ) { | ||
console.log("Node: ", nodes[i]); | ||
nodeResults[i].references.forEach(function(node){ | ||
str = sprintf(" %-30s%s%s",node.browseName.name,(node.isForward ? "->" : "<-") ,node.nodeId.displayText() ); | ||
console.log(str); | ||
}); | ||
} | ||
} | ||
@@ -194,13 +181,5 @@ }); | ||
rl.pause(); | ||
nodes = []; | ||
nodes.push( { | ||
nodeId: get_variable_nodeid(args[1],args[2]), | ||
attributeId: 13, | ||
indexRange: null, | ||
dataEncoding: { id:0 , name: null} | ||
}); | ||
console.log(treeify.asTree(nodes,true)); | ||
nodes = [args[1]]; | ||
the_sesssion.read(nodes,function(err,dataValues) { | ||
console.log(" done ..."); | ||
if (err ) { | ||
@@ -210,4 +189,10 @@ console.log(err); | ||
} else { | ||
console.log(dataValues[0]); | ||
for (var i = 0; i < dataValues.length; i++ ) { | ||
var dataValue = dataValues[i]; | ||
console.log(" Node : ", (nodes[i]).cyan.bold); | ||
console.log(" type : ",colorize(dataValue.value.dataType.key)); | ||
console.log(" value: ",colorize(dataValue.value.value)); | ||
console.log(" statusCode: 0x", dataValue.statusCode.toString(16) ); | ||
console.log(" sourceTimestamp: ",dataValue.sourceTimestamp, dataValue.sourcePicoseconds ); | ||
} | ||
} | ||
@@ -214,0 +199,0 @@ }); |
var fs = require("fs"); | ||
var treeify = require('treeify'); | ||
var _ = require("underscore"); | ||
var color = require("colors"); | ||
var util = require("util"); | ||
var Table = require('easy-table'); | ||
var async = require("async"); | ||
var utils = require('../lib/utils'); | ||
var coerceNodeId = require("../lib/nodeid").coerceNodeId; | ||
var util = require("util"); | ||
var Table = require('easy-table'); | ||
var argv = require('optimist') | ||
@@ -12,6 +15,5 @@ .usage('Usage: $0 --port [num] --hostname <hostname> -d') | ||
var OPCUAClient = require("../lib/opcua-client.js").OPCUAClient; | ||
var async = require("async"); | ||
var opcua = require("../"); | ||
var client = new OPCUAClient(); | ||
var client = new opcua.OPCUAClient(); | ||
@@ -25,32 +27,16 @@ var port = argv.port || 4841 | ||
var browse_service = require("../lib/browse_service"); | ||
var color = require("colors"); | ||
function browseTree(root, nodeId, callback) { | ||
var nodeIds = _.isArray(nodeId) ? nodeId : [nodeId]; | ||
var nodeIds = _.isArray(nodeId) ? nodeId : [ nodeId]; | ||
var folderTypeNodeId = opcua.resolveNodeId("FolderType"); | ||
the_session.browse(nodeIds, function (err, results,diagnostics) { | ||
var nodesToBrowse = []; | ||
nodeIds.map(function(nodeId) { | ||
return { | ||
nodeId: nodeId, | ||
includeSubtypes: true, | ||
browseDirection: browse_service.BrowseDirection.Forward | ||
}; | ||
}); | ||
var tasks = []; | ||
var folderTypeNodeId = coerceNodeId("i=61"); | ||
the_session.browse(nodesToBrowse, function (err, nodes) { | ||
var tasks = []; | ||
var nodeIds = []; | ||
if (!err) { | ||
// we want typeDefinition i=61 => FolderType | ||
nodes[0].references.forEach(function (node) { | ||
results[0].references.forEach(function (node) { | ||
@@ -62,19 +48,22 @@ root[node.browseName.name] = {}; | ||
if (node.typeDefinition.value != 0 ) { // folderTypeNodeId.value || node.typeDefinition.value == 2000 || node.typeDefinition.value == 62 ) { | ||
nodeIds.push(node.nodeId); | ||
if (node.typeDefinition.value == folderTypeNodeId.value || node.typeDefinition.value == 2000 || node.typeDefinition.value == 62 ) { | ||
if (node.isForward) { | ||
//xx console.log(" appending : " + node.nodeId.displayText()); | ||
tasks.push(function(callback){ browseTree(root[node.browseName.name].nodes,node.nodeId,callback); }); | ||
} | ||
} | ||
}); | ||
process.nextTick(function(){ | ||
async.series(tasks,function() { | ||
callback(err,root); | ||
}); | ||
}); | ||
} else { | ||
console.log(err.message.red); | ||
console.log(err); | ||
callback(err,null); | ||
} | ||
tasks.push(function(callback){ | ||
browseTree(root[node.browseName.name].nodes,nodeIds,callback); | ||
}); | ||
process.nextTick(function(){ | ||
async.series(tasks,function(){ | ||
callback(err,root); | ||
}); | ||
}); | ||
// xxcallback(err,root); | ||
}); | ||
@@ -88,3 +77,3 @@ | ||
function(callback) { | ||
console.log(" connecting to ", endpointUrl); | ||
console.log(" connecting to ", endpointUrl.cyan.bold); | ||
client.connect(endpointUrl,callback); | ||
@@ -130,3 +119,3 @@ }, | ||
function(callback) { | ||
console.log(" connecting to ", endpointUrl); | ||
console.log(" reconnecting to ", endpointUrl.cyan.bold); | ||
client.connect(endpointUrl,callback); | ||
@@ -138,3 +127,6 @@ }, | ||
client.createSession(function (err,session){ | ||
the_session = session; | ||
if (!err) { | ||
the_session = session; | ||
console.log(" session created".yellow); | ||
} | ||
callback(err); | ||
@@ -146,5 +138,4 @@ }); | ||
function(callback) { | ||
return callback(); | ||
var root = {}; | ||
browseTree(root,coerceNodeId("i=84"),function(err,root){ | ||
browseTree(root,"RootFolder",function(err,root){ | ||
console.log(treeify.asTree(root, true)); | ||
@@ -156,3 +147,8 @@ callback(err); | ||
function(callback) { | ||
the_session.close(callback); | ||
console.log(" closing session"); | ||
the_session.close(function(err){ | ||
console.log(" session closed"); | ||
callback(); | ||
}); | ||
}, | ||
@@ -166,9 +162,12 @@ | ||
if (err) { | ||
console.log(" process terminated with an error"); | ||
console.log(" client : process terminated with an error"); | ||
console.log(" error" , err) ; | ||
console.log(err.stack) ; | ||
} else { | ||
console.log("success !! "); | ||
} | ||
// force disconnection | ||
if (client) { client.disconnect(function(){}); } | ||
}); | ||
10
index.js
@@ -1,4 +0,6 @@ | ||
module.exports.OPCUAClient = require("./lib/opcua-client").OPCUAClient; | ||
module.exports.structures = require("./lib/structures"); | ||
module.exports.browse_service = require("./lib/browse_service"); | ||
module.exports.read_service = require("./lib/read_service"); | ||
module.exports.OPCUAClient = require("./lib/opcua-client").OPCUAClient; | ||
module.exports.structures = require("./lib/structures"); | ||
module.exports.browse_service = require("./lib/browse_service"); | ||
module.exports.read_service = require("./lib/read_service"); | ||
module.exports.parseEndpointUrl = require("./lib/nodeopcua").parseEndpointUrl; | ||
module.exports.resolveNodeId = require("./lib/nodeid").resolveNodeId; |
@@ -84,4 +84,4 @@ | ||
if (response instanceof s.ServiceFault) { | ||
var err = response; | ||
err.request = "TODO : inject request here for future diagnostic "; | ||
var err = new Error(" ServiceFault returned by server "+ JSON.stringify(response,0," ")); | ||
err.response = response; | ||
self._terminate(err,null); | ||
@@ -331,2 +331,3 @@ | ||
self.emit("receive_response",response); | ||
assert(!err || (err instanceof Error)); | ||
callback(err,response); | ||
@@ -333,0 +334,0 @@ }); |
@@ -29,6 +29,6 @@ var util = require("util"); | ||
case NodeIdType.STRING: | ||
return "ns="+ this.namespace +";s='"+this.value+"'"; | ||
return "ns="+ this.namespace +";s="+this.value+""; | ||
break; | ||
case NodeIdType.GUID: | ||
return "ns="+ this.namespace +";g='"+this.value+"'"; | ||
return "ns="+ this.namespace +";g="+this.value+""; | ||
break; | ||
@@ -43,3 +43,5 @@ case NodeIdType.BYTESTRING: | ||
exports.NodeId = NodeId; | ||
/** | ||
@@ -51,2 +53,6 @@ * Convert a value into a nodeId: | ||
*/ | ||
var rege_ns_i =/ns=([0-9]+)\;i=([0-9]+)/ ; | ||
var rege_ns_s =/ns=([0-9]+)\;s=(.*)/ ; | ||
function coerceNodeId(value,namespace){ | ||
@@ -69,12 +75,19 @@ | ||
} else if ( value.substr(0,2) === "s=" ) { | ||
identifierType = NodeIdType.STRING; | ||
value = value.substr(2); | ||
} else if (is_guid(value)) { | ||
identifierType= NodeIdType.GUID; | ||
} else { | ||
} else if ( (matches = rege_ns_i.exec(value)) !== null) { | ||
identifierType = NodeIdType.NUMERIC; | ||
var r = /ns=([0-9]+)\;i=([0-9]+)/ ; | ||
var matches = r.exec(value); | ||
if (matches) { | ||
namespace = parseInt(matches[1]); | ||
value = parseInt(matches[2]); | ||
} | ||
namespace = parseInt(matches[1]); | ||
value = parseInt(matches[2]); | ||
} else if ( (matches = rege_ns_s.exec(value)) !== null) { | ||
identifierType = NodeIdType.STRING; | ||
namespace = parseInt(matches[1]); | ||
value = matches[2]; | ||
} | ||
@@ -165,2 +178,66 @@ | ||
return new ExpandedNodeId(NodeIdType.NUMERIC,value,namespace,namespaceUri,serverIndex); | ||
}; | ||
}; | ||
var variables = require("./../lib/opcua_node_ids").Variable; | ||
var objects = require("./../lib/opcua_node_ids").Object; | ||
var objectTypes = require("./../lib/opcua_node_ids").ObjectType; | ||
var variableTypes = require("./../lib/opcua_node_ids").VariableType; | ||
var methods = require("./../lib/opcua_node_ids").Method; | ||
function resolveNodeId(node_or_string) { | ||
var nodeId; | ||
if(objects.hasOwnProperty(node_or_string)) { | ||
nodeId = resolveNodeId(objects[node_or_string],0); | ||
} else if(variables.hasOwnProperty(node_or_string)) { | ||
nodeId = resolveNodeId(variables[node_or_string],0); | ||
} else if(objectTypes.hasOwnProperty(node_or_string)) { | ||
nodeId = resolveNodeId(objectTypes[node_or_string],0); | ||
} else if(variableTypes.hasOwnProperty(node_or_string)) { | ||
nodeId = resolveNodeId(variableTypes[node_or_string],0); | ||
} else if(methods.hasOwnProperty(node_or_string)) { | ||
nodeId = resolveNodeId(methods[node_or_string],0); | ||
} else { | ||
nodeId = coerceNodeId(node_or_string); | ||
} | ||
return nodeId; | ||
} | ||
exports.resolveNodeId = resolveNodeId; | ||
var _known_NodeIds = null; | ||
NodeId.prototype.displayText = function() | ||
{ | ||
if (_known_NodeIds == null) { | ||
// build reverse index | ||
_known_NodeIds = {}; | ||
function expand_map(reverse_index,direct_index) { | ||
for ( name in direct_index ) { | ||
if (direct_index.hasOwnProperty(name)) { | ||
var value = direct_index[name]; | ||
reverse_index[value] = name; | ||
} | ||
} | ||
} | ||
expand_map(_known_NodeIds,objects); | ||
expand_map(_known_NodeIds,objectTypes); | ||
expand_map(_known_NodeIds,variables); | ||
expand_map(_known_NodeIds,variableTypes); | ||
expand_map(_known_NodeIds,methods); | ||
} | ||
if (this.namespace === 0 ) { | ||
if (_known_NodeIds.hasOwnProperty(this.value)) { | ||
return _known_NodeIds[this.value] + " (" + this.toString() +")"; | ||
} | ||
} | ||
return this.toString(); | ||
}; |
@@ -15,2 +15,3 @@ var util = require("util"); | ||
var ec = require("./encode_decode"); | ||
var resolveNodeId = require("./nodeid").resolveNodeId; | ||
@@ -167,31 +168,30 @@ var debugLog = require("../lib/utils").make_debugLog(__filename); | ||
/** | ||
* session.browse([{ | ||
* nodeId: ec.makeNodeId(85), | ||
* includeSubTypes: true, | ||
* browseDirection: browse_service.BrowseDirection.Both, | ||
* }],function(err,nodes) {} ); | ||
* @example: | ||
* | ||
* @param nodesToBrowse | ||
* session.browse("RootFolder",function(err,results,diagnostics) {} ); | ||
* | ||
* @param nodes | ||
* @param callback | ||
*/ | ||
OPCUASession.prototype.browse = function(nodesToBrowse,callback) { | ||
OPCUASession.prototype.browse = function(nodes,callback) { | ||
assert(typeof(callback) === "function"); | ||
var request = new browse_service.BrowseRequest({ | ||
}); | ||
if (!_.isArray(nodes)) { nodes = [nodes]; } | ||
nodesToBrowse.forEach(function(node) { | ||
var b = new browse_service.BrowseDescription(node); | ||
b.resultMask = b.resultMask || 63; | ||
request.nodesToBrowse.push(b); | ||
var nodesToBrowse = []; | ||
nodes.forEach(function(node) { | ||
nodesToBrowse.push({ | ||
nodeId: resolveNodeId(node), | ||
includeSubtypes: true, | ||
browseDirection: browse_service.BrowseDirection.Both, | ||
resultMask: 63 | ||
}); | ||
}); | ||
var request = new browse_service.BrowseRequest({ nodesToBrowse:nodesToBrowse }); | ||
request.requestHeader.authenticationToken = this.authenticationToken; | ||
var self = this; | ||
self._client._secureChannel.performMessageTransaction(request, browse_service.BrowseResponse,function(err,response){ | ||
this.performMessageTransaction(request, browse_service.BrowseResponse,function(err,response){ | ||
if(err) { | ||
@@ -210,23 +210,36 @@ callback(err,null,response); | ||
/** | ||
* @example: | ||
* | ||
* @param nodesToRead | ||
* session.read("ns=2;s=Furnace_1.Temperature",function(err,dataValues,diagnostics) {} ); | ||
* | ||
* @param nodes | ||
* @param callback | ||
*/ | ||
OPCUASession.prototype.read = function(nodesToRead,callback) { | ||
OPCUASession.prototype.read = function(nodes,callback) { | ||
assert(typeof(callback) === "function"); | ||
if (!_.isArray(nodes)) { nodes = [nodes]; } | ||
var request = new read_service.ReadRequest({ | ||
nodesToRead:nodesToRead | ||
var nodesToRead = []; | ||
nodes.forEach(function(node) { | ||
nodesToRead.push( { | ||
nodeId: resolveNodeId(node), | ||
attributeId: 13, | ||
indexRange: null, | ||
dataEncoding: { id:0 , name: null} | ||
}); | ||
}); | ||
//xx console.dir(request); | ||
var request = new read_service.ReadRequest({ nodesToRead: nodesToRead }); | ||
request.requestHeader.authenticationToken = this.authenticationToken; | ||
assert( nodes.length == request.nodesToRead.length); | ||
var self = this; | ||
self._client._secureChannel.performMessageTransaction(request, read_service.ReadResponse,function(err,response){ | ||
this.performMessageTransaction(request, read_service.ReadResponse,function(err,response) { | ||
if(err) { | ||
callback(err,null,response); | ||
callback(err,response); | ||
} else { | ||
assert( nodes.length == response.results.length); | ||
callback(null,response.results,response.diagnosticInfos); | ||
@@ -238,3 +251,10 @@ } | ||
OPCUASession.prototype.performMessageTransaction = function(request, responseClass,callback) { | ||
assert(typeof(callback) === "function"); | ||
request.requestHeader.authenticationToken = this.authenticationToken; | ||
this._client._secureChannel.performMessageTransaction(request,responseClass,callback); | ||
}; | ||
OPCUASession.prototype.close = function(callback) { | ||
@@ -245,2 +265,3 @@ this._client.closeSession(this,callback); | ||
OPCUAClient.prototype._nextSessionName = function() | ||
@@ -423,2 +444,3 @@ { | ||
if(err) { | ||
assert(err instanceof Error); | ||
callback(err,null); | ||
@@ -425,0 +447,0 @@ } else { |
{ | ||
"name": "node-opcua", | ||
"version": "0.0.4", | ||
"version": "0.0.5", | ||
"description": "pure nodejs OPCUA SDK", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -46,4 +46,9 @@ node-opcua | ||
var endpointUrl = "opc.tcp://localhost:4841/UA/Sample"; | ||
var endpointUrl = "opc.tcp://" + require("os").hostname() + ":4841"; | ||
var the_session = null; | ||
async.series([ | ||
// step 1 : connect to | ||
function(callback) { | ||
@@ -59,7 +64,54 @@ client.connect(endpointUrl,function (err) { | ||
}, | ||
function(callback) { client.disconnect(callback); } | ||
], function() { console.log("done!")} ) ; | ||
// step 2 : createSession | ||
function(callback) { | ||
client.createSession( function(err,session) { | ||
if(!err) { | ||
the_session = session; | ||
} | ||
callback(err); | ||
}); | ||
}, | ||
// step 3 : browse | ||
function(callback) { | ||
the_session.browse("RootFolder", function(err,browse_result,diagnostics){ | ||
if(!err) { | ||
browse_result[0].references.forEach(function(reference) { | ||
console.log( reference.browseName); | ||
}); | ||
} | ||
callback(err); | ||
}); | ||
}, | ||
// step 4 : read a variable | ||
function(callback) { | ||
the_session.read("ns=2;s=Furnace_1.Temperature", function(err,dataValues,diagnostics) { | ||
if (!err) { | ||
console.log(" temperature = " , dataValues[0].value.value); | ||
} | ||
callback(err); | ||
}) | ||
}, | ||
], function(err) { | ||
if (err) { | ||
console.log(" failure ",err); | ||
} else { | ||
console.log("done!") | ||
} | ||
// disconnect regardless | ||
client.disconnect(function(){}); | ||
}) ; | ||
``` | ||
now run it | ||
@@ -66,0 +118,0 @@ |
Sorry, the diff of this file is not supported yet
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
0
100
2
142
3394628
108
15849