|
|
|
const mosca = require('mosca');
|
|
|
|
const mysql = require('mysql');
|
|
|
|
const fs = require('fs');
|
|
|
|
|
|
|
|
|
|
|
|
var g_MaxWaitTime = 10000
|
|
|
|
|
|
|
|
var settings = {
|
|
|
|
port: 30032
|
|
|
|
};
|
|
|
|
|
|
|
|
var server = new mosca.Server(settings);
|
|
|
|
|
|
|
|
var connection = mysql.createConnection({
|
|
|
|
host : 'cn.db.yimian.xyz',
|
|
|
|
user : 'smartfarm',
|
|
|
|
password : fs.readFileSync("smartfarm.db.key").toString().replace(/\s+/g,""),
|
|
|
|
port: '3306',
|
|
|
|
database: 'smartfarm'
|
|
|
|
});
|
|
|
|
|
|
|
|
connection.connect();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server.on('published', function (packet, client) {
|
|
|
|
switch (packet.topic) {
|
|
|
|
case 'res/node0/status':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('status', packet.payload.toString(), node0Cache, storeNode0Data);
|
|
|
|
break;
|
|
|
|
case 'res/node0/batteryLevel':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('batteryLevel', packet.payload.toString(), node0Cache, storeNode0Data);
|
|
|
|
break;
|
|
|
|
case 'res/node0/waterSwitch':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('waterSwitch', packet.payload.toString(), node0Cache, storeNode0Data);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'res/node0/temperature':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('temperature', packet.payload.toString(), node0Cache, storeNode0Data);
|
|
|
|
break;
|
|
|
|
case 'res/node0/humidity':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('humidity', packet.payload.toString(), node0Cache, storeNode0Data);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'res/node1/status':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('status', packet.payload.toString(), node1Cache, storeNode1Data);
|
|
|
|
break;
|
|
|
|
case 'res/node1/batteryLevel':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('batteryLevel', packet.payload.toString(), node1Cache, storeNode1Data);
|
|
|
|
break;
|
|
|
|
case 'res/node1/waterSwitch':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('waterSwitch', packet.payload.toString(), node1Cache, storeNode1Data);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'res/node1/temperature':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('temperature', packet.payload.toString(), node1Cache, storeNode1Data);
|
|
|
|
break;
|
|
|
|
case 'res/node1/humidity':
|
|
|
|
//console.log(packet.payload.toString());
|
|
|
|
pushElement('humidity', packet.payload.toString(), node1Cache, storeNode1Data);
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var node0Cache = {
|
|
|
|
status: null,
|
|
|
|
batteryLevel: null,
|
|
|
|
waterSwitch: null,
|
|
|
|
temperature: null,
|
|
|
|
humidity: null,
|
|
|
|
BeginTime: null,
|
|
|
|
EndTime: null,
|
|
|
|
}
|
|
|
|
|
|
|
|
var node1Cache = {
|
|
|
|
status: null,
|
|
|
|
batteryLevel: null,
|
|
|
|
waterSwitch: null,
|
|
|
|
temperature: null,
|
|
|
|
humidity: null,
|
|
|
|
BeginTime: null,
|
|
|
|
EndTime: null,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var pushElement = function(t, s, o, f){
|
|
|
|
if(o.BeginTime && Date.parse(new Date()) - o.BeginTime > g_MaxWaitTime) objReset(o);
|
|
|
|
|
|
|
|
if(getNumInObj(o, null) == Object.keys(o).length){
|
|
|
|
o.BeginTime = Date.parse(new Date());
|
|
|
|
}
|
|
|
|
|
|
|
|
if(o.hasOwnProperty(t)) o[t] = s;
|
|
|
|
|
|
|
|
if(getNumInObj(o, null) == 1){
|
|
|
|
o.EndTime = Date.parse(new Date());
|
|
|
|
console.log(o);
|
|
|
|
f(o);
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
var objReset = function(o){
|
|
|
|
|
|
|
|
for(i in o){
|
|
|
|
|
|
|
|
o[i] = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var getNumInObj = function(o, t){
|
|
|
|
var c = 0;
|
|
|
|
for(i in o){
|
|
|
|
|
|
|
|
if(o[i] == t) c ++;
|
|
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
var sql = 'SELECT * FROM api';
|
|
|
|
|
|
|
|
connection.query(sql,function (err, result) {
|
|
|
|
if(err){
|
|
|
|
console.log('[SELECT ERROR] - ',err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
console.log(result);
|
|
|
|
});
|
|
|
|
|
|
|
|
var storeNode0Data = (o)=>{storeNodeData(0, o)};
|
|
|
|
var storeNode1Data = (o)=>{storeNodeData(1, o)};
|
|
|
|
|
|
|
|
var storeNodeData = function(id, o){
|
|
|
|
|
|
|
|
var addSql = 'INSERT INTO node(timestamp,id,status,qos,batterylevel,waterswitch,temperature,humidity) VALUES(?,?,?,?,?,?,?,?)';
|
|
|
|
var addSqlParams = [new Date(o.BeginTime).toISOString().slice(0, 19).replace('T', ' '), id, o.status, 1, o.batteryLevel, o.waterSwitch, o.temperature, o.humidity];
|
|
|
|
|
|
|
|
connection.query(addSql,addSqlParams,function (err, result) {
|
|
|
|
objReset(o);
|
|
|
|
if(err){
|
|
|
|
console.log('[INSERT ERROR] - ',err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|