exports.id = 'tcpserver';
exports.title = 'TCP/IP Server';
exports.version = '1.0.4';
exports.group = 'TCP/IP';
exports.color = '#888600';
exports.output = ["red", "white"];
exports.click = false;
exports.author = 'Jakub Klena';
exports.icon = 'server';
exports.options = { ip: '0.0.0.0', port: 8421, edge: "M6ogKQW09bOXewAYvZyvkn5JrV1aRnPGE37p42Nx" };
exports.html = `
`;
exports.readme = `# TCP Server
## Outputs
- *Red* - ERROR output
- *White* - Incomming message output
`;
exports.install = function(instance) {
let net = require('net');
let server = null;
let myip = "0.0.0.0";
let myport = 8421;
let myedge = "M6ogKQW09bOXewAYvZyvkn5JrV1aRnPGE37p42Nx";
let interv = null;
let ERRWEIGHT = {
EMERGENCY: "emergency", // System unusable
ALERT: "alert", // Action must be taken immidiately
CRITICAL: "critical", // Component unable to function
ERROR: "error", // Error, but component able to recover from it
WARNING: "warning", // Possibility of error, system running futher
NOTICE: "notice", // Significant message but not an error, things user might want to know about
INFO: "informational", // Info
DEBUG: "debug" // Debug - only if CONFIG.debug is enabled
}
setTimeout(function(){
if (server !== null){
if (server.listening){
instance.status("Listening", "green");
} else {
instance.status("Not listening", "red");
}
}
}, 5000);
function resetServer(){
sendError(myedge, "resetServer", ERRWEIGHT.DEBUG, "resetServer called !", {});
if (server !== null){
sendError(myedge, "resetServer", ERRWEIGHT.DEBUG, "Server already exists", {});
server.close(function(){
sendError(myedge, "resetServer", ERRWEIGHT.DEBUG, "Server closed intentionally", {});
server = null;
resetServer();
});
} else {
sendError(myedge, "resetServer", ERRWEIGHT.DEBUG, "Server doesn’t exist", {});
server = net.createServer((c) => {
sendError(myedge, "resetServer", ERRWEIGHT.INFO, "New client connected !", {"ip":c.localAddress, "port":c.localPort});
c.on("data", (d) => {
sendOutputMsg({
"ip":c.localAddress,
"port":c.localPort,
"data":d.toString()
});
});
c.on('end', () => {
sendError(myedge, "resetServer", ERRWEIGHT.INFO, "Client disconnected !", {"ip":c.localAddress, "port":c.localPort});
});
});
server.listen(myport, myip);
}
};
function isJson(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
instance.reconfigure = function() {
//code
myip = instance.options.ip;
myport = instance.options.port;
myedge = instance.options.edge;
setTimeout(resetServer, 5000);
};
instance.close = function() {
// close sockets and such
if (server !== null){
server.close(function(){});
}
};
function sendError(device, func, weight, str, extra){
let content = {
"type": weight,
"status": "new",
"source": {
"function":func,
"component":instance.id,
"component_name":instance.name
},
"message":str,
"message_data": extra
};
let error = {};
error[device] = [
{
"ts": Date.now(),
"values": {
"_event":content
}
}
];
instance.send(0, error);
}
function sendOutputMsg(str){
instance.send(1, str);
}
instance.on('options', instance.reconfigure);
instance.reconfigure();
function humanReadableTimeAndDate(){
let date_ob = new Date();
let date = ("0" + date_ob.getDate()).slice(-2);
let month = ("0" + (date_ob.getMonth() + 1)).slice(-2);
let year = date_ob.getFullYear();
let hours = ("0" + date_ob.getHours()).slice(-2);
let minutes = ("0" + date_ob.getMinutes()).slice(-2);
let seconds = ("0" + date_ob.getSeconds()).slice(-2);
return date+"."+month+"."+year+" "+hours+":"+minutes+":"+seconds;
}
};