如果你是因为搜“LoRa”点进来的,我猜你大概率一开始看到的是一堆叫“LoRA”的东西——那是AI领域里做模型微调的低秩适配技术,跟咱们要说的无线通信八竿子打不着。别急着点出去,这里讲的是另一个LoRa:Long Range,低功耗广域网里最典型的一种物理层技术。
作为系列第7篇,前面几篇已经把LoRa的调制原理、协议栈选型都过了一遍,这篇不整虚的,直接做一个小目标:把手头几块SX1278模组,拼成一台能真正收发数据的原型LoRa设备。适合谁看?刚买了LoRa模块却发现网上教程碎片化、连不上、调不通的人,以及想评估LoRa能不能用在自家项目里的评估者。
原型设备这种东西,做成什么样不重要,重要的是它能让你在半小时内直观看到“射频链路通没通”“参数调没调对”“距离能传多远”。这篇文章会从方案选型、零件清单、接线焊接、固件开发一直写到实测数据和问题排查,全程记录我实际踩过的坑。
1. 动手前先把方案想清楚
1.1 原型设备要解决的核心问题
做LoRa原型设备,第一件事不是买板子,而是想清楚“我要通过它验证什么”。很多人上来就追求全功能,什么OLED屏幕、GPS定位、温湿度传感器全往一块板子上堆,结果射频还没调通,先被外设的I2C地址和供电问题折腾到崩溃。
LoRa原型机的核心目标只有一个:验证射频链路是否可靠。你真正需要关心的指标是——发射功率够不够、接收灵敏度达没达到预期、不同扩频因子和带宽组合下的距离变化、以及电池供电时电流曲线稳不稳。其它功能都是附加项,可以在链路打通之后再加。
我做这块原型机时给自己定了三条边界:第一,只做点对点通信,不做LoRaWAN组网;第二,只用SPI接口的射频芯片模组,不用串口AT指令模组;第三,优先保证能现场改参数,所以保留USB串口调试口,方便随时给MCU刷固件、打日志。
这三条边界背后是有考量的。LoRaWAN虽然是LoRa最主流的应用形态,但它涉及入网流程、密钥管理、上下行窗口,这些复杂机制对“验证射频物理层”这件事反而形成干扰。点到点模式可以直接操作发射机和接收机,看到最原始的通信损耗和误码情况。
1.2 为什么选SX1278而不是SX1262
LoRa射频芯片最主流的有两个系列:老一代的SX1276/SX1278,和新一代的SX1262。做原型设备,我推荐SX1278,原因很简单——资料多、价格低、稳压稳打。
SX1278支持137MHz到525MHz频段,正好覆盖国内常用的470MHz到510MHz计量频段,SX1276则覆盖到915MHz。如果你主要在国内玩,买SX1278模组就行,没必要买SX1276。SX1262灵敏度更高、功耗控制更细,还支持CAD(Channel Activity Detection)信道活动检测可以做到更低功耗的监听,但它的寄存器配置和SX127x系列有不少差异,网上现成代码相对少。
| 特性 | SX1278 | SX1262 |
|---|---|---|
| 频率范围 | 137-525MHz | 150MHz-960MHz |
| 最大灵敏度 | 约-137dBm@SF12/125kHz | 约-137dBm~-139dBm |
| 接口 | SPI | SPI |
| 典型价(模块) | 10-20元 | 30-60元 |
| 文档资料量 | 非常多 | 中等 |
| 上手难度 | 低 | 中 |
原型阶段选SX1278最大的理由其实是“坑都被人踩完了”。你遇到SPI通信不稳定的问题,搜一下基本都有现成答案;放到SX1262上,很多问题要自己啃英文手册。而且原型设备对功耗的极致追求没有那么强,SX1278的休眠电流已经够用,没必要为了那几十微安去换芯片。
1.3 三种开发路线怎么选
LoRa原型设备的载体路径有三条:纯面包板、开发板直用、自制PCB。三条路各有适合的场景,我先把结论放在这:第一次接触LoRa,选开发板直用;想复现一个可移动的小体积原型,选面包板或洞洞板;距离测试通过后准备集成到项目里,再画PCB。
纯面包板搭LoRa最大的问题是射频信号完整性。面包板内部的金属簧片之间分布电容很大,SX1278的发射电流峰值能到120mA,这么高频的电流跳变在面包板上容易造成电压跌落和地弹,轻则发射功率下降,重则模块直接复位。我见过有人在面包板上死活连不上,最后发现是供电线太长导致模块供电电压在发射瞬间跌到3.0V以下。
开发板直用是最省心的。像Heltec的WiFi LoRa 32、TTGO的LoRa32这类板子,把ESP32和SX1278集成在一起,板载天线、CP2102串口芯片、OLED全都有。上手就是Arduino写代码,烧进去就能跑。这套方案唯一的缺点是天线往往是板载PCB天线,增益低,远距离测试时表现不如外接天线。
自制PCB是后期优化阶段才该干的事。先用开发板把通信逻辑调通、把距离摸底测完,再去画板、做阻抗匹配、加屏蔽罩,这样风险最小。否则上来就画板,射频匹配没做好,可能连3米都传不通,到时候你根本分不清是软件问题还是硬件问题。
2. 零件清单与链路预算
2.1 原型机需要的全部零件
我按“一套发送机+一套接收机”的标准来列清单,不需要花里胡哨的传感器,纯通信验证用途。
| 零件 | 型号/规格 | 数量 | 作用 |
|---|---|---|---|
| LoRa模块 | SX1278 470MHz模块(如E19-470M30S) | 2 | 收发信机 |
| 主控MCU | ESP32 DevKitC V4 或 Arduino Nano | 2 | 控制射频芯片 |
| USB转串口调试线 | CP2102模块 | 1 | 其中一套板载已有 |
| 天线 | 433MHz弹簧天线或1/4波长导线 | 2 | 辐射和接收电磁波 |
| 电池 | 18650锂电池+低压差3.3V稳压 | 2 | 移动供电 |
| 排针排母 | 2.54mm直针、弯针各若干 | - | 连接模块与PCB |
| 洞洞板 | 7x9cm单面玻纤板 | 2 | 承载电路 |
| 杜邦线 | 公对公、公对母各10根 | - | 临时调试接线 |
关于Lora模块,这里特别强调一下:买模块时一定要问清楚是“纯SPI接口”还是“带MCU的AT指令模组”。市面上很多打着LoRa名号的模块实际上内部集成了一颗MCU,走串口AT指令控制,这种模块用起来省事,但你想直接操作射频寄存器、观察底层行为就受限了。做原型验证,选纯SPI接口的模块,即模块上直接引出SX1278芯片的SPI引脚和几个GPIO控制脚。
2.2 链路预算怎么算,这决定了你能传多远
LoRa的传输距离不是拍脑袋估的,链路预算是最经典的估算方式。链路预算公式可以简化为:
发射功率 + 发射天线增益 + 接收天线增益 - 路径损耗 ≥ 接收灵敏度
用我的原型机举例,SX1278模块的最大发射功率是+20dBm(100mW),但我做低功耗原型时不飙满功率,通常跑+14dBm(25mW),因为很多模块小板供电能力有限,满功率发射反而会引起稳压器跌落。
接收灵敏度取决于你用的扩频因子和带宽。SF12、125kHz带宽下,SX1278标称灵敏度是-137dBm。这是在慢速速率下得到的极限值,也解释了为什么LoRa能传得远:发射功率是固定量,但接收机能检测到极微弱的信号,靠的就是扩频带来的处理增益。
路径损耗可以用自由空间损耗公式估算:
L = 32.44 + 20 × log10(f) + 20 × log10(d)
其中f单位是MHz,d单位是km。假设我用470MHz,通信距离1km,那么路径损耗约等于32.44 + 20×log10(470) + 20×log10(1),算出来大约是105.9dB。我的链路余量就是14 - (-137) - 105.9,约等于45dB。看起来余量很充裕,但注意这是理想自由空间,实际有建筑遮挡、地面反射、树叶吸收,余量会大幅缩水。实测下来开阔地能到1.8km,城区商住区能到800m左右,已经算不错了。
有人喜欢把发射功率飙到+20dBm,我的建议是原型阶段先别。理由是功率越高,模块发热越明显,电池供电的电压跌落越厉害,反而容易诱发异常复位。先把参数组合调对,再考虑加功率。
2.3 天线是原型机最容易翻车的地方
天线问题占LoRa原型故障的一半以上,这句话真不夸张。很多人模块收发不成功,第一反应是SPI配置错了,排查了半天,最后发现是天线没接好或者频率和天线长度不匹配。
天线长度的派算公式很简单:波长λ(米)= 300 / 频率(MHz)。常用的1/4波长单极天线长度就是λ/4。470MHz时λ约等于0.638米,1/4波长大约0.16米,也就是16厘米。你可以直接剪一段16厘米左右的导线焊到模块天线座子上,效果比很多廉价弹簧天线都要好。
我自己测试过,SX1278模块板载的PCB天线在近处没问题,但到了几百米开外,信号损耗明显。换外接1/4波长导线天线后,同样的接收灵敏度,距离能提升30%到50%。这个提升不要钱,就是一根导线的事,强烈建议原型机阶段直接用外接天线。
天线的另一个坑是地平面。单极天线需要有一个“地”来镜像辐射,模块的GND平面越大,天线效果越好。如果你把模块悬空放在桌面上用杜邦线拉着,天线效率会打折。正确做法是让模块的地平面尽量大,比如把模块焊在洞洞板上,GND引脚周围的铜箔覆盖尽量多。
3. 从零到一搭一块能跑的原型板
3.1 接线表和供电方案
搭原型板不必焊得多么艺术,但引脚接线必须清楚。SX1278模块与ESP32的SPI接线是固定的,我习惯用VSPI(ESP32的第二个SPI外设):
| SX1278模块引脚 | ESP32引脚 | 说明 |
|---|---|---|
| 3.3V | 3.3V | 模块供电,注意不能接5V |
| GND | GND | 共地 |
| SCK | GPIO 18 | SPI时钟 |
| MOSI | GPIO 23 | 主机输出 |
| MISO | GPIO 19 | 主机输入 |
| NSS | GPIO 5 | 片选,低电平有效 |
| RST | GPIO 14 | 复位 |
| DIO0 | GPIO 2 | 收发完成中断 |
| DIO1 | GPIO 4 | 可选,用于CAD等 |
接线顺序有讲究。先把GND和3.3V接好,然后用万用表量一下模块供电端有没有短路,再把SPI引脚一根一根接。千万不要带电插拔,SX1278的射频前端很脆弱,静电打一下可能直接烧掉LNA(低噪声放大器)。
供电方面,如果直接用ESP32开发板的3.3V引脚给模块供电,要注意开发板上的AMS1117稳压器能不能扛住发射峰值电流。ESP32本身跑Wi-Fi时峰值电流就能到300mA的级别,再加上SX1278发射120mA,有些开发板的稳压器会过热保护,导致电压跌落。我的做法是给LoRa模块单独用一节18650锂电池经过低压差LDO(比如ME6211)稳定到3.3V,ESP32用另一根USB线供电,各走各路。虽然是实验室做法,但能排除掉电源串扰这个变量。
3.2 焊接排针和模块的细节
如果你从面包板过渡到洞洞板,焊接排针是最基础也是最重要的工序。SX1278模块的邮票孔焊盘比较小,建议用可焊性好的Kester焊锡丝,烙铁温度设在340℃左右,焊锡量宁少勿多。
排针焊接我有个心得:先把排针插进洞洞板,不焊模块,先焊排针,保证排针和板面垂直。等排针焊好,再把模块插到排针上,模块朝上,一个个焊点补焊。这样可以避免模块先焊上后你再去操作烙铁时,把模块上的元件烫移位。
关于排针,能选排母就不选排针。模块焊在排母上,随时可以拔下来更换,调试时可以换别的模块排查问题。我做第一版原型时把所有接线都焊死了,结果模块天线座虚焊,拆又拆不下来,整个板子差点报废。后来学乖了,凡是可更换的部件一律用排母。
3.3 上电前的安全检查清单
焊完板子别急着上电,花两分钟做三件事,能避免烧掉一片模块的悲剧。
第一,用万用表蜂鸣档量3.3V和GND之间有没有短路。焊接时焊锡飞溅经常造成隐蔽短路,上电前必查。
第二,量模块天线座的中心针和外壳之间有没有短路。有些廉价天线座用久了内部会歪斜,中心针搭到外壳上,一上电射频输出直接短路,照样烧芯片。
第三,如果用了锂电池供电,量电池正负端电压,确认在3.7V到4.2V范围,并且稳压输出确实是3.3V。很多LDO模块输出可调,出厂默认电压可能被拧到了5V,直接会烧掉模块。
上电后先用手指快速碰一下模块芯片表面温度,温热正常,烫手就断电报修。这一步能让你避免在调试中发现芯片已经冒烟了的尴尬。
4. 固件开发与通信调通
4.1 寄存器操作和SPI时序,最容易卡住的点
SX1278是SPI从设备,所有配置都是通过读写寄存器完成的。有两个问题几乎是每个新手都会撞上的:SPI时钟太快,读写不到正确值;寄存器地址理解错。
SX1278的数据手册写的SPI最高时钟是10MHz,但实际调试中,建议把SPI时钟设在1MHz到5MHz之间。ESP32的默认SPI时钟可能跑在40MHz,你不主动设置,读写寄存器会得到乱码。这不是芯片问题,是SPI时序协议的问题,LoRa芯片跟不上。我调第一块原型板时,SPI时钟没降到合适的频率,读寄存器读回来全是0xFF,一度以为芯片是坏的。
配置寄存器前,先看SX1278的寄存器映射表,特别关注几个核心寄存器:
- 寄存器0x01(RegOpMode):这个寄存器的bit7是LongRangeMode,必须置1才能进入LoRa模式,否则芯片工作在FSK模式,寄存器配置完全对不上,这是很多人调试失败的根因。
- 寄存器0x1D(RegModemConfig1):低4位是编码率CR,bit6到bit4是带宽BW。
- 寄存器0x1E(RegModemConfig2):bit7到bit4是扩频因子SF,bit2是TX模式CRC使能。
- 寄存器0x06/0x07/0x08(RegFrfMsb/Mid/Lsb):这组寄存器决定载波频率,计算方式比较绕,需要根据晶振频率和FSTEP算。
频率寄存器的计算是SX127x系列最经典的一个坑。SX1278内部使用32MHz晶振,FSTEP(频率步进)等于32MHz除以2^19,约为61035.5Hz。目标频率除以FSTEP,得到的整数转成24位二进制,拆成高、中、低三个字节分别写入0x06、0x07、0x08。以470MHz为例,470000000除以61035.5约等于7698,十六进制是0x1E12,拆开写入就是0x00、0x1E、0x12。网上很多代码直接把频率值当赫兹写进寄存器,自然是完全无声的。
4.2 初始化流程和关键参数设置
我用Arduino框架开发,库选择官方RadioLib或者SX127x库。RadioLib的抽象层做得比较好,但如果你想理解底层原理,建议直接操作寄存器。下面是使用RadioLib库的初始化代码,针对470MHz频段、SF12、125kHz带宽、CR 4/5:
#include <RadioLib.h> // 定义SPI引脚和RST/DIO引脚 // NSS=5, RST=14, DIO0=2, DIO1=4 SX1278 radio = new Module(5, 2, 14, 4); void setup() { Serial.begin(115200); Serial.print(F("[SX1278] Initializing ... ")); int state = radio.begin(470.0); if (state == ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // 设置扩频因子、带宽、编码率 radio.setSpreadingFactor(12); // SF12 radio.setBandwidth(125.0); // 125 kHz radio.setCodingRate(5); // CR 4/5 radio.setOutputPower(14); // +14 dBm radio.setPreambleLength(8); // 前导码8个符号 Serial.println(F("Radio configured for LoRa mode")); } void loop() { // 主循环里做发送/接收 }这里强调几个参数的含义。SF12是扩频因子12,意味着用2^12个码片表示1个比特,处理增益最大、灵敏度最高,但空气速率最慢。125kHz带宽下,SF12的空中速率大约只能到293bps,传一个400字节的数据包可能要两秒多。SF7则快得多,速率能达到5.5kbps,但灵敏度会掉下来,距离缩水。原型测试时建议先SF12测极限距离,再根据需要提速。
编码率CR 4/5表示每4个有效比特加1个冗余比特,形成5比特。冗余越高抗干扰能力越强,但有效速率越低。原型阶段保持4/5就够了,不必上到4/8。
前导码的长度会影响灵敏度,SX1278手册默认是8个符号,接收机需要检测到前导码才能开始接收。前导码太短,接收机来不及同步;太长则增加功耗和冲突窗口。8到12个符号是比较通用的选择。
4.3 实现一个最简单的点对点收发
初始化配置好之后,通信逻辑其实很直接。发送方先把数据写入缓冲,调用transmit;接收方设置到接收模式,等DIO0中断触发,再读FIFO。
发送端核心代码:
void sendPacket(String msg) { Serial.print(F("[SX1278] Transmitting packet ... ")); int state = radio.transmit(msg); if (state == ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); } }接收端用中断方式:
// 定义接收回调 void setFlag(void) { transmissionFlag = true; } int transmissionFlag = false; void setup() { // ... 初始化和其他配置 radio.setDio0Action(setFlag); // 启动接收 int state = radio.startReceive(); if (state == ERR_NONE) { Serial.println(F("receiving started")); } } void loop() { if (transmissionFlag) { transmissionFlag = false; String str; int state = radio.readData(str); if (state == ERR_NONE) { Serial.print(F("Received packet: ")); Serial.println(str); // 可选:读取RSSI和SNR信息 Serial.print(F("RSSI: ")); Serial.print(radio.getRSSI()); Serial.print(F(" dBm, SNR: ")); Serial.print(radio.getSNR()); Serial.println(F(" dB")); } else if (state == ERR_CRC_MISMATCH) { Serial.println(F("CRC error")); } else { Serial.print(F("failed, code ")); Serial.println(state); } // 重新回到接收模式 radio.startReceive(); } }接收流程中有个细节值得注意:DIO0在收到包后必须重新调用startReceive,否则模块不会继续接收下一包。很多人测试时第一包能收到、第二包没反应,就是这个原因。
收发测试时,我在发送端放了按键触发发送,接收端通过串口打印接收结果。从第一次点对点打通到现在,这套流程我已经跑过几十次,稳定性和成功率都很有代表性。
另外一个实用小技巧:在发送数据的末尾加一段固定结尾,比如“END”,接收端解析时判断结尾标识,可以过滤掉半包数据。这在调试时尤其重要,因为串口打印可能因为缓冲区截断而显示不完整,你很难分辨是射频问题还是打印问题。
5. 实测数据与问题排查
5.1 距离实测结果和参数选择规律
原型板调通后,我在三个场景做了低功率+14dBm点对点距离测试:
| 测试场景 | 参数组合 | 距离 | 结果 |
|---|---|---|---|
| 城市开阔街道,视距 | SF12/125kHz/CR4/5 | 1.8km | 正常收包,RSSI约-105dBm |
| 城市商住混合区 | SF12/125kHz/CR4/5 | 800m | 偶有丢包,SNR接近0 |
| 室内穿2层楼板 | SF12/125kHz/CR4/5 | 65m | 稳定收到,RSSI约-112dBm |
| 城市开阔街道 | SF7/125kHz/CR4/5 | 600m | 稳定,速率明显更快 |
这个结果很直观地说明了一个规律:频率没变、天线没变、功率没变,仅仅是扩频因子从SF12降到SF7,距离直接缩到三分之一左右。代价换来的优点是包发送时间大幅缩短,同样的信道占用时间能发更多数据。实际产品中比较常见的做法是:平时用SF12慢速上报关键数据,紧急状态下切换到SF7快速传大包。
关于天线高度的测试结果更值得记录:同一测试点,天线从离地1米提高到3米,接收RSSI提升了约8dB。这个提升比把发射功率从14dBm加到20dBm还要明显。原因是地面反射和多径衰落对低天线影响极大,天线升高后第一菲涅尔区干净了很多。结论是:先提高天线高度,再考虑增加功率。
5.2 常见问题排查表
调试LoRa原型机,我总结了高频故障对照表,照着排基本能省半天时间:
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 读寄存器全是0xFF | SPI时钟太高;接线错误 | 降SPI时钟到1MHz;核对NSS、MOSI、MISO |
| 能发送但收不到 | 收发频率不一致;天线没接 | 打印双方频率寄存器值对比;检查天线中心针 |
| 距离近且RSSI很差 | 天线地平面不足;天线类型不匹配 | 加大GND铜箔;换1/4波长导线天线 |
| 发射瞬间MCU复位 | 电源跌落;地弹 | 模块独立LDO供电;加100uF电解电容 |
| 收包率低但RSSI正常 | 同频干扰;编码率设置过低 | 换频率信道;CR提到4/6 |
| 一包都收不到且CRC报错 | 前导码长度不匹配 | 收发双方前导码设一致,建议8符号 |
5.3 几个我特别不想你再踩的坑
第一个坑是拿错模块频率版本。SX1278模块有433MHz版本、470MHz版本、868MHz版本,外观长得几乎一样,只有丝印标注YQ-1278-433、YQ-1278-470这类区别。我手上同时有433和470两个模块,第一次测试时混用没仔细看,一个发433、一个收470,半天调不通,差点怀疑芯片坏了。
第二个坑是测试时忘记设置相同的同步字。SX1278的同步字(SyncWord)相当于网络的“口令”,默认是0x12,但很多教程会让你改掉。如果收发两端同步字不一致,接收机根本不会把对方的前导码识别为有效信号,表现就是“完全静默”。调试时先把同步字统一设成0x12,链路通了再考虑改成自定义值。
第三个坑是误以为LoRa能穿墙穿楼跟Wi-Fi一样。LoRa的优势是链路预算大,但在城市环境里,穿透一栋楼的损耗通常30dB以上,SF12的灵敏度优势会被吃干净。室内测试能穿2层楼板已经算不错,不要幻想跟室外一样稳定。
6. 从原型到产品的几个进阶方向
6.1 CAD模式与功耗采集
原型设备调通后,很多人会想测功耗、做电池续航评估。这时候可以关注SX1278的CAD(Channel Activity Detection)模式。CAD模式的作用是:接收机在极低功耗下周期性监听信道,如果检测到LoRa前导码,才唤醒进入完整接收,否则继续睡。这种方式比一直开着接收机省电得多。
实测SX1278在CAD模式下的电流尖峰大概只有几毫安,持续几个毫秒。配合STM32的RTC唤醒,整体平均功耗可以压到几十微安。用示波器电流探头看波形的话,CAD模式是规律的短尖峰,接收模式是持续的平台,一眼就能分辨。不过CAD的参数需要在寄存器0x31附近配置CAD检测门限,原生库不一定暴露,需要小幅改库。
6.2 私有协议和LoRaWAN的选择
原型阶段用点对点私有协议很爽,但到了产品化阶段就要抉择:自己维护协议栈还是上LoRaWAN。私有协议适合封闭场景,比如农田传感器网络、工厂内部数据采集,所有设备都是你的,协议可定制,网关成本低,调试容易。
LoRaWAN适合需要多设备入网、漫游、远程管制的场景,但它的接入流程、ABP/OTAA激活、区域频段规划都有一大堆规则,开发周期比私有协议长不少。原型阶段先私有协议跑通,后面要做LoRaWAN时,射频前端硬件基本不用改,主要是软件协议栈切换。这是我比较推荐的路子。
6.3 天线阻抗匹配和SMA座子
原型机换成产品PCB时,天线部分不是简单连一根线就行。SX1278的RF输出需要经过一个匹配网络,典型LCπ型滤波,串一个电感再并一个电容,让射频输出阻抗靠近50Ω。如果没有矢量网络分析仪,最简单的办法是抄官方参考设计的BOM值,然后在实机上微调电容容值观察RSSI变化。
模块天线座选SMA母座,配SMA公头外接天线,这样测试时换天线最方便。注意SMA座子的焊盘和周围地之间要开一个小的净空区,否则天线座自己的寄生电容会影响匹配。
说到这,我想起最开始做LoRa原型时犯的一个幼稚错误:测试时手一直捏着天线,以为能让信号更好,结果人体吸收了大部分辐射,RSSI反而掉了十几dB。后来每次测距都把天线固定到三脚架尼龙支架上,人退到天线后方一米开外,数据才稳定可对比。这些细节书面教程不会写,但实操中影响巨大——如果你现在也准备搭LoRa原型机,建议从一开始就把天线固定、环境一致这些变量控制好,你会少走很多弯路。
我把这套实物板和固件示例一直在迭代,后面打算再加一个GPS模块做移动节点测距记录,等跑完再整理数据发出来。