|
|
var express = require('express'); |
|
|
var router = express.Router(); |
|
|
var redis = require('redis'); |
|
|
var mqtt = require('mqtt'); |
|
|
var mysql = require('mysql'); |
|
|
var fs = require('fs'); |
|
|
|
|
|
/* mqtt start */ |
|
|
var mqtt_client = mqtt.connect('mqtts://mqtt.yimian.xyz:30032'); |
|
|
mqtt_client.on('connect', function () { |
|
|
//client.subscribe('qos/sync'); |
|
|
console.log('Mqtt Connected!'); |
|
|
}) |
|
|
|
|
|
mqtt_client.on('error', function(err){ |
|
|
console.log(err); |
|
|
}); |
|
|
|
|
|
/* redis start */ |
|
|
var rc = redis.createClient(); |
|
|
|
|
|
|
|
|
/* mysql start */ |
|
|
var sqlCnt = mysql.createConnection({ |
|
|
host : "192.168.0.90", |
|
|
user : "smartfarm", |
|
|
password : fs.readFileSync("/home/yimian/conf/dbKeys/smartfarm.db.key").toString().replace(/\s+/g,""), |
|
|
port: 3306, |
|
|
database: "smartfarm", |
|
|
dateStrings:true, |
|
|
}); |
|
|
sqlCnt.connect(); |
|
|
|
|
|
var o = { |
|
|
code: 500, |
|
|
msg: "Unknown error!!", |
|
|
data: [], |
|
|
} |
|
|
|
|
|
|
|
|
/* GET home page. */ |
|
|
router.get('/get', function(req, res, next) { |
|
|
//res.render('index', { title: 'Express' }); |
|
|
res.header("Access-Control-Allow-Origin", "*"); |
|
|
if(req.query.type != undefined) req.query.type = req.query.type.toLowerCase(); |
|
|
|
|
|
if(req.query.type == 'station' || req.query.type == 'node'|| req.query.type == 'watersys'){ |
|
|
|
|
|
if(req.query.num == undefined && (req.query.timestart == undefined || req.query.timeend == undefined)){ |
|
|
req.query.num = 1; |
|
|
} |
|
|
|
|
|
|
|
|
if(req.query.num != undefined){ |
|
|
getLastData(req.query.type, req.query.num, o, res, req.query.sid); |
|
|
return; |
|
|
} |
|
|
|
|
|
getDataByDatetime(req.query.type, req.query.timestart, req.query.timeend, o, res, req.query.sid) |
|
|
return; |
|
|
} |
|
|
|
|
|
if(!req.query.type){ |
|
|
o.msg = "No type was specified!!"; |
|
|
res.send(o); |
|
|
return; |
|
|
} |
|
|
|
|
|
res.send(o); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
/* GET home page. */ |
|
|
router.get('/set', function(req, res, next) { |
|
|
//res.render('index', { title: 'Express' }); |
|
|
res.header("Access-Control-Allow-Origin", "*"); |
|
|
delete o.data; |
|
|
if(req.query.type == undefined && (req.query.status == 1 || req.query.status == 0)){ |
|
|
if(req.query.sid == 0 || req.query.sid == 1){ |
|
|
mqtt_client.publish('ctl/node'+req.query.sid +'/waterSwitch', req.query.status.toString(), function(e){ |
|
|
if(!e) { |
|
|
o.code = 200; |
|
|
o.msg = "Command published successfully!!"; |
|
|
setTimeout(()=>{ |
|
|
refresh(req.query.sid+1); |
|
|
}, 2000); |
|
|
}else{ |
|
|
o.code = 402; |
|
|
o.msg = e; |
|
|
} |
|
|
res.send(o); |
|
|
ctlLog(o.code, 'node'+req.query.sid+'/waterSwitch', req.query.status.toString(), o.msg); |
|
|
}); |
|
|
return; |
|
|
} |
|
|
if(req.query.pid == 0 || req.query.pid == 1){ |
|
|
mqtt_client.publish('ctl/waterSys/pump'+req.query.pid, req.query.status.toString(), function(e){ |
|
|
if(!e) { |
|
|
o.code = 200; |
|
|
o.msg = "Command published successfully!!"; |
|
|
setTimeout(()=>{refresh(3)}, 2000); |
|
|
}else{ |
|
|
o.code = 402; |
|
|
o.msg = e; |
|
|
} |
|
|
res.send(o); |
|
|
ctlLog(o.code, 'waterSys/pump'+req.query.pid, req.query.status.toString(), o.msg); |
|
|
}); |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
if(req.query.type == 'node' || req.query.type == 'waterSys' || req.query.type == 'station' && req.query.status != undefined && req.query.status >= 0 && req.query.status <= 255){ |
|
|
|
|
|
if(req.query.type == 'node' && !(req.query.sid >= 0 && req.query.sid <=1)){ |
|
|
o.msg = "Require legal sid!!!"; |
|
|
res.send(o); |
|
|
reset(); |
|
|
return; |
|
|
}else if(req.query.type == 'node'){ |
|
|
req.query.type = 'node'+req.query.sid; |
|
|
} |
|
|
|
|
|
mqtt_client.publish('ctl/'+req.query.type+'/status', req.query.status.toString(), function(e){ |
|
|
if(!e) { |
|
|
o.code = 200; |
|
|
o.msg = "Command published successfully!!"; |
|
|
}else{ |
|
|
o.code = 402; |
|
|
o.msg = e; |
|
|
} |
|
|
res.send(o); |
|
|
ctlLog(o.code, req.query.type+'/status', req.query.status.toString(), o.msg); |
|
|
}); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
res.send(o); |
|
|
reset(); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* GET home page. */ |
|
|
router.get('/refresh', function(req, res, next) { |
|
|
//res.render('index', { title: 'Express' }); |
|
|
res.header("Access-Control-Allow-Origin", "*"); |
|
|
|
|
|
if(req.query.t == 'station') refresh(0); |
|
|
if(req.query.t == 'node0') refresh(1); |
|
|
if(req.query.t == 'node1') refresh(2); |
|
|
if(req.query.t == 'waterSys') refresh(3); |
|
|
|
|
|
if(req.query.type != undefined) req.query.type = req.query.type.toLowerCase(); |
|
|
|
|
|
if(req.query.type == 'station' || req.query.type == 'node'|| req.query.type == 'watersys'){ |
|
|
|
|
|
if(req.query.num == undefined && (req.query.timestart == undefined || req.query.timeend == undefined)){ |
|
|
req.query.num = 1; |
|
|
} |
|
|
|
|
|
|
|
|
if(req.query.num != undefined){ |
|
|
getLastData(req.query.type, req.query.num, o, res, req.query.sid); |
|
|
return; |
|
|
} |
|
|
|
|
|
getDataByDatetime(req.query.type, req.query.timestart, req.query.timeend, o, res, req.query.sid) |
|
|
return; |
|
|
} |
|
|
|
|
|
res.send(o); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getLastData(table, num, o, res, id){ |
|
|
var sql = "SELECT * FROM " + table + ((id!=undefined)?(" where id = " + id + " "):(" ")) + "order by timestamp DESC limit " + num; |
|
|
sqlCnt.query(sql, function(err, dbdata){ |
|
|
if(err){ |
|
|
o.code = 505; |
|
|
o.msg = err; |
|
|
}else{ |
|
|
if(dbdata.length){ |
|
|
o.data = dbdata; |
|
|
o.code = 200; |
|
|
o.msg = "Found " + dbdata.length + " items!!"; |
|
|
for(i in o.data){ |
|
|
o.data[i].timestamp = (new Date(o.data[i].timestamp)).valueOf()/1000 + 8 * 3600; |
|
|
o.data[i].datetime = timestampToTime(o.data[i].timestamp * 1000); |
|
|
} |
|
|
}else{ |
|
|
o.code = 404; |
|
|
o.msg = "Found 0 items!! Please check your params!!"; |
|
|
} |
|
|
} |
|
|
res.send(o); |
|
|
reset(); |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
function getDataByDatetime(table, datetime1, datatime2, o, res, id){ |
|
|
var sql = "SELECT * FROM " + table + " where timestamp between FROM_UNIXTIME(" + datetime1 + ") and FROM_UNIXTIME(" + datatime2 + ")" + ((id!=undefined)?(" AND id = " + id):("")); |
|
|
sqlCnt.query(sql, function(err, dbdata){ |
|
|
if(err){ |
|
|
o.code = 505; |
|
|
o.msg = err; |
|
|
}else{ |
|
|
if(dbdata.length){ |
|
|
o.data = dbdata; |
|
|
o.code = 200; |
|
|
o.msg = "Found " + dbdata.length + " items!!"; |
|
|
for(i in o.data){ |
|
|
o.data[i].timestamp = (new Date(o.data[i].timestamp)).valueOf()/1000 + 8 * 3600; |
|
|
o.data[i].datetime = timestampToTime(o.data[i].timestamp * 1000); |
|
|
} |
|
|
}else{ |
|
|
o.code = 404; |
|
|
o.msg = "Found 0 items!! Please check your params!!"; |
|
|
} |
|
|
} |
|
|
res.send(o); |
|
|
reset(); |
|
|
}); |
|
|
} |
|
|
|
|
|
function ctlLog(status, target, cmd, msg){ |
|
|
|
|
|
var addSql = 'INSERT INTO ctl_history(timestamp,status,target,cmd,msg) VALUES(?,?,?,?,?)'; |
|
|
var addSqlParams = [(new Date()).toISOString().slice(0, 19).replace('T', ' '), status, target, cmd, msg]; |
|
|
sqlCnt.query(addSql,addSqlParams,function (err, result) { |
|
|
reset(); |
|
|
if(err){ |
|
|
console.log('[INSERT ERROR] - ',err.message); |
|
|
return; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
function reset(){ |
|
|
o = { |
|
|
code: 500, |
|
|
msg: "Unknown error!!", |
|
|
data: [], |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function refresh(base){ |
|
|
var key = base*100+ Math.floor(Math.random()*100); |
|
|
rc.set('sf/sync/'+key, (new Date()).valueOf()); |
|
|
mqtt_client.publish('qos/sync', key.toString()); |
|
|
o.code = 220; |
|
|
o.msg = "Refresh command published successfully!!"; |
|
|
} |
|
|
|
|
|
function timestampToTime(timestamp) { |
|
|
var date = new Date(timestamp); |
|
|
var Y = date.getFullYear() + '-'; |
|
|
var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'; |
|
|
var D = date.getDate() + ' '; |
|
|
var h = date.getHours() + ':'; |
|
|
var m = date.getMinutes() + ':'; |
|
|
var s = date.getSeconds(); |
|
|
return Y+M+((D.length==2)?'0':'')+D+((h.length==2)?'0':'')+h+((m.length==2)?'0':'')+m+((s<10)?'0':'')+s; |
|
|
} |
|
|
|
|
|
|
|
|
module.exports = router;
|
|
|
|