2015-10-29 2 views
2

я работаю над проектом, который использует IoT Electric Imp и PubNub для связи, и Разбирает для регистрации данных, облако кода и т.д.Electric IMP + PubNub: Агент делает дополнительные звонки

По какой-то причине моего кода в IMP IDE выполняет множественные вызовы на канал PubNub, когда я хочу, чтобы событие транслировалось только один раз.

Вот код:

#require "PubNub.class.nut:1.1.0" 
#require "Parse.class.nut:1.0.1" 
// Log the URLs we need 
server.log(""); 
server.log("------------------- RESTART CYCLE ------------------") 
server.log("Agent Loaded. Agent URL: " + http.agenturl()); 

local impID = imp.configparams.deviceid; 
local reqCount = 0; 
local myResponse = []; 


// Connect to PubNub 
const publishKey = "#####################"; 
const subscribeKey = "#####################"; 
pubNub <- PubNub(publishKey, subscribeKey); 


// Subscribe to PubNub Channel 
pubNub.subscribe([impID, "iPlugComm"], function(err, result, timetoken) { 
    if (err != null) { 
     server.log(err); 
     return; 
    } 
    parseComm(result,timetoken); 
}); 

// Connect to Parse.com 
const APP_ID = "#####################"; 
const REST_API_KEY = "#####################"; 
parse <- Parse(APP_ID, REST_API_KEY); 

server.log("imp id = "+impID); 
server.log("----------------------------------------------------") 
server.log(""); 

// Process URI Requests 
function requestHandler(request, response) { 
    try { 
    // check if the user myCommand led as a query parameter 
    if ("myCommand" in request.query) { 
     local myVar = request.query.myCommand; 
     response.header("Access-Control-Allow-Origin", "*"); 
     myResponse.append(response); 
     device.send("myCommand", myVar); 
    }else{ 
     response.send(500, "Invalid Command Sent"); 
    } 
    } 
    catch (ex) { 
    response.send(500, "Invalid Command Sent: " + ex); 
    } 
} 

// Parse Incoming PubNub Message 
function parseComm(result, timetoken){ 
    local time = timetoken; 
    local idx = 1; 
    local deviceID, 
     deviceName, 
     deviceMode, 
     deviceMessage, 
     deviceAction, 
     deviceChannel; 
    foreach (channel, data in result) { 
     // logstr += ("Channel: " + channel + ": " + data["deviceName"]); 
     deviceID = data["deviceID"]; 
     deviceName = data["deviceName"]; 
     deviceMode = data["deviceMode"]; 
     deviceMessage = data["deviceMessage"]; 
     deviceAction = data["deviceAction"]; 
     deviceChannel = channel; 
     if (idx++ < result.len()) { 
      logstr += ", "; 
     } 
    } 
    server.log("COMM on channel '"+deviceChannel+"' from "+ deviceName +": "+deviceMessage+"."); 
} 

// Log Device Connection to Parse.com 
local logINIT = parse.createObject("EventLog", { 
    "deviceID" : impID, 
    "deviceType" : "Electric Imp", 
    "deviceMode" : "Slave", 
    "deviceState" : "Online", 
    "deviceName": "Agent-"+impID, 
    "deviceMessage": "Imp restarted.", 
    "deviceURL": http.agenturl() 
}) 
logINIT.save(function(err, data) { 
    if (err != null) server.log ("Could not update object: " + err.error) 
}); 

device.onconnect(function() { 
    server.log("Device CONNECTED to agent."); 
    // Publish Connection 
    pubNub.publish("iPlugComm", { 
     deviceID = impID, 
     deviceName = "Agent-"+impID, 
     deviceMode = "Slave", 
     deviceMessage = "Imp Agent Restarted", 
     deviceAction = "null", 
    }); 
}); 

device.ondisconnect(function() { 
    server.log("Device DISCONNECTED from agent"); 
    server.log("Device CONNECTED to agent."); 
    // Publish Connection 
    pubNub.publish("iPlugComm", { 
     deviceID = impID, 
     deviceName = "Agent-"+impID, 
     deviceMode = "Slave", 
     deviceMessage = "Imp Device Disconnected", 
     deviceAction = "null", 
    }); 
}); 

// register the HTTP handler 
http.onrequest(requestHandler); 

То, что я хотел бы, чтобы просто транслировать каждое соединение/событие один раз .... но, как вы можете видеть на моем server.log, я, кажется, вещание в два раза с каждой новой командой «Построить и запустить».

------------------- RESTART CYCLE ------------------ 
2015-10-29 10:31:21 UTC-3 [Agent] Agent Loaded. Agent URL: https://agent.electricimp.com/##### 
2015-10-29 10:31:21 UTC-3 [Agent] imp id = ######### 
2015-10-29 10:31:21 UTC-3 [Agent] ---------------------------------------------------- 
2015-10-29 10:31:21 UTC-3 [Agent] 
2015-10-29 10:31:21 UTC-3 [Agent] Device CONNECTED to agent. 
2015-10-29 10:31:21 UTC-3 [Agent] COMM on channel '(null : (nil))' from (null : (nil)): (null : (nil)). 
2015-10-29 10:31:22 UTC-3 [Agent] Device CONNECTED to agent. 
2015-10-29 10:31:22 UTC-3 [Agent] Published data at 14461254820532282 
2015-10-29 10:31:22 UTC-3 [Agent] COMM on channel 'iPlugComm' from Agent-237f476938a609ee: Imp Agent Restarted. 
2015-10-29 10:31:22 UTC-3 [Agent] Published data at 14461254821522215 
2015-10-29 10:31:22 UTC-3 [Agent] COMM on channel 'iPlugComm' from Agent-237f476938a609ee: Imp Agent Restarted. 
2015-10-29 10:31:22 UTC-3 [Status] Device connected 
2015-10-29 10:31:22 UTC-3 [Device] IMP Device Started 

Кто-нибудь видит, где моя ошибка? Вероятно, это глупая ошибка, поскольку я не бегаю с Белки.

+0

является * * 'device.onconnect()' ** событие срабатывает дважды? вы можете добавить оператор 'if (nil) return'. – PubNub

+0

Да, я подумал об этом и попробовал тоже ... но если вы заметили журнал, его стрельба три раза ... один раз (ноль) и дважды с данными. Если он продолжит это делать, его значительно сложно точно передать данные между устройствами. –

+1

Событие 'onconnect' будет запускаться один раз на канал. вы захотите только подтвердить первое вхождение. – PubNub

ответ

3

Игнорирование первого сообщения COMM (как это ни странно), похоже, проблема заключается в том, что событие device.onconnect срабатывает дважды. Это известная проблема с нашей стороны (это происходит только после того, как построить и запустить.)

Один способ обойти проблемы может быть установлен короткий «дребезга» таймер сортов:

local debounce = false; 
device.onconnect(function() { 
    if (debounce) return; 
    // Do stuff 
    debounce = true; 
    imp.wakeup(1, function() { 
     debounce = false; 
    }); 
}); 
Смежные вопросы