I am currently playing around with a single channel gateway and chirpstack. In the future I’ll probably switch over to a full multichannel concentrator and use chirpstack-concentratord or one of the other gateway packages. But RFM96W’s is all I have on the device side right now, and it’s hard to get anything else in the current situation. And it gives me a good opportunity to understand the protocol and different libraries too.
On the device side I am using a teensy with MCCI Arduino LMIC, using ABP. As a packet forwarder I am using Congduc Pham’s LowCostLoraGw because, though it leaves a lot to be desired in terms of quality, it is the only single channel gateway that seems to have implemented downlink messages and OTAA.
I have disabled frame counter validation on the gateway, and use symmetric network and application session keys so the byte order doesn’t matter (just for testing). I am now consistently getting MIC errors
error="get device-session error: invalid MIC" for all frames except frame 0 and 4. Every time I restart the device, and reactivate it in the gateway, frames 0 and 4 have correct mics, but the rest has wrong mics. All the other frames do show up on the gateway live lorawan frames, and I see them in logs too. Just not on the device since the MIC is wrong.
So I guess my question is 2-fold:
- What could cause the MIC to be correctly calculated for frames 0 and 4, but incorrect on all others.
- How should the mic be calculated, so I can verify if Arduino LMIC and Chirpstack-networks-server calculate it the same way.
Here are 2 examples, the top one a correct LoraWAN frame with correct MIC, and the second one with incorrect MIC, from the same device