作者:z494627 | 更新时间:2016-05-16 | 浏览量:2396
如果多个设备每个设备传递一个数据接口的数据,并且发送到贝壳物联同一个设备,需要一个网关来处理.因为平台不允许一个设备由多个物理设备登录.
使用方式:
1.运行环境;nodeJs 4.4.4
2.某一个设备Checkin一下就OK,不需要多次checkin,转发器会自己每个40秒发送一次checkin,保持登录状态.
3.转发器会将所有设备的数据组合起来,定时(5秒)发送一次,防止多个设备发送冲突(两次数据小于3秒会被平台忽略)
4.目前暂无断线重启的功能.
var net=require("net") var sockets=[] var bigiot={} var AppID="AppID" var APPKey="APPKey" var cmdCheckin='{"M":"checkin","ID":"'+AppID+'","K":"'+APPKey+'"}\n'; //创建一个Client与贝壳物联平台通信 var client=net.createConnection(8181,'www.bigiot.net',function(){ //连通后CheckIn console.log('client Connect'); //创建Server与设备通信 var server=net.createServer(); server.on('connection',function(socket){ //连接后发送贝壳的欢迎信息 console.log('\033[96mnew connection \033[39m'); socket.write('{"M":"WELCOME TO BIGIOT"}\n'); sockets.push(socket); //接收到数据接口更新指令,转发到平台 socket.on('data',function(data){ var mydata=JSON.parse(data); //通过checkin指令确认AppID和APPKey if(mydata.M=='checkin'){ AppID=mydata.ID; APPKey=mydata.K; cmdCheckin='{"M":"checkin","ID":"'+AppID+'","K":"'+APPKey+'"}\n'; client.write(cmdCheckin); //定时5秒发送一次数据 setInterval(function(){ if(!bigiot){ console.log(JSON.stringify(bigiot)); client.write(JSON.stringify(bigiot)+'\n'); } },5000); } //接收到数据接口更新指令,组合出需要发送的数据,用于多客户端更新 //统一发送是为了防止多个设备发送相隔时间小于3秒,平台不接受 if(mydata.M=='update'){ bigiot.M=mydata.M; bigiot.ID=AppID; if(!bigiot.V){ bigiot.V={} } for(var index in mydata.V){ bigiot.V[index]=mydata.V[index]; } console.log(JSON.stringify(bigiot)); } }); }); server.on('error', function(e) { console.log(e); }); server.on('close', function() { console.log("client disconnected"); sockets.splice(sockets.indexOf(socket), 1); }); server.listen(800,function(){ console.log('\033[96m server listen on *:800\033[39m'); }); }); //收到平台指令,转发客户端 client.on('data',function(data){ console.log(data.toString('utf-8')); var commander=JSON.parse(data.toString('utf-8')); console.log("Len:"+sockets.length); //接收到操作指令,转发给可操作客户端 if(commander.M=='say'){ console.log("Recive:"+commander.C); for (var i=0; i < sockets.length; i++ ) { send_to_socket(sockets[i], data); } } }); function send_to_socket(socket, message) { if(socket.writable){ socket.write(message + '\n'); } } client.on('end',function(){ console.log('client disconnected'); }); client.on('error',function(e){ console.log(e); }); //心跳包 setInterval(function(){ client.write(cmdCheckin); },40*1000);
希望能给大家开拓一点思路.
使用方法:
安装nodejs,到https://nodejs.org/en/download/去下载与硬件对应的nodejs(4.4.4)下载后安装.
将上面代码复制后保存到BigiotMiddle.js文件;
运行node BigiotMiddle.js即可.