UNPKG

node-red-contrib-thinkp-sofia2

Version:

A Node-RED node to interact with Indra's Sofia2 IoT platform.

231 lines (211 loc) 7.15 kB
module.exports = function(RED) { var ssapMessageGenerator = require('../lib/SSAPMessageGenerator'); var sofia2Config = require('../sofia2-connection-config/sofia2-connection-config'); var ssapResourceGenerator = require('../lib/SSAPResourceGenerator'); //var http = require('http'); //var https = require('https'); var http = null; var isHttps = false; function Query(n) { RED.nodes.createNode(this,n); var node = this; this.ontology = n.ontology; this.query = n.query; this.queryType = n.queryType; // Retrieve the server (config) node var server = RED.nodes.getNode(n.server); this.on('input', function(msg) { var ontologia=""; var queryType=""; var query=""; if(this.ontology==""){ ontologia = msg.ontology; }else{ ontologia=this.ontology; } if(this.queryType==""){ queryType = msg.queryType; }else{ queryType=this.queryType; } if(this.query==""){ query = msg.query; }else{ query=this.query; } 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 query = ssapMessageGenerator.generateQueryWithQueryTypeMessage(query, ontologia,queryType,null,server.sessionKey); console.log("Using query:"+query); var state = server.sendToSib(query); 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 sendind the query SSAP message by:"+body.error); msg.payload=body.error; if(body.errorCode == "AUTENTICATION"){ console.log("Error: The sessionKey is not valid. Generating new Session...."); server.generateSession(); } node.send(msg); } }); }else if(protocol.toUpperCase() == "REST".toUpperCase()){ query = query.replace(/ /g, "+"); console.log("Query:"+query); var instance = server.kp + ':' + server.instance; console.log("Instance:"+instance); var endpoint = server.endpoint; console.log("Endpoint:"+endpoint); var arr = endpoint.toString().split(":"); var host; var port = 80; 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{ console.log("Using Host:"+arr[0]); host = arr[0]; if(arr.length>1){ port = parseInt(arr[arr.length-1]); } } var postheaders = { 'Accept' : 'application/json' }; var pathUrl = "/sib/services/api_ssap/v01/SSAPResource?$sessionKey=" + server.sessionKey + "&$query="+ query + "&$queryType="+ queryType; console.log("Path URL:"+pathUrl); var options = { host: host, port: port, path: pathUrl, method: 'GET', headers: postheaders, rejectUnauthorized: false }; // do the GET call var result=''; if (isHttps) http= require('https'); else http = require('http'); var req = http.request(options, function(res) { console.log("Status code of the query call: ", res.statusCode); if( res.statusCode==400 || res.statusCode==401){ console.log("Not SessionKey. Doing JOIN"); 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: '/sib/services/api_ssap/v01/SSAPResource/', method: 'POST', headers: postheadersJoin, rejectUnauthorized: false }; // do the JOIN POST call var resultJoin=''; var reqPost = http.request(optionsJoin, function(res) { console.log("Status code of the Join call: ", res.statusCode); res.on('data', function(d) { resultJoin +=d; }); res.on('end', function() { resultJoin = JSON.parse(resultJoin); server.sessionKey=resultJoin.sessionKey; console.log("SessionKey obtained: " + server.sessionKey); var postheaders = { 'Content-Type' : 'application/json', 'Accept' : 'application/json' }; var pathUrl = "/sib/services/api_ssap/v01/SSAPResource?$sessionKey=" + server.sessionKey + "&$query="+ query + "&$queryType="+ queryType; console.log("URL invocación:" + host+":"+pathUrl); var options = { host: host, port: port, path: pathUrl, method: 'GET', headers: postheaders, rejectUnauthorized: false }; // do the GET call var result=''; var req = http.request(options, function(res) { console.log("Status code of the query call: ", res.statusCode); res.on('data', function(d) { result +=d; }); res.on('end', function() { try { result = JSON.parse(result); } catch (err) { console.log("Error JSON.parse:"+err); node.error("Error JSON.parse:"+err); } msg.payload=result; node.send(msg); }); }); req.end(); req.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); node.error("There was an error inserting the data: ", err); }); }else if(res.statusCode==200){ res.on('data', function(d) { result +=d; }); res.on('end', function() { result = JSON.parse(result); msg.payload=result; node.send(msg); }); } }); req.end(); req.on('error', function(err) { console.log("Error:"+err); node.error("Error:"+err); }); console.log("Output:"+result); } } else { console.log("Error:"+err); node.error("Error:"+err); } }); } RED.nodes.registerType("sofia2-query",Query); }