I want to follow up on this because I have discovered that there still is a problem most likely. And back then, the solution was probably not to correct the keys as I thought.
The problem has meanwhile also been described here.
The problem is that my device (due to some testing I’m doing it’s on purpose) is continuously sending join requests. The problem I can describe better now:
When I start the device and it makes n join requests, I get n responses. When I restart the device, I only get responses from the n + 1 the join request. I have not dug deep yet to find out what is actually the difference in the requests. All I know is that it’s not the frame counter because it’s not incremented for join requests.
The only cure that I can reproducibly apply is to delete and re-create the device or use a newly created device.
It would be really helpful if someone from the TTN would comment on this.
Is your node using unique nonces for the OTAA requests? Any OTAA request with a duplicate nonce will be ignored as per spec.
If there is a pseudo random generator in the device chances are the random nonces are in fact not random and always use the same sequence.
Thanks for your answers first of all. But no, I never saw the message “Activation DevNonce not valid: already used”. As you can see in the screenshot, I can see only join requests and that’s it. That alone I consider sub-optimal and should be enhanced so that you can see the reason. And there must be a reason because otherwise the backend would send a join response. The only reason I can imaging is that the backend selects another GW through which it sends the join response but then, why would it, if it receives the join requests through that GW. Also as far as I can see, I have no other GW in my area.
Well, the error message would be in the Join Request, as TTN is not going to create a Join Accept if it reports that error. Did you click the Join Request to expand it, to see its details?
@kersing Yea, the join requests goes through the GW I’m looking at, I’m usually looking at the traffic view of the GW (also checked the device itself). @arjanvanb I cannot see any error when I open any of the many join requests I have inspected.
No, I did not try that, but if it’s a workaround, is there a known issue?
Did you open them at gateway level? Then there won’t be any error related to the node. Only on application level that kind of information is available.
While debugging it helps to have both gateway and application/node traffic/data tabs open.
Yes, it is an issue in the LoRaWAN spec < 1.1. It is mentioned in the previous messages which you dismissed as not being the cause of your issues.
Can you show a screen shot of the application/node data join entries expanded for failing join requests and the first one that works?
The changing dev addr values indicate the back-end accepts the join request and assigns a new address. Is there one or are there two gateways listed in the metadata?
Right, good catch, didn’t notice that. I checked although I was sure and no, there is only one GW and no error (my own one). And this is exactly the behaviour where we have no explanation for.
Ok, I can confirm that if I change the App Key of the device via ttnctl, it seems to reset something (probably the nonces as you propose) and I get join responses again. But, then I should get a proper error message in the console which I don’t, so this smells like a bug to me.
I’ve the same problem with my node (ATxmega32E5 with a RFM95W module).
There are only ‘activation’ messages in my console visible, despite I get a proper joined message in the callback.
I already tried the following things:
Compared the differences between the lmic.c and oslmic.c from this library (Matthijs Kooijman) with the lmic.c of the original library from IBM and applied the changes/improvements (?) from Matthijs.
Added LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100); after LMIC_reset();
Therefore the changes in lmic.c from Matthijs Kooijman where necessary.
Changed setDrJoin(DRCHG_SET, DR_SF7);
to setDrJoin(DRCHG_SET, DR_SF9);
and I also tried setDrJoin(DRCHG_SET, DR_SF12);
on lines 686 and 879 of lmic.c
Screenshot console:
I hope someone has another suggestion, because I’m out of ideas right now.
Thanks in advance .
Finally found a solution for the described problem in my previous post. It was definitely a timing issue.
I decided to use an external clock (16 MHz, crystal) instead of the built in oscillator of my microcontroller.
After changing the clock input I had to change the timer prescaler settings of course.
LMIC requires ticks to be 15.5μs - 100 μs long, in my current setup a tick is 32 μs.
Now it’s running fine. After this successful observation I changed the prescaler settings of my built in oscillator to run on 16 MHz instead of 32 MHz and it’s still running fine .
I set up a new Lorix Gateway today and have 3 devices that I am trying to use with it but I only see join requests from all of the devices… These are tabs.io devices and I thought that they would register and then work with the app from their vendor but for some reason they are not being registered or anything. What am I missing here? I feel like it’s likely something dumb but I can’t seem to figure it out.
Thanks so much for the help Borroz! It really helps to have someone active in a community like yourself. Sorry for the possibly dumb questions but I think I may have totally misunderstood what TTN and Lora was about. So we also were trying this with another type of device (also off the shelf) but I thought that since we have a Lorawan gateway set up and these devices communicate over the Lora network that that would be enough…
If I understand you correctly though, it seems like the Lora gateways communicate with some backend (like TTN) and to use something like TTN, we will need to have devices that we can set up with specific codes for our applications withing the TTN. In other words, for an off the shelf product to work, it needs to connect to not just any lora gateway but rather ones that are set up for a specific backend and for any other “off the shelf” products to be used by an application that we have built in TTN, we have to reprogram them to have the appropriate keys.
Lastly just to be sure, if I reprogram these devices to connect to my application in TTN, they will only be able to connect to a gateway that is also set up to communicate with the TTN and that other gateway or my own will be able to send the payloads etc to my application?
if you can set the (3) keys on these devices (see manual) then yes, all gateways on the TTN network can receive these devices and forward their data to your application.