I-CUBE-LRWAN并正确定义通道图

时间:2019-12-09 20:33:46

标签: stm32

我正在努力实现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似乎不够灵巧,无法通知用户如何正确定义通道图。对于如何正确实施此方法的任何帮助将不胜感激。

0 个答案:

没有答案