How to "buff" json when device is not connected

At a precise interval in time ( each 15 minutes or so ), the device is sending some data to my device

function SendNewData(type,origin,data){
json <- {
"Node":Node.deviceid,
"Type":type,
"Origin":origin,
"Content":data,
"Moment":moment

}
agent.send("DATA",json);
}


so for example, I run : SendNewData("Message","Device","The beer is cold");

the function timestamp it with moment ( that have the current local time ).

Problem is when the device is not connected with the agent, lets say for the next 8 hours. where does the message goes? How can I make sure that i'll not "loose" any message

Comments

  • You can find out whether agent.send() was successful by checking the value it returns (0 on success, or 1-3 on failure), and retrying later if it failed, or taking other action so you don't lose the message, or at least are notified it has been lost.


    result = agent.send("DATA".json);
    if (result == 0) {
    // success
    } else {
    // let's try that again
    }


    See the agent.send() documentation for details on what the error codes mean.

    You might be interested in our new MessageManager library, which is free to use.


  • One action you can take to prevent data loss, if cannot send after a set number of retries, is to save your data in a nv table then retrieve it when able to send. Description of how to do this, provided here.

    NV table stores your data even if device reboots or uploads new firmware etc.
  • ok, so if I understand ( and i'm not the greatest programmer ever, sorry for that )

    As i told, i'm doing, SendNewData("Message","Device","The beer is cold");
    with
    function SendNewData(type,origin,data){
    json <- {
    "Node":Node.deviceid,
    "Type":type,
    "Origin":origin,
    "Content":data,
    "Moment":moment
    }
    agent.send("DATA",json);
    }


    When something appen ( but its not a fix interval of time ).

    now I just have to do

    function SendNewData(type,origin,data){
    json <- {
    "Node":Node.deviceid,
    "Type":type,
    "Origin":origin,
    "Content":data,
    "Moment":moment
    }
    <b>cm.onNextConnect(function() {
    agent.send("DATA", json);</b>
    }


    Instead?

    the problem from what I understand is that cm.onNextConnect will be executed by itself without SendNewData() being processed, so my json is empty ....wich is just useless
  • Turns out, cm.onNextConnect() can't receive a json, but work with a table
    function SendNewData(type,origin,data){

    local delayedmsg = "";
    if( ! cm.isConnected() ) delayedmsg = " OFFLINE ";



    local table = { };
    table["Node"] <- Node.deviceid;
    table["Type"] <- type + delayedmsg;
    table["Origin"] <- origin;
    table["Content"] <- data;
    table["Moment"] <- moment;


    cm.onNextConnect(function() {
    agent.send("DATA", table);
    });


    }
  • Does anyone know a way to know the quantity of "task" that are buffed? and know the memory depth left ?
  • The code below:

    function SendNewData(type,origin,data) {
    json <- {
    // ...
    }
    cm.onNextConnect(function() {
    agent.send("DATA", json);
    }
    }
    should work as expected. Ie. even if the callback provided to the onNextConnect is executed asynchronously, it captures the contexts that it's invoked at.

    In this case the statement:

    json <- { }
    defines a global variable. So it's shared between all the scopes (functions/classes) in your code. If you set it to null somewhere you'll get what you see.

    To avoid this effect (assuming that's the case), you could just change it slightly to:

    local json = {
    // ...
    }
    to make it local and to avoid further "race condition". Please give it a try.
Sign In or Register to comment.