Bi Directional MQTT to OPCUA Bridge
Expose MQTT topics to an OPCUA server via folders. Supports read/write.
Usage:
- git clone https://github.com/nzfarmer1/mqtt2opcua
- cd mqtt2opcua
- npm link (view/edit examples/run.js)
- node examples/run.js
node creates an OPC server that:
- Connects to an MQTT broker
- Subscribes to '#' or a predefined set of topics
- On 1st Message of an unseen topic it creates the folder paths and node (last part of path) with nodeId s=topic
- On all onMessage calls, it keeps track of the topic's payload
- On Set requests it publishes the raw value from the OPCUA client
- On Get requests it returns the formatted persistant payload
Note:
Recently upgraded to support MQTT auth and to remove spaces from OPCUA name in example
PLEASE REMEMBER TO CHECK FOR UPDATES REGULARLY!
Todo: Add authentication
For configuration options and formatting of payloads, see handlers example below.
var mqtt2opc = require("../mqtt2opcua").run;
var Events = require('events').EventEmitter;
forward = new Events();
backward = new Events();
// Set up forward and reverse data conversion functions
// These are based on topic path - the finer grained pattern will be used.
// Examples below
forward.on("$SYS/broker/bytes/#", function(payload) {
return {
dataType: "Int32",
value: parseInt(payload)
}
});
backward.on("$SYS/broker/bytes/#", function(variant) {
return {
topic:variant.topic,
payload:variant.value
};
});
options = {
opcHost:"localhost",
opcPort:"4334",
mqttHost:"localhost",
mqttPort:"1883",
debug:true,
roundtrip:false, // Set to true if you wish to enforce the integrity of round trip communications
forward:forward, // data converter - mqtt -> opcua
backward:backward, // data converter - opcua -> mqtt
//topics:['#','$SYS/#'] // Customize to override. These are the default so uncessary.
};
var server = new mqtt2opc(options);
Please feel free to fork and improve.
Andrew McClure, Director AgSense - Bringing I.o.T to NZ AgricultureKoha (Donation) - If you like our work and would like to make a small donation to help us continue
