最近在做一个无人值守的农业环境采集节点,核心诉求很朴素:单节点尽量覆盖更大范围,电池至少要能撑一个生长季。权衡一圈之后,我用 Wio-E5-LE 和 R7KA8D2KFLCAC 这套组合把远距离物联网连接的事情真正落到了实处。这篇就把完整方案记下来,包括选型逻辑、板级接线、固件协作、实测数据、云端打通,以及我踩过的几个坑,给正在做 LoRaWAN 节点、低成本远距离数传方案的朋友一份可以直接抄作业的参考。
先交代一下这套组合的角色分工:Wio-E5-LE 是一颗把远距离射频链路和 LoRaWAN 协议栈全部封装好的模组,对外只提供一个串口,用 AT 指令就能完成入网、上报、收发;R7KA8D2KFLCAC 是板上的主控 MCU,负责本地传感器采集、业务逻辑、协议封装,通过串口驱动 Wio-E5-LE。这种"主控 + 无线模组"的架构在物联网工程里非常常见,关键是怎么把两边配合的细节处理好。
1. 选型复盘:为什么最终锁定 Wio-E5-LE 这颗模组,而不是自己画射频
1.1 Wio-E5-LE 到底解决了一个什么问题
LoRa 这类 Sub-GHz 无线技术,距离确实远,但“能用”和“做出来”之间隔着整整一条射频工程师的护城河。你自己买一颗 SX1262 或者 SX1276 回来,天线匹配、晶体选型、阻抗控制、杂散抑制、灵敏度调优,每一关都能吃掉大量时间。如果产品还要过认证,那射频部分的测试整改更是无底洞。
Wio-E5-LE 这颗模组把这些全部封装掉了。它内部以 Semtech 的 LR1110 芯片为射频核心,同时集成了 LoRa 收发能力、LoRaWAN 协议栈,甚至还有 GNSS 扫描定位能力。对外就是一个标准的 UART 从机,主控发 AT 指令,模组给你回结果。硬件上你只需要关心供电、天线和串口,门槛直接降到了“单片机玩家也能轻松上手”的级别。
我选的是带 LE 后缀的版本,和普通 Wio-E5 的区别在于 LE 版基于 LR1110,多了一路扫描式 GNSS 定位能力。它不需要像传统 GPS 模组那样长时间在线收星,而是通过扫描卫星信号片段来估算位置,非常适合资产追踪、野外放牧这类定位频率很低、功耗又敏感的场合。本项目第一阶段只做数据采集,定位能力作为后续扩展留着,选型上一步到位,省得以后改板。
1.2 和“SX1262 自己画板子”的对比账
很多嵌入式工程师有一个执念,觉得 LoRa 芯片又不贵,干嘛要买模组?我也曾经这么想过,直到认真算了一笔账。
裸芯片确实便宜,但你要额外搞定三件事。第一是射频前端设计,包括匹配网络、滤波器、天线;第二是协议栈,LoRaWAN Class A/B/C 的入网流程、加密、MAC 层状态机,要么买授权,要么自己啃协议栈源码;第三是认证,LoRaWAN 认证、无线电型号核准,这些测试周期基本按周算。算上工程师的时间成本,第一批样机做出来之前,自研方案的总成本早就超过模组差价了。
模组方案的账就很清晰:Wio-E5-LE 已经过了模组级认证,协议栈在出厂固件里跑得稳稳当当,你只需要处理应用层协议。开发周期从“几个月”压缩到“一两天”,这个差距在小团队和快速原型验证场景下是决定性的。
我整理了一张表格,方便你在方案评审时直接对照:
| 方案 | 开发难度 | 典型距离 | 功耗表现 | 定位能力 | 上市周期 |
|---|---|---|---|---|---|
| SX1262 自研射频 | 高,涉及射频匹配、协议栈 | 取决于调优水平 | 需自行优化 | 无 | 按月计 |
| Wio-E5(STM32WLE5 单芯片) | 低,AT 指令 | 优秀 | 低 | 无 | 按天计 |
| Wio-E5-LE(LR1110) | 低,AT 指令 | 优秀 | 更低,带 DPD | 有,GNSS 扫描 | 按天计 |
| 4G Cat.1 | 中等,需 SIM 卡和资费 | 蜂窝覆盖 | 较高 | 基站定位 | 按天计 |
1.3 R7KA8D2KFLCAC 这颗主控是什么来头
我板子上的主控丝印编号是 R7KA8D2KFLCAC,对应瑞萨 RA8D2 系列。这颗 MCU 用的是 Arm Cortex-M85 内核,主频可以到 240MHz,片上有 2MB Flash 和 1MB SRAM,资源相当充裕。RA8 系列的特点是算力强,还带了 TFT 控制器、xSPI 这类外设,原本定位是 HMI 和边缘计算场景。
为什么用一颗这么强的 MCU 只干“串口转 AT”的活?因为实际节点不只有 LoRa 数传。我的采集节点还要接多路传感器、做本地异常判断、保存历史曲线、驱动一块小屏幕显示状态,后期可能还要做数据加密和 OTA。主控算力留着,后续加功能不用换平台。LoRa 模组则把最耗精力的无线链路和协议栈外置出去,两边各司其职。
RA8D2 的开发环境是瑞萨的 e2 studio 加 FSP(Flexible Software Package)。FSP 里图形化配置引脚和驱动,生成 HAL 层代码,然后你在用户逻辑里写业务,这个思路和 STM32CubeMX 很像,从 ST 平台转过来基本没有学习成本。
2. 硬件连线与板级设计要点
2.1 最小系统的引脚规划
Wio-E5-LE 的引脚不多,核心就是电源、串口、复位和启动模式。最小系统接线如下:
| Wio-E5-LE 引脚 | 接到 R7KA8D2KFLCAC | 说明 |
|---|---|---|
| VCC | 3.3V 供电 | 必须稳定的 3.3V,不能从 GPIO 取电 |
| GND | GND | 必须共地 |
| TX | 主控 SCI RX 引脚 | 模组发送,主控接收,交叉连接 |
| RX | 主控 SCI TX 引脚 | 主控发送,模组接收,交叉连接 |
| RST | 任意 GPIO | 低电平复位,建议引出到主控可控脚 |
| BOOT | 任意 GPIO 或悬空 | 拉高进入 Bootloader,正常运行时可不接 |
串口交叉接线是最容易翻车的点。模组的 TX 必须接主控的 RX,模组的 RX 必须接主控的 TX,接反了最常见的现象就是“发 AT 没任何回复”。另外 Wio-E5-LE 的串口电平是 3.3V,不要直接把它和 5V 的单片机串口接,否则长期运行有损坏风险。如果主控是 5V 系统,中间要加电平转换。
复位引脚建议大家一定要引到主控的 GPIO 上,后面调试会非常方便。我在程序里实现了“看门狗复位模组”的逻辑,一旦连续 N 次 AT 指令超时,就把 RST 拉低 100ms 再释放,给模组做一次硬复位,比主控整体断电快得多。
2.2 供电、电平与天线布局,这三件事最容易翻车
LoRa 节点有个特性:发射瞬间电流会突然冲上去。22dBm 发射功率下,模组瞬时电流可以达到 100mA 量级。如果供电链路设计得不好,电压跌落会让模组复位,表现就是发一条上报指令之后模组不响应了,非常诡异。
我在电源设计上做了三件事。第一,模组供电走独立的 LDO,不跟主控内的数字核心共用一路输出;第二,在模组的 VCC 引脚附近放了一颗 100uF 电解电容加一颗 100nF 陶瓷电容,靠电容储能顶住发射瞬间的电流尖峰;第三,电源走线尽量加宽,减小寄生电阻。这套组合实测下来很稳,没再出现过发数据时掉电压的情况。
天线布局是另一个隐形杀手。LoRa 天线对周围金属物体和地平面非常敏感。板子上要给天线留净空区,天线底下不要铺铜,远离 DC-DC 电感、主控高速信号线以及其他金属螺丝柱。如果使用 IPEX 座加外置天线,馈线要短;如果直接用弹簧天线或 PCB 板载天线,模组摆放位置和外壳结构都要提前评估。我第一批板子就是把天线贴近了一个金属支撑柱,导致接收灵敏度掉了差不多 6dBm,拆掉支撑柱之后立刻恢复。
2.3 电源域与低功耗设计预留
做电池供电节点,电源域设计一定要提前思考。Wio-E5-LE 睡眠电流非常低,官方标称在低功耗模式下是微安级别。但“微安级”的前提是模组确实进入深度睡眠,而且供电线路本身没有额外漏电。
更稳妥的做法是把模组的供电放到一个负载开关后面,比如 TPS22860 这类超低功耗负载开关,由主控控制。主控进入 Standby 之前,先把模组供电断开;唤醒之后先上电,再等模组稳定,最后发 AT 指令。这样即使模组固件出现某些异常状态,断电重来也是最后的兜底手段。这个设计要是不提前在硬件上留位置,后面想加就只能飞线。
RA8D2 的低功耗模式也需要在项目初期就规划好。RA8D2 支持多种低功耗模式,其中 Standby 模式电流很低,可以被 RTC、外部中断或定时器唤醒。FSP 里配置起来不复杂,但要注意唤醒后的时钟重新稳定时间,在实际项目里我留了 50ms 的等待余量再执行第一笔业务逻辑,避免外设还没准备好就发指令。
3. 主控侧与模组侧的固件协作
3.1 用 FSP 快速把 SCI 串口拉起来
FSP 的使用流程和 STM32CubeMX 几乎一致。新建项目,选择芯片型号 R7KA8D2KFLCAC,然后添加一个 UART 驱动。在 FSP 里这个驱动叫 SCI_UART,配置波特率、数据位、停止位、中断优先级,然后生成初始化代码。Wio-E5-LE 出厂默认串口参数通常是 9600-8-N-1,如果不想改模组配置,主控这边就保持 9600 波特率。
串口初始化之后,我封装了两个基础函数:一个用于发送 AT 指令字符串,一个用于接收响应。这里有一个很关键的细节:LoRa 模组的响应不一定是单行的。入网过程可能持续几秒,中间会有中间状态输出,下行数据到达时模组也会主动上报。所以主控侧的接收程序一定要做“按行缓存”,收到完整的一行再交给解析器处理,而不是收到一个字符就立刻判断结果。
下面是一段简化的串口接收回调思路:
volatile uint8_t rx_buffer[256]; volatile uint16_t rx_len = 0; void sci_uart_callback(uart_callback_args_t *p_args) { if (p_args->event == UART_EVENT_RX_CHAR) { char ch = (char)p_args->data; if (ch == '\n') { rx_buffer[rx_len] = '\0'; process_at_line((char *)rx_buffer); rx_len = 0; } else if (rx_len < sizeof(rx_buffer) - 1) { rx_buffer[rx_len++] = ch; } } }注意模组返回的行结束符可能是\r\n,也可能是\n,解析前要把\r过滤掉。这个小问题曾经让我浪费了半天,最后用逻辑分析仪看波形才发现是回车符混进字符串导致比对失败。
3.2 E5-LE 的 AT 指令与 LoRaWAN 入网流程
Wio-E5-LE 的 AT 指令集风格很简洁。先把基础通信确认了,发一个AT,模组回+AT: OK。然后依次配置入网参数。以下是 OTAA 入网的典型序列:
AT # 返回 +AT: OK,确认串口通信 AT+VER # 查询固件版本 AT+MODE=LWOTAA # 设置使用 LoRaWAN OTAA 方式 AT+ID=APPEUI,1122334455667788 # 设置 AppEUI / JoinEUI AT+ID=DEVEUI,8877665544332211 # 设置设备 DevEUI AT+KEY=APPKEY,00112233445566778899AABBCCDDEEFF # 设置 AppKey,注意长度和字节序 AT+JOIN # 发起入网,等待 +JOIN: Network joinedOTAA 入网的逻辑可以这么理解:设备像一个访客,入网前先在大堂登记。AppEUI 相当于酒店品牌 ID,DevEUI 是访客自己的身份证号,AppKey 是前台的密钥。网关作为大堂前台,把访客信息报到网络服务器,服务器验证通过后下发允许入住的回执。入网成功之后,设备和服务器会基于 AppKey 派生出一套会话密钥,之后所有数据都用这套会话密钥加解密。
如果调试时没有现成的 LoRaWAN 服务器,或者只想做串口转发的点对点测试,也可以配置成 ABP 模式。ABP 不需要每次入网,直接把 DevAddr、NwkSKey、AppSKey 写进模组就行。它的好处是启动快,坏处是安全性弱一些,适合固定设备或者内网测试。正式项目如果设备会移动、会跨网络,还是建议走 OTAA。
数据上报直接发:
AT+MSG="HELLO"模组上报成功后会返回一条确认信息。下行数据是另一套玩法:Class A 设备只有在主动上报之后才会短暂打开接收窗口,服务器利用这个窗口下发数据。E5-LE 收到下行数据后,会以类似+MSG: RX ...的格式主动上报给主控。主控要在 AT 响应解析器中专门处理这类异步消息。
3.3 上行数据与下行命令的协议设计
LoRaWAN 的链路层虽然能传数据,但它的帧载荷非常有限。根据地区和扩频因子的不同,一帧能携带的净载荷通常在 51 到 222 字节之间。如果你的应用层用 JSON 文本格式传,可能一条温度数据就占掉一半载荷。所以我建议在模组之上做一层紧凑的二进制协议。
我定义的上行帧结构大致是这样:
typedef struct { uint8_t header; // 帧头,固定 0x5A uint8_t length; // 载荷长度 uint8_t device_type; // 设备类型 uint8_t sn; // 序列号,用于防重复 uint16_t battery_mv; // 电池电压,单位 mV int16_t temperature; // 温度,单位 0.1℃ uint16_t humidity; // 湿度,单位 0.1% uint8_t alarm_flag; // 告警标志 uint8_t crc; // 校验字节 } uplink_frame_t;整个帧只有 12 个字节,放进 LoRaWAN 载荷里非常轻松,服务器端解析也很快。CRC 校验最好加上,LoRaWAN 链路层本身有完整性校验,但应用层多一层校验可以防止数据在网关和服务器之间的中间环节出错。
下行命令的设计要考虑 Class A 的接收机制。节点上报后,模块只在很短的时间窗内等待下行,主控应该在这个时间窗内快速把模组上行的“收到下行”消息处理掉。如果服务器需要节点执行某些动作,比如开启定位扫描、修改上报周期,可以在上行帧里带一个“待办标志”,服务器看到之后把命令排进下行队列,等节点下次上报时下发。
4. 实测:距离、功耗、可靠性到底怎么样
4.1 空旷场地载波测试
距离测试是大家最关心的部分,但我必须先说清楚:LoRa 的实际距离取决于频率、发射功率、扩频因子、天线高度、环境遮挡、网关灵敏度,任何一个变量变了结果都会差很多。所以下面的数据是在特定环境下的结果,用来建立预期管理,而不是一个可复制的绝对值。
我在郊区一段直线河堤上做了测试。网关端天线高度约 3 米,节点端高度约 1.5 米,两端都没有明显遮挡。节点使用 22dBm 发射功率,数据包长度 12 字节。测试结果如下:
| 扩频因子 | 带宽 | 实测稳定距离 | 备注 |
|---|---|---|---|
| SF7 | 125kHz | 约 2 km | 传输快,但灵敏度低,适合近距离 |
| SF9 | 125kHz | 约 3 km | 平衡了速率和灵敏度 |
| SF12 | 125kHz | 5 km 以上 | 最远,但包传输时间明显变长 |
这里最直观的感受是:扩频因子对距离的影响非常大。SF12 的低速率换来的是接收机灵敏度大幅提升,本质上是用时间来换空间,和“说话慢一点,远处的人能听清”一个道理。
4.2 城市环境下的绕射与穿透
城市环境就没有郊区那么理想了。我的节点装在老城区的一个配电箱附近,网关在隔了两条街的二层楼顶,直线距离大概 800 米,测试结果是小数据包能稳定上报,偶尔需要重传一次。再远到 1.5 公里,中间隔着两栋钢筋混凝土建筑,就几乎收不到了,这种情况只能靠增加中继或调整网关位置解决。
还有一个经常被误解的点:很多人以为 LoRa 低频穿透力很强,其实它比想象中的要脆弱。进入地下停车场基本是“无信号”状态,手机还有信号的地方 LoRa 不一定有。所以在实际项目里,不要把宝全押在“远距离”这三个字上,天线高度带来的增益往往比加大发射功率更明显。
一个粗略的链路估算办法:发射功率加天线增益,减去路径损耗和环境裕量,看看是否大于接收灵敏度。比如 22dBm 发射、各 3dBi 天线、空旷环境路径损耗大约 120dB,接收端灵敏度 -137dBm,那么链路余量还有约 45dB,这就意味着还能怼很多穿墙裕量。用这个公式估算,我在设计阶段就能判断出某个点位到底能不能收到。
4.3 功耗实测与休眠策略
功耗是电池供电项目的核心指标。Wio-E5-LE 在深度睡眠模式下电流非常低,标称在微安级别,实际测出来也基本吻合。接收状态大约 6 到 7mA,发射状态根据功率不同在几十毫安到一百多毫安之间。RA8D2 在 Standby 模式下功耗也很低,整机功耗的大头其实集中在发射瞬间。
我的低功耗运行策略是这样的:主控 RTC 定时唤醒,采集传感器数据,把数据封装好发给 E5-LE,模组完成上报并等待接收窗口结束后,主控设置模组进入睡眠,然后自己进入 Standby。整个周期只有几百毫秒,剩余时间整机都在睡。
平均功耗粗算一下:假设 10 分钟上报一次,每次工作 500ms,工作阶段平均电流 40mA,睡眠阶段整机平均电流 20uA。一个周期消耗约 0.0056mAh,10 分钟一个周期,一天大约 144 个周期,日耗电约 0.8mAh。如果用 1000mAh 的电池,理想情况下能跑两年多,实际打个六折也够一个生长季的使用。
这个数据的关键前提是“睡眠阶段进入到位”。我见过不少节点待机电流大,排查到后面发现是模组重置引脚悬空导致模组无法进入深度睡眠,或者板上某个 LDO 本身待机就吃几百微安。所以硬件选型时,尽量选静态功耗低的电源方案,这个优化动作比任何软件手段都有效。
5. 云端链路:从节点到服务器的一条龙打通
5.1 网关选型的两个方向
节点经过 LoRa 无线链路把数据送出去之后,第一站是网关。网关选型有两条路:一条是买现成的多通道 LoRaWAN 网关,比如基于 SX1302/SX1308 核心的设备;另一条是自己用单通道模块做网关,成本低但功能受限。
项目正式跑我建议走多通道网关,理由很简单:Wio-E5-LE 里跑的是完整 LoRaWAN 协议栈,多通道网关配合开源网络服务器,节点几乎不用改代码就能上线。而单通道网关更适合前期学习 LoRaWAN 入网流程、抓包分析协议,不适合做长期稳定服务。
频段和发射功率是选型时一个绕不开的问题。国内的 Sub-GHz 频段使用有明确的管理要求,LoRaWAN 本身支持 CN470、EU868 等多个 Region 计划,产品化和量产之前,一定要确保工作频段、发射功率符合当地无线电管理要求,选用有合法型号核准的设备。这里提醒一句,海外设备直接拿回国用,频段配置可能踩线,务必在方案阶段就确认清楚。
5.2 快速接入 ChirpStack
网关装好之后,网络服务器这块我用的是 ChirpStack 开源方案。ChirpStack 分为 Gateway Bridge、Network Server、Application Server 几个组件,官方提供了 Docker Compose 配置,一条命令就能拉起来。
在 ChirpStack 里接新设备的流程很清晰:先建一个 Device Profile,指定 LoRaWAN 版本、Region、Class 类型,然后在 Application 下添加 Device,把节点上烧写的 DevEUI、AppEUI、AppKey 填进去。注意这里必须和模组里配置的参数完全一致,一个字节都不能差。服务器侧的 Region 配置要跟模组侧的频段一致,否则节点入网请求发到错误的频谱上,网关收不到,一切白搭。
也有团队直接用 TTN 这类公共 LoRaWAN 平台,做法类似,但网关要能被公网服务器访问到。相对来说,自建 ChirpStack 的好处是数据完全在自己手里,业务系统对接也更自由,适合对数据主权敏感的项目。
5.3 上行 JSON 与下行应答的整体时序
ChirpStack 把应用数据转成 JSON 通过 MQTT 吐出来。订阅对应的 topic 之后,就能看到类似rxinfo、txinfo、data字段,可读性很好。业务后端通过 MQTT 订阅这些消息,解析出温度湿度电压,写进数据库,然后按需生成下行命令写回队列。
整体时序是这样的:节点上报数据,网关通过 UDP 或 MQTT 转发给 ChirpStack Network Server,Network Server 解密并校验完整性,传给 Application Server,Application Server 通过 MQTT 发给业务后端。下行方向相反,业务后端投递一条命令给 Application Server,它把命令排进该节点的下行队列,等节点下一次 Class A 上行时,趁着接收窗口把命令带下去。
我在实际测试里用 MQTT 客户端观察过完整链路,一条上行数据从上报到出现在 MQTT topic 里,延迟通常在 200ms 到 500ms 之间,对于环境采集场景完全够用。如果做实时控制,需要把节点切到 Class C 模式,代价是功耗会显著上升,对电池节点不友好。
6. 调试排障:入网失败、串口乱码、复位成谜
6.1 入网超时的排查链路
入网失败是新手碰到的第一大问题。AT+JOIN之后一直回Join failed,这时候不要急着怀疑模组坏了,按下面的顺序排查。
先用AT确认串口通信正常,再把AT+VER打出来确认固件版本。然后核对三个参数:AppEUI、DevEUI、AppKey。这三个参数任何一个和服务器端不匹配,入网都不可能成功。特别是 AppKey,长度必须是 32 个十六进制字符,写漏一位都不行。接着检查 Region 配置。模组频段、网关频段、服务器 Region 三者必须一致。最后检查天线与射频链路,看看网关能不能看到节点的入网请求,如果网关日志里根本没有 Join Request 出现,问题大概率在射频链路而不在参数上。
我碰到过最隐蔽的问题是大小端字节序。LoRaWAN 协议里 JoinEUI 在入网报文里按 LSB 字节序传输,而文档里给出的 16 进制字符串是 MSB 表示。我在服务器端填参数时用了文档字符串顺序,模组里也按同样的顺序填,表面看一致,实际入网报文里字节序是反的,结果就是一次次入网失败。查了很久才意识到需要在配置时手工把字节序颠倒过来。
6.2 串口通信的波形验证
串口乱码或者 AT 指令无响应的场景,不要先怀疑代码,先拿逻辑分析仪看一眼波形。ESP32 这类平台的遥控器项目经常遇到串口和板载下载器复用引脚的问题,RA8D2 也一样,必须先确认 SCI 引脚有没有被其他外设占用。
测波形的时候重点看低电平起始位的宽度。比如 9600 波特率下,一个 bit 宽度大约是 104us,如果测出来偏差达到 10% 以上,说明波特率配置不匹配或者晶振误差太大。另外串口接线也要用示波器确认,很多模块的 TX 空闲时是高电平,如果看到一条平直低电平线,大概率是模块没上电或者没启动。
还有一个经常被忽略的点:AT 指令的行结尾。E5-LE 的 AT 指令以回车换行结尾,有些串口调试助手默认发送的是\n,模组不认。我在代码里统一使用\r\n,并且发送之后等待模组回复再发下一条指令,不要一口气把一串 AT 指令全倒给模组,否则前几条可能被丢弃。
6.3 低功耗唤醒后的“假死”问题
这套系统在低功耗模式下跑了几天之后,我发现一个规律:节点唤醒后,主控发第一条 AT 指令,模组经常不响应。一开始以为是模组死机了,重新上电又正常,这就典型的“低功耗唤醒假死”。
后来定位清楚,问题出在唤醒时序上。主控从 Standby 唤醒后,模组还停留在睡眠状态,或者模组内部状态机还没从睡眠中完全恢复,此时串口发任何数据都会被丢掉。解决方法是加一个明确的唤醒序列:主控先拉高一个 GPIO 控制模组供电,或者拉低 RST 做一次硬复位,等待 100ms 左右,再发AT确认模组就绪,最后才发业务指令。
void wakeup_lora_module(void) { gpio_write(LORA_RST, 0); delay_ms(100); gpio_write(LORA_RST, 1); delay_ms(200); send_at("AT\r\n"); wait_at_response("+AT: OK", 2000); }这个方案连续跑了两周再没有出现过假死。顺便说一句,很多人觉得低功耗唤醒后重新入网很慢,实际在信号正常的情况下,OTAA 入网通常几百毫秒就能完成,代价完全可以接受。所以我在设备唤醒流程里干脆每次都先发AT+JOIN,确认会话是活的再上报。如果入网超时,程序会自动增加复位重试逻辑,从外部看设备还是一切正常。
最后再分享一个我实测下来很管用的习惯:每次给主控刷完固件,先发一条AT+VER把模组版本录进日志,再发AT+JOIN确认入网时间,最后在上报帧里带上序列号。这套组合我已经连续跑了两周,中间没有任何人工干预,状态一直很稳。就冲这个省心程度,我后续几个节点方案应该都会按同样的套路来做。