作者:z494627 | 更新時間:2016-05-16 | 瀏覽量:2004
如果多個設備每個設備傳遞一個數據接口的數據,并且發送到貝殼物聯同一個設備,需要一個網關來處理.因為平臺不允許一個設備由多個物理設備登錄.
使用方式:
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.eqytg.org',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即可.