Timereq cause multiple join if uplinkmode set to UNCONFIRMED
I don't know if this is by design or a bug, but if I try to use timereq while setting my uplinkmode to UNCONFIRMED first of dev_time_updated() is never triggered (but I successfully get the current time) and the second thing (more annoying) is that the CubeCell is sending infinite joins...
UNCONFIRMED
LoRaWAN EU868 Class A start!
joining...TX on freq 868300000 Hz at DR 5
TX on freq 868300000 Hz at DR 5
Event : Tx Done
RX on freq 868300000 Hz at DR 5
Event : Rx Done
joined
Unix time:6.38
This uplink added time req.
unconfirmed uplink sending ...
TX on freq 867100000 Hz at DR 5
TX on freq 867100000 Hz at DR 5
Event : Tx Done
RX on freq 867100000 Hz at DR 5
Event : Rx Done
TX on freq 868300000 Hz at DR 5
received unconfirmed downlink: rssi = -104, snr = 7, datarate = 5
TX on freq 868300000 Hz at DR 5
Event : Tx Done
RX on freq 868300000 Hz at DR 5
Event : Rx Done
TX on freq 868500000 Hz at DR 5
TX on freq 868500000 Hz at DR 5
Event : Tx Done
RX on freq 868500000 Hz at DR 5
Event : Rx Done
TX on freq 868500000 Hz at DR 5
TX on freq 868500000 Hz at DR 5
Event : Tx Done
RX on freq 868500000 Hz at DR 5
Event : Rx Done
TX on freq 868300000 Hz at DR 5
CONFIRMED
LoRaWAN EU868 Class A start!
joining...TX on freq 868300000 Hz at DR 5
TX on freq 868300000 Hz at DR 5
Event : Tx Done
RX on freq 868300000 Hz at DR 5
Event : Rx Done
joined
Unix time:6.38
This uplink added time req.
confirmed uplink sending ...
TX on freq 867900000 Hz at DR 5
TX on freq 867900000 Hz at DR 5
Event : Tx Done
RX on freq 867900000 Hz at DR 5
Event : Rx Done
Once device time updated, this function run
received unconfirmed downlink: rssi = -108, snr = 4, datarate = 5
Ok so the solution is to isTxConfirmed = true; just before sending the payload and then set it to isTxConfirmed = false; inside the dev_time_updatedcallback
inside your loop you need to:
if (timeReq) {
isTxConfirmed = true;
timeReq = false;
MlmeReq_t mlmeReq;
mlmeReq.Type = MLME_DEVICE_TIME;
LoRaMacMlmeRequest(&mlmeReq);
}
and then the callback should look like this:
void dev_time_updated() {
isTxConfirmed = false;
led.colorDelay(magenta, 500);
sysTimeCurrent = TimerGetSysTime();
setTime((time_t)sysTimeCurrent.Seconds);
}
here we go again. Now, the issue is occurring for both confirmed and unconfirmed uplink modes. Sometimes it works, but other times it causes my device to enter a join loop, ignoring the appTxDutyCycle setting."
20:24:09.669 > LoRaWAN EU868 Class A start!
20:24:09.672 >
20:24:09.801 > joining...TX on freq 868500000 Hz at DR 4
20:24:09.835 > TX on freq 868500000 Hz at DR 4
20:24:09.955 > Event : Tx Done
20:24:14.937 > RX on freq 868500000 Hz at DR 4
20:24:15.090 > Event : Rx Done
20:24:15.607 > joined
20:24:15.608 > Sending...
20:24:15.609 > ready to send MOTE_MAC_DEVICE_TIME_REQ
20:24:15.613 > This uplink added time req.
20:24:15.615 > Prepare TxFrame
20:24:15.617 > confirmed uplink sending ...
20:24:15.626 > Done sending...
20:24:21.248 > TX on freq 868500000 Hz at DR 5
20:24:21.269 > TX on freq 868500000 Hz at DR 5
20:24:21.337 > Event : Tx Done
20:24:26.317 > RX on freq 868500000 Hz at DR 5
20:24:26.410 > Event : Rx Done
20:24:27.480 > TX on freq 868500000 Hz at DR 5
20:24:27.501 > TX on freq 868500000 Hz at DR 5
20:24:27.569 > Event : Tx Done
20:24:32.550 > RX on freq 868500000 Hz at DR 5
20:24:32.642 > Event : Rx Done
20:24:33.712 > TX on freq 868500000 Hz at DR 5
20:24:33.733 > TX on freq 868500000 Hz at DR 5
20:24:33.801 > Event : Tx Done
20:24:38.781 > RX on freq 868500000 Hz at DR 5
20:24:38.874 > Event : Rx Done
20:24:39.944 > TX on freq 868300000 Hz at DR 5
20:24:39.964 > TX on freq 868300000 Hz at DR 5
20:24:40.033 > Event : Tx Done
20:24:45.013 > RX on freq 868300000 Hz at DR 5
20:24:45.106 > Event : Rx Done
20:24:46.175 > TX on freq 868300000 Hz at DR 5
20:24:46.196 > TX on freq 868300000 Hz at DR 5
20:24:46.265 > Event : Tx Done
20:24:51.244 > RX on freq 868300000 Hz at DR 5
20:24:51.337 > Event : Rx Done
20:24:52.406 > TX on freq 868100000 Hz at DR 5
20:24:52.426 > TX on freq 868100000 Hz at DR 5
20:24:52.495 > Event : Tx Done
20:24:57.475 > RX on freq 868100000 Hz at DR 5
20:24:57.568 > Event : Rx Done
20:24:58.637 > TX on freq 868500000 Hz at DR 4
20:24:58.666 > TX on freq 868500000 Hz at DR 4
20:24:58.786 > Event : Tx Done
20:25:03.768 > RX on freq 868500000 Hz at DR 4
20:25:03.921 > Event : Rx Done
20:25:10.077 > TX on freq 868500000 Hz at DR 5
20:25:10.097 > TX on freq 868500000 Hz at DR 5
20:25:10.165 > Event : Tx Done
20:25:15.145 > RX on freq 868500000 Hz at DR 5
20:25:15.238 > Event : Rx Done
20:25:16.308 > TX on freq 868300000 Hz at DR 5
20:25:16.329 > TX on freq 868300000 Hz at DR 5
20:25:16.397 > Event : Tx Done
20:25:21.377 > RX on freq 868300000 Hz at DR 5
20:25:21.470 > Event : Rx Done
20:25:22.541 > TX on freq 868100000 Hz at DR 5
20:25:22.561 > TX on freq 868100000 Hz at DR 5
20:25:22.630 > Event : Tx Done
20:25:27.610 > RX on freq 868100000 Hz at DR 5
20:25:27.703 > Event : Rx Done
20:25:28.772 > TX on freq 868300000 Hz at DR 5
20:25:28.793 > TX on freq 868300000 Hz at DR 5
20:25:28.861 > Event : Tx Done
20:25:33.842 > RX on freq 868300000 Hz at DR 5
20:25:33.935 > Event : Rx Done
20:25:35.004 > TX on freq 868300000 Hz at DR 5
20:25:35.025 > TX on freq 868300000 Hz at DR 5
20:25:35.093 > Event : Tx Done
20:25:40.074 > RX on freq 868300000 Hz at DR 5
20:25:40.166 > Event : Rx Done
20:25:41.236 > TX on freq 868100000 Hz at DR 5
20:25:41.257 > TX on freq 868100000 Hz at DR 5
20:25:41.325 > Event : Tx Done
20:25:46.304 > RX on freq 868100000 Hz at DR 5
20:25:46.398 > Event : Rx Done
20:25:47.467 > TX on freq 868500000 Hz at DR 5
20:25:47.487 > TX on freq 868500000 Hz at DR 5
20:25:47.556 > Event : Tx Done
20:25:52.536 > RX on freq 868500000 Hz at DR 5
20:25:52.628 > Event : Rx Done
20:25:53.697 > TX on freq 868300000 Hz at DR 3
20:25:53.745 > TX on freq 868300000 Hz at DR 3
20:25:53.957 > Event : Tx Done
20:25:58.942 > RX on freq 868300000 Hz at DR 3
20:25:59.207 > Event : Rx Done
20:26:14.357 > TX on freq 868300000 Hz at DR 5
20:26:14.378 > TX on freq 868300000 Hz at DR 5
20:26:14.446 > Event : Tx Done
20:26:19.427 > RX on freq 868300000 Hz at DR 5
20:26:19.519 > Event : Rx Done
20:26:20.590 > TX on freq 868500000 Hz at DR 5
20:26:20.610 > TX on freq 868500000 Hz at DR 5
20:26:20.678 > Event : Tx Done
20:26:25.658 > RX on freq 868500000 Hz at DR 5
20:26:25.751 > Event : Rx Done
20:26:26.820 > TX on freq 868500000 Hz at DR 5
20:26:26.840 > TX on freq 868500000 Hz at DR 5
20:26:26.909 > Event : Tx Done
appTxDutyCycle is set to 30000 but requesting but LoRaMacMlmeRequest( &mlmeReq ); put my device into a crazy state and never cycle.
But surprisingly sometimes I have :
this is my loop:
void loop() {
switch( deviceState ) {
case DEVICE_STATE_INIT:
printDevParam();
LoRaWAN.init(loraWanClass,loraWanRegion);
deviceState = DEVICE_STATE_JOIN;
// This is a runtime API that is in the Heltec github
// but has not yet made it to the Arduino install
// version. (1.0.0) It's here for future reference
// LoRaWAN.setDataRateForNoADR(DR_3);
break;
case DEVICE_STATE_JOIN:
LoRaWAN.join();
break;
case DEVICE_STATE_SEND: {
Serial.println("Sending...");
if (loraWanAdr == true)
{
Serial.println(">>>> WARNING: ADR is enabled.\n\tThis may reduce the datarate/Spreading Factor after about 100 uplinks");
}
if (timeReq) {
MlmeReq_t mlmeReq;
mlmeReq.Type = MLME_DEVICE_TIME;
LoRaMacMlmeRequest( &mlmeReq );
Serial.println("This uplink added time req.");
}
prepareTxFrame( appPort );
LoRaWAN.send();
deviceState = DEVICE_STATE_CYCLE;
// the following is experimental but does seem to
// re-initialize the connection correctly. See the note
// at extern UpLinkCounter above
if (UpLinkCounter == 65534) {
// force a rejoin
deviceState = DEVICE_STATE_INIT;
}
Serial.println("Done sending...");
delay(SECONDS(2));
break;
}
case DEVICE_STATE_CYCLE:
txDutyCycleTime = appTxDutyCycle + randr( 0, APP_TX_DUTYCYCLE_RND );
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
case DEVICE_STATE_SLEEP:
LoRaWAN.sleep();
break;
case DEVICE_STATE_TEST:
break;
default:
deviceState = DEVICE_STATE_INIT;
break;
}
}
And the callback that's never called:
bool timeReq = true;
void dev_time_updated() {
timeReq = false;
printf("Once device time updated, this function run\r\n");
}
my lora config:
board_build.arduino.lorawan.region = EU868
board_build.arduino.lorawan.class = CLASS_A
board_build.arduino.lorawan.netmode = OTAA
board_build.arduino.lorawan.uplinkmode = CONFIRMED
board_build.arduino.lorawan.debug_level = FREQ_AND_DIO
board_build.arduino.lorawan.adr = OFF
board_build.arduino.lorawan.at_support = OFF
board_build.arduino.lorawan.net_reserve = OFF