Arduino LMIC:确定芯片上的数据包传输何时开始

物联网 劳拉 罗拉万
2021-06-03 06:07:11

我使用 ABP 激活的 LoRaWaN 节点的以下示例:

https://github.com/matthijskooijman/arduino-lmic/blob/master/examples/ttn-otaa/ttn-otaa.ino

但出于某种原因,我无法弄清楚节点何时传输某些数据。就我从这个片段中看到的:

LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
Serial.println(F("Packet queued"));

数据包被插入队列,然后在可用时传输。那么我将如何让 ABP 示例在 Dragino-shield/hopeRFM9x 开始传输队列中的物理包时给我一个指示?

我之所以这么问是因为单通道网关出于某种原因对通过 Semtech UDPstat消息存在的 TTN 进行 ping 操作,并且几乎没有收到任何要传输的消息。所以我想调试它,因此我需要在physical排队数据包的传输开始和结束时进行更详细的登录我偶尔会在关闭和打开 LoRaWAN 节点的电源时收到一些消息。

此外,即使我运行设置超过 30 分钟,并且 Arduino 是我的应用程序中唯一的一个节点并且该节点位于我的数据包转发器旁边,我也可能在我的 LoRaWaN 单通道网关上根本没有收到任何消息。

通过我的网关,我使用了以下说明:http : //www.instructables.com/id/Use-Lora-Shield-and-RPi-to-Build-a-LoRaWAN-Gateway/

对于我的数据包转发器,我使用了以下实现:https : //github.com/tftelkamp/single_chan_pkt_fwd

此外,我已将我的 TTN 应用程序配置为使用旧版 Semtech 数据包转发器。

1个回答

LMiC 不会在传输开始时告诉您的代码,但您可以启用调试日志记录

当您在远低于占空比限制的情况下进行传输时,LMiC 通常会几乎立即发送。它可能会推迟事情:

  • 当使用OTAA并且节点还没有加入时,它会在调度第一个数据包时首先尝试加入。

  • 当占空比限制开始时,它将等待下一个机会。

  • 在每个上行链路之后,它将首先侦听任何下行链路,恰好在 1 秒(RX1)和 2 秒(RX2,如果 RX1 中没有收到任何信息)之后。

  • 当它没有收到下行链路时,它仍然不会发送一段时间,因为它假设最近的网关可能正在发送节点无法识别的下行链路。由于网关是半双工的,因此在此期间此类网关不会侦听任何上行链路,因此 LMiC 会尝试智能并在未收到任何下行链路时推迟发送。为此,LMiC 在 RX2 中假设 SF12,并在 RX2 之后再延迟 3 秒

当传输并等待 RX1 和 RX2(如果适用)完成时,您将收到该EV_TXCOMPLETE事件。(但即便如此,它仍可能将下一次传输延迟 3 秒;见上文。)

查看我曾经使用过的一些旧代码,您似乎可以通过使用以下命令来猜测它是否立即发送:

LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
// At this point LMIC.txend is still the end time of the last packet?
if(LMIC.txend < os_getTime()) {
  Serial.print(F("Will send right away"));
}
else {
  Serial.print(F("Packet queued"));
}

(但是:现在没有测试。)

也就是说,要调试您的实际问题:

最重要的是:

我使用 abp 激活的 lowawan 节点的以下示例:

https://github.com/matthijskooijman/arduino-lmic/blob/master/examples/ttn-otaa/ttn-otaa.ino

该示例适用于 OTAA,而不适用于 ABP。(并且您使用的单通道测试网关已弃用,不支持下行链路,因此也没有 OTAA。)