Niagara
This snippet provides a function to send IoT data to Niagara.
Resources used: HTTPS x 1
or MQTTS x 1
For more information about setting up your Niagara host and NEQTO device to work together using oBIX or MQTT, please see this blog post.
Details
The send_niagara
function can be used to POST the passed 'payload' to Niagara oBIX server, over HTTPS. The result (error/response) is then passed to the callback function.
The mqtt_niagara
function returns an MQTT client object connected to the specified MQTT broker. The user can use the client to PUBLISH/SUBSCRIBE to a topic, over MQTTS.
To start using this snippet, HOST
(Address of the oBIX server/MQTT Broker), PORT
(Port of the oBIX server/MQTT Broker), PATH
(Path of the element to write data to, for oBIX server), USERNAME
, PASSWORD
, and CA
are required to be configured by the user.
NOTE: The provided function can handle data sizes up to 4KB. To handle larger data sizes, please refer to divided writing for https objects in the neqto.js documentation.
HTTPS (oBIX)
//=================================================================
// NIAGARA OBIX SAMPLE CODE
//=================================================================
//=================================================================
// The following configuration are MANDATORY. Set by user.
//=================================================================
// The address of the oBIX Server.
var HOST = '<YOUR_HOST>';
// The port of the oBIX Server.
var PORT = '<YOUR_PORT>';
// The path to make requests to.
var PATH = '<YOUR_PATH>';
// The Username for authorization.
var USERNAME = '<YOUR_USERNAME>';
// The Password for authorization.
var PASSWORD = '<YOUR_PASSWORD>';
// Public certificate of the certificate authority that signed the oBIX server certificate for SSL/TLS handshake.
// eg. '-----BEGIN CERTIFICATE-----\n...<CA>...\n-----END CERTIFICATE-----'
var CA = '<YOUR_CA>';
//=================================================================
/**
* Post data to Niagara oBIX server using basic authentication.
* @function send_niagara
* @param {string} payload - The data to be sent to Niagara, as a string.
* @param {function} callback - User callback to return the result (error/response).
* @returns {undefined}
*/
var send_niagara = function (payload, callback) {
var body = `<real val='${payload}'/>`; // assuming it is a string writable path
var options = {
"method": 'POST',
"host": HOST,
"port": Number(PORT),
"path": PATH,
"headers": {
"Authorization": 'Basic ' + secure.base64Encode(`${USERNAME}:${PASSWORD}`),
"Content-Type": 'application/json',
"Content-Length": body.length.toString()
},
"ca": CA
};
var request = https.request(options, function (res) {
res.on('readable', function () {
callback(null, { "statusCode": res.statusCode, "statusMessage": res.statusMessage, "body": res.read() });
});
res.on('end', function () {
callback(null, { "statusCode": res.statusCode, "statusMessage": res.statusMessage, "body": res.read() });
});
});
request.on('error', function () {
callback({ "errCode": request.errCode }, null);
});
request.end(body.toString(), function () {
print('[request] SUCCESS');
});
}
MQTTS
//=================================================================
// NIAGARA MQTT SAMPLE CODE
//=================================================================
//=================================================================
// The following configuration are MANDATORY. Set by user.
//=================================================================
// The address of the MQTT Broker.
var HOST = '<YOUR_HOST>';
// The port of the MQTT Broker.
var PORT = '<YOUR_PORT>';
// The Username for authorization.
var USERNAME = '<YOUR_USERNAME>';
// The Password for authorization.
var PASSWORD = '<YOUR_PASSWORD>';
// Public certificate of the certificate authority that signed the MQTT broker certificate for SSL/TLS handshake.
// eg. '-----BEGIN CERTIFICATE-----\n...<CA>...\n-----END CERTIFICATE-----'
var CA = '<YOUR_CA>';
//=================================================================
/**
* Create an MQTT Client connected to the specified MQTT Broker using basic authentication.
* @function mqtt_niagara
* @param {object} options - MQTT Configuration for connecting to the broker, as an Object.
* @returns {(Client|undefined)} - {Client} : Generated MQTT {Client} | undefined : {Client} generate failed due to invalid arguments or insufficient resources.
*/
var mqtt_niagara = function (options) {
mqtt.set('ssl.ca', CA);
return mqtt.connect(`mqtts://${HOST}:${PORT}`, options);
}
Function Usage Example
Sample 1
This is a sample to send data to the server using the send_niagara
function.
/*
<INSERT ABOVE SNIPPET HERE WITH SET CONFIGURATIONS>
*/
//=================================================================
log.setLevel(-1); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
//=================================================================
// MAIN SCENARIO
//=================================================================
/**
* Callback to fetch error/response from the request.
* @function callback
* @param {object} err - Error returned if the request failed. Has one property - `errCode`.
* @param {object} data - Response returned by a successfully completed request. Has three properties - `statusCode`, `statusMessage`, and `body`.
*/
var callback = function (err, data) {
if (err) {
print("[error]", err.errCode);
} else {
print("[status]", data.statusCode, data.statusMessage);
print("[response]", data.body);
}
}
var payload = "Hello from NEQTO Device";
send_niagara(payload, callback);
Sample 2
This is a sample to publish and subscribe using the client returned from the mqtt_niagara
function, with automatic reconnection enabled. After connection, loopback test of transmission and reception is performed.
/*
<INSERT ABOVE SNIPPET HERE WITH SET CONFIGURATIONS>
*/
//=================================================================
log.setLevel(-1); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
//=================================================================
// MAIN SCENARIO
//=================================================================
var sub_topic = 'niagara/test/sub';
var pub_topic = 'niagara/test/pub';
var client = mqtt_niagara({
"username": USERNAME, // MANDATORY
"password": PASSWORD, // MANDATORY
"reconnectCount": 1855
});
if (!client) {
throw 'Failed to create mqtt instance';
}
var registerEventHandlers = function () {
if (!client) {
return;
}
client.on('error', function (err) {
print('ERROR: ' + err.code + ' ERRNO: ' + client.get('errnoConnect'));
//TODO: Error handling
});
client.on('message', function (topic, message) {
print('TOPIC: ' + topic + ' MESSAGE: ' + message);
//TODO: Message handling
});
client.on('close', function () {
print("DISCONNECTED");
});
client.on('connect', function () {
print('CONNECTED');
client.subscribe(sub_topic, { qos: 1 }, function (err) {
if (err.code > 0) {
print('MQTT SUBSCRIBE ERROR', err.code);
//TODO: Error handling
}
});
});
};
registerEventHandlers();
setInterval(function () {
if (client.canPublish()) {
var body = 'Hello from NEQTO Device';
client.publish(pub_topic, body, { qos: 1 }, function (err) {
if (err.code == 0) {
print('Publish OK');
} else {
print('Publish failed');
//TODO: Error handling
}
});
} else {
print('Cannot publish');
}
}, 15000);
Sample 3
This is a sample to publish and subscribe using the client returned from the mqtt_niagara
function, with manual reconnection. If the reconnects fail consecutively, the instance is released and recreated.
/*
<INSERT ABOVE SNIPPET HERE WITH SET CONFIGURATIONS>
*/
//=================================================================
log.setLevel(-1); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
//=================================================================
// MAIN SCENARIO
//=================================================================
var sub_topic = 'niagara/test/sub';
var pub_topic = 'niagara/test/pub';
var client = mqtt_niagara({
"username": USERNAME, // MANDATORY
"password": PASSWORD // MANDATORY
});
if (!client) {
throw 'Failed to create mqtt instance';
}
var registerEventHandlers = function () {
var reconnectAttempts = 0;
var maxReconnectAttempts = 24;
if (!client) {
return;
}
client.on('error', function (err) {
print('ERROR: ' + err.code + ' ERRNO: ' + client.get('errnoConnect'));
if (err.code == 1) { //Connection failed
if (reconnectAttempts++ < maxReconnectAttempts) {
print('reconnectAttempts:', reconnectAttempts);
client.reconnect();
} else {
print('ABORT');
reconnectAttempts = 0;
client.end(); //Release mqtt instance
client = undefined;
}
}
});
client.on('message', function (topic, message) {
print('TOPIC: ' + topic + ' MESSAGE: ' + message);
//TODO: Message handling
});
client.on('close', function () {
print("DISCONNECTED");
client.reconnect();
});
client.on('connect', function () {
reconnectAttempts = 0;
print("CONNECTED");
client.subscribe(sub_topic, { qos: 1 }, function (err) {
if (err.code > 0) {
print("MQTT SUBSCRIBE ERROR", err.code);
//TODO: Error handling
}
});
});
};
registerEventHandlers();
setInterval(function () {
if (!client) {
print('Recreating MQTT Instance');
client = mqtt_niagara({
"username": USERNAME, // MANDATORY
"password": PASSWORD // MANDATORY
});
registerEventHandlers();
}
if (client) {
if (client.canPublish()) {
var body = 'Hello from NEQTO Device';
client.publish(pub_topic, body, { qos: 1 }, function (err) {
if (err.code == 0) {
print('Publish OK');
} else {
print('Publish Failed');
//TODO: Error handling
}
});
}
} else {
print('Cannot Publish');
}
}, 15000);