我正在努力实现LoRaWAN终端设备以与LoRaWAN chirpstack.io服务器通信。我正在尝试实现此功能的设备是带有SX1276无线电收发器的ST Nucleo-L476RG板。我当前使用的ST堆栈是I-CUBE-LRWAN v 1.3.1。
对于后端,我已经成功地在可与Laird RG191 8通道网关配对的RPi4上运行chirpstack.io软件(网关桥,网络服务器和应用程序服务器)。网关已定义8 125 kHz BW通道和1500 kHz通道。
在终端节点上,我很难弄清楚如何正确定义通道映射以仅利用网关正在侦听的那8个通道。
这是默认代码,它定义了所有64个通道及其频率。
// 125 kHz channels
for( uint8_t i = 0; i < US915_MAX_NB_CHANNELS - 8; i++ )
{
NvmCtx.Channels[i].Frequency = 902300000 + i * 200000;
NvmCtx.Channels[i].DrRange.Value = ( DR_3 << 4 ) | DR_0;
NvmCtx.Channels[i].Band = 0;
}
使用此代码,我可以加入OTAA并发送帧,但是加入需要很长时间,而且很少有帧能够进入应用服务器的“ Live LoRaWAN Frames”调试屏幕。我怀疑这是因为终端节点跳到网关未监听的频率。参见下面的串行通讯输出示例:
测试
0s456:PHY txDone
5s489:PHY rxTimeOut
6s525:PHY rxTimeOut
测试
60s490:PHY txDone
65s523:PHY rxTimeOut
66s559:PHY rxTimeOut
测试
120s490:PHY txDone
125s523:PHY rxTimeOut
126s559:PHY rxTimeOut
.....
测试
900s490:PHY txDone
905s523:PHY rxTimeOut
906s559:PHY rxTimeOut
测试
960s148:PHY txDone
965s166:PHY rxDone
已加入
测试
1020s118:PHY txDone
1021s139:PHY rxTimeOut
1022s186:PHY rxTimeOut
1023s225:PHY txDone
1024s247:PHY rxTimeOut
1025s293:PHY rxTimeOut
1026s773:PHY txDone
1027s794:PHY rxTimeOut
1028s841:PHY rxTimeOut
1030s791:PHY txDone
为了解决这个问题,我将代码更改为此:
for( uint8_t i = 5; i < 13; i++ )
{
NvmCtx.Channels[i].Frequency = 902300000 + i * 200000;
NvmCtx.Channels[i].DrRange.Value = ( DR_3 << 4 ) | DR_0;
NvmCtx.Channels[i].Band = 0;
}
在此,该功能仅定义5到12的通道带,这是网关正在侦听的通道带。我能够在线性调频堆栈“ Live LoRaWAN帧”和通过STLink进行的串行通信中观察到上行链路和下行链路帧。我观察到的问题之一是,最终节点最多只能发送/接收7帧,直到堆栈似乎超时或崩溃为止,并且不再在已定义的“ APP_TX_DUTYCYCLE”处发送帧。我已将此参数更改为从传输之间的10秒到传输之间的10分钟之间的任何位置,并且在开始的7帧之后通信似乎仍然退出。在main中,在发送呼叫之后,我添加了PRINTF('TESTING \ r \ n');语句,以帮助通过串行通信进行调试。通讯停止后,此测试仍在打印中。这是否表明我已经达到区域最大传输占空比?参见下面的串行通讯输出示例
测试
0s456:PHY txDone
5s571:PHY rxDone
已加入
测试
60s459:PHY txDone
61s544:PHY rxDone
测试
120s151:PHY txDone
121s165:PHY rxDone
测试
180s151:PHY txDone
181s165:PHY rxDone
测试
240s151:PHY txDone
241s165:PHY rxDone
测试
300s151:PHY txDone
301s165:PHY rxDone
测试
360s151:PHY txDone
361s165:PHY rxDone
测试
420s151:PHY txDone
421s162:PHY rxDone
测试
测试
测试
测试
测试
测试
测试
测试
我尝试过的代码的另一个更改是:
for( uint8_t i = 0; i < US915_MAX_NB_CHANNELS - 8; i++ )
{
NvmCtx.Channels[i].Frequency = 903300000 + ((i % 8) * 200000);
NvmCtx.Channels[i].DrRange.Value = ( DR_3 << 4 ) | DR_0;
NvmCtx.Channels[i].Band = 0;
}
在这里,我尝试用网关正在监听的8个频率定义所有64个通道。这似乎与原始代码更接近,而原始代码似乎丢失了传输。但是,由于所有信道都定义为8个频段中的1个,因此我不确定会如何发生。该代码将在无法捕获返回的下行链路的同时发送上行链路,然后重试上行链路通信,直到最终接收到下行链路为止。参见下面的串行通讯输出
测试
1860s459:PHY txDone
1861s493:PHY rxTimeOut
1862s529:PHY rxTimeOut
1864s998:PHY txDone
1866s031:PHY rxTimeOut
1867s067:PHY rxTimeOut
1869s142:PHY txDone
1870s175:PHY rxTimeOut
1871s211:PHY rxTimeOut
1873s420:PHY txDone
1874s454:PHY rxTimeOut
1875s490:PHY rxTimeOut
1878s204:PHY txDone
1879s289:PHY rxDone
ST UM2703似乎不够灵巧,无法通知用户如何正确定义通道图。对于如何正确实施此方法的任何帮助将不胜感激。