You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 LoRaWAN节点深度睡眠后TTN数据传输异常求助

ESP32 LoRaWAN节点深度睡眠后TTN平台数据接收断续(网关已正常接收)

我开发了一款基于ESP32、9DOF传感器、RFM95W的LoRaWAN节点,使用Arduino IDE及LMIC库编写代码。正常工作时节点可向TTN稳定传输数据,触发9DOF传感器移动时发送数据包。

为节省功耗启用深度睡眠模式后,电池寿命虽有提升,但出现数据传输不可靠问题:网关能正常接收数据包,然而TTN平台的数据却断续出现,有时长时间无数据,有时连续收到多包。

我已尝试以下排查手段但未解决问题:

  • 调用LMIC_shutdown()函数
  • 更换TTN账号
  • 缩短数据包长度

附上节点核心代码片段:

#include <Arduino.h>
#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <Wire.h>

// TTN设备配置信息
const char devEui[] = PROGMEM "XXXXXXXXXXXXXXXX";
const char appEui[] = PROGMEM "XXXXXXXXXXXXXXXX";
const char appKey[] = PROGMEM "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

Adafruit_BNO055 bno = Adafruit_BNO055(55);

void os_getArtEui(u1_t* buf) { memcpy_P(buf, appEui, 8); }
void os_getDevEui(u1_t* buf) { memcpy_P(buf, devEui, 8); }
void os_getDevKey(u1_t* buf) { memcpy_P(buf, appKey, 16); }

static osjob_t sendJob;

void doSend(osjob_t* j) {
  // 检查上行链路状态
  if (LMIC.opmode & OP_TXRXPEND) {
    Serial.println("上行链路忙,跳过发送");
  } else {
    // 读取9DOF传感器数据
    sensors_event_t orientationEvent;
    bno.getEvent(&orientationEvent);
    
    // 构造数据包(移动触发标记+姿态数据)
    uint8_t payload[4];
    payload[0] = 0x01; // 移动触发标识
    payload[1] = (uint8_t)(orientationEvent.orientation.x);
    payload[2] = (uint8_t)(orientationEvent.orientation.y);
    payload[3] = (uint8_t)(orientationEvent.orientation.z);
    
    // 发送数据包
    LMIC_setTxData2(1, payload, sizeof(payload), 0);
    Serial.println("数据包已发送");
  }

  // 关闭LMIC并进入深度睡眠
  LMIC_shutdown();
  esp_deep_sleep_start();
}

void setup() {
  Serial.begin(115200);
  
  // 初始化9DOF传感器
  if (!bno.begin()) {
    Serial.println("9DOF传感器初始化失败");
    while (1);
  }

  // 初始化LMIC LoRaWAN栈
  os_init();
  LMIC_reset();
  
  // 配置TTN EU868频段信道
  LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
  LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);
  LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
  
  // 设置数据速率与发射功率
  LMIC_setDrTxpow(DR_SF9, 14);

  // 调度发送任务
  os_setTimedCallback(&sendJob, os_getTime() + sec2osticks(1), doSend);
}

void loop() {
  os_runloop_once();
}

恳请各位提供以下方向的解决方案或排查建议:

  • 深度睡眠模式下LMIC库的正确关闭与重启流程
  • TTN平台端可能导致数据断续的配置项排查
  • ESP32深度睡眠与RFM95W模块的功耗控制冲突验证
  • 网关接收但TTN平台未显示数据的其他潜在原因

内容的提问来源于stack exchange,提问作者user29144738

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:42:37