Arduino LMIC:GPS 记录器 - 旧坐标卡在队列中

物联网 阿杜伊诺 劳拉 全球定位系统
2021-06-22 10:08:45

我正在使用 Arduino LMIC 库构建 LoRaWAN GPS 记录器。我有一个正在运行的解决方案,它读取 GPS 坐标并通过 LoRaWAN 将它们传输到 TTN。对于激活,我使用的是 OTAA。在 TTN 上,我包含了 TTN Mapper 集成,我可以在其中查看 TTN 可用性的覆盖范围。但是,有一个关于时间的主要问题。

当我读取 GPS 坐标时,我想立即通过 LoRaWAN 传输它。如果没有覆盖范围,则设备不应执行任何操作(或只是在未到达任何地方的情况下发送它)。但是,我遇到旧传输卡在队列中,尤其是在设备启动时。如果设备从没有 TTN 覆盖的区域开始,它仍会尝试发送其第一个测量的 GPS 坐标,直到到达可以加入网络 (OTAA) 的区域。加入后,它发送坐标。这些坐标现在在 TTN Mapper 中显示为具有 TTN 覆盖的点,即使给定位置没有 TTN 覆盖。

在下面的屏幕截图中,您可以看到记录 GPS 的时间与包裹到达 TTN 的时间不同: LoRa上行链路截图

克服这个问题的最佳方法是什么?

2个回答

您能否使用消息中的 GPS 时间戳并忽略任何比服务器上的当前时间(通常与时间服务器的时间同步)早 10 秒的消息?确保您使用的是 gps 时间戳而不是系统时间,系统时间有时可能会超过 10 秒。

设备启动后,第一次传输将始终触发 OTAA 加入。在第一次传输中发送坐标 0,0 怎么样?

我总是进行阻塞传输,以确保在我获得新的 GPS 定位并将另一次传输排入队列之前完成传输。进行阻塞传输将保证您在第二次传输排队时已加入网络。还要粗略计算两次传输之间的最小延迟应该是多少,以符合占空比限制,以便 lmic 不会延迟您的传输。

我的 lmic 阻塞 TX 功能如下所示:

static uint8_t txFailedCount = 0;

void tx_blocking(uint8_t* radioPacket, uint8_t packetLength)
{
  txFailedCount++;

  // If we failed to transmit 6 times, reset LMIC
  if(txFailedCount>6) {
    Serial.println("LMIC lockup detected, resetting");
    setup_lmic();
  }

  do_send(&sendjob, radioPacket, packetLength);

  uint32_t start = millis();
  // Wait for join to complete. May take a couple of minutes.
  while( LMIC.opmode & OP_JOINING ) {
    os_runloop_once();
    delay(10);
  }
  while( (LMIC.opmode & OP_TXDATA) && (millis() - start < TX_TIMEOUT) )
  {
    os_runloop_once();
    delay(10);

    // If we are in OP_TXDATA state we are successfully transmitting
    txFailedCount = 0;
  }

  if(millis() - start > TX_TIMEOUT) {
    txFailedCount++;
  }

  Serial.println("TX done");
}