CubeCell-Arduino icon indicating copy to clipboard operation
CubeCell-Arduino copied to clipboard

Timereq cause multiple join if uplinkmode set to UNCONFIRMED

Open SebDominguez opened this issue 3 years ago • 2 comments

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
Capture d’écran 2022-06-22 à 21 06 09

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
Capture d’écran 2022-06-22 à 21 07 51

SebDominguez avatar Jun 22 '22 19:06 SebDominguez

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);
}

SebDominguez avatar Jul 06 '22 15:07 SebDominguez

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.

Image

But surprisingly sometimes I have :

Image

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

SebDominguez avatar Apr 02 '25 18:04 SebDominguez