node-red-contrib-thinkp-sofia2
Version:
A Node-RED node to interact with Indra's Sofia2 IoT platform.
228 lines (206 loc) • 7.35 kB
JavaScript
module.exports = function(RED) {
var ssapMessageGenerator = require('../lib/SSAPMessageGenerator');
var kp = require('../lib/kpMQTT');
var ssapResourceGenerator = require('../lib/SSAPResourceGenerator');
var http = null;
var isHttps = false;
function Insert(n) {
RED.nodes.createNode(this,n);
var node = this;
this.ontology = n.ontology;
// Retrieve the server (config) node
var server = RED.nodes.getNode(n.server);
this.on('input', function(msg) {
var ontologia="";
var sessionKey='';
if(this.ontology==""){
ontologia = msg.ontology;
}else{
ontologia=this.ontology;
}
if (server) {
var protocol = server.protocol;
console.log("Using protocol:"+protocol);
console.log("Using ontology:"+ontologia);
if(protocol.toUpperCase() == "MQTT".toUpperCase()){
if (server.sessionKey==null || server.sessionKey=="") {
server.generateSession();
console.log("SessionKey null...Generated SessionKey:"+server.sessionKey);
}
console.log("Using SessionKey:"+server.sessionKey);
var queryInsert = ssapMessageGenerator.generateInsertMessage(msg.payload, ontologia,server.sessionKey);
console.log(queryInsert);
var state = server.sendToSib(queryInsert);
if(typeof(state)=="undefined" || state==""){
console.log("There are not response for the query send.");
}else{
state.then(function(response){
var body = JSON.parse(response.body);
console.log("Responde Body:"+response.body);
if(body.ok){
console.log("Message sent OK. Body:"+body);
msg.payload=body;
node.send(msg);
}else{
console.log("Error sending SSAP message:"+body.error);
msg.payload=body.error;
if(body.errorCode == "AUTENTICATION"){
console.log("The sessionKey is not valid.");
server.generateSession();
}
node.send(msg);
}
});
}
}else if(protocol.toUpperCase() == "REST".toUpperCase()){
var endpoint = server.endpoint;
var arr = endpoint.toString().split(":");
if (arr[0].toUpperCase()=='HTTPS'.toUpperCase()) {
isHttps=true;
console.log("Using HTTPS:"+arr[0]);
}
if(arr[0].toUpperCase()=="HTTP".toUpperCase()||arr[0].toUpperCase()=='HTTPS'.toUpperCase()){
host=arr[1].substring(2, arr[1].length);
if(arr.length>2){
port = parseInt(arr[arr.length-1]);
}
}else{
host = arr[0];
if(arr.length>1){
port = parseInt(arr[arr.length-1]);
}
}
//Se prepara el mensaje insert
var queryInsert = ssapResourceGenerator.generateInsertMessage(msg.payload, ontologia, server.sessionKey);
console.log("Query Insert:"+queryInsert);
var postheadersInsert = {
'Content-Type' : 'application/json',
'Accept' : 'application/json',
'Content-Length' : Buffer.byteLength(queryInsert, 'utf8')
};
var path = "/sib/services/api_ssap/v01/SSAPResource/";
console.log("URL invocation:"+host+":"+port+path);
var optionsInsert = {
host: host,
port: port,
path: path,
method: 'POST',
headers: postheadersInsert,
rejectUnauthorized: false
};
// do the INSERT POST call
var resultInsert='';
if (isHttps)
http= require('https');
else
http = require('http');
var reqInsert = http.request(optionsInsert, function(res) {
console.log("Status code of the Insert call: ", res.statusCode);
res.on('data', function(d) {
resultInsert +=d;
});
res.on('end', function() {
if(res.statusCode==500 ||res.statusCode==400 || res.statusCode==401){
//La sessionKey no es válida, se hace el join
//Se regenera la sessionKey con un join
var instance = server.kp + ':' + server.instance;
var queryJoin = ssapResourceGenerator.generateJoinByTokenMessage(server.kp, instance, server.token);
console.log("queryJoin: ",queryJoin);
var postheadersJoin = {
'Content-Type' : 'application/json',
'Accept' : 'application/json',
'Content-Length' : Buffer.byteLength(queryJoin, 'utf8')
};
var optionsJoin = {
host: host,
port: port,
path: path,
method: 'POST',
headers: postheadersJoin,
rejectUnauthorized: false
};
var result='';
var reqPost = http.request(optionsJoin, function(res) {
console.log("Status code of the Join call: ", res.statusCode);
res.on('data', function(d) {
result +=d;
});
res.on('end', function() {
result = JSON.parse(result);
server.sessionKey=result.sessionKey;
console.log("SessionKey obtained: " + server.sessionKey);
var queryInsert = ssapResourceGenerator.generateInsertMessage(msg.payload, ontologia, server.sessionKey);
var postheadersInsert = {
'Content-Type' : 'application/json',
'Accept' : 'application/json',
'Content-Length' : Buffer.byteLength(queryInsert, 'utf8')
};
var optionsInsert = {
host: host,
port: port,
path: '/sib/services/api_ssap/v01/SSAPResource/',
method: 'POST',
headers: postheadersInsert,
rejectUnauthorized: false
};
var resultInsert='';
var reqInsert = http.request(optionsInsert, function(res) {
console.log("Status code of the Insert call: ", res.statusCode);
res.on('data', function(d) {
resultInsert +=d;
});
res.on('end', function() {
try{
resultInsert = JSON.parse(resultInsert);
msg.payload=resultInsert;
} catch (err) {
msg.payload=resultInsert;
console.log("Error:"+err);
node.error("Error:"+err);
}
node.send(msg);
});
});
reqInsert.write(queryInsert);
reqInsert.end();
reqInsert.on('error', function(err) {
console.log("Error:"+err);
node.error("Error:"+err);
});
});
});
reqPost.write(queryJoin);
reqPost.end();
reqPost.on('error', function(err) {
console.log("There was an error inserting the data: ", err);
console.log("Error:"+err);
node.error("Error:"+err);
});
}else if(res.statusCode==200){
try{
resultInsert = JSON.parse(resultInsert);
msg.payload=resultInsert;
} catch (err) {
msg.payload=resultInsert;
console.log("Error:"+err);
node.error("Error:"+err);
}
node.send(msg);
}
});
});
reqInsert.write(queryInsert);
reqInsert.end();
reqInsert.on('error', function(err) {
console.log(err);
console.log("Error:"+err);
node.error("Error:"+err);
});
}
} else {
console.log("Error");
}
});
}
RED.nodes.registerType("sofia2-insert",Insert);
}