☰
LoRa自组网三条技术路线对比:洪泛、路由与网络栈工程实践
2026/10/7 11:55:24 网站建设 项目流程

1. 项目背景:LoRa 自组网到底卡在哪

LoRa 自组网这个事,圈子里吵了很久了。有人一上来就问“用洪泛还是用路由”,也有人直接丢一句“干脆上 LoRaWAN 得了”。我最早做 LoRa 的时候也犯过难:明明射频芯片选型差不多,PA 功率也差不离,为什么别人做出来的网络那么稳,我做出来的一下雨就丢包、一动就断链?后来才明白,问题根本不在硬件,而在你选择了哪条“网络路线”去组织这些节点。

先说清楚一个概念:LoRa 本身只是物理层的一种调制方式,它解决的是“点对点能不能传”的问题,并不负责“数据怎么绕路到达目的地”。所谓自组网,是在 LoRa 之上额外搭建的一套传输组织逻辑。这就出现了三条公认的技术路线:洪泛、路由、网络栈。三者不是简单的版本迭代,而是在“网络容量、实时性、功耗、部署复杂度”这四个维度上做了完全不同的取舍。

这篇文章我会把我们实测过的三套方案全部摊开:原理层面怎么理解、代码和参数层面怎么落、实测数据到底差多少、还有哪些坑是文档里绝不会写的。如果你正要做一个 LoRa 传感网项目,或者已经在为网络不稳定掉头发,这篇应该能帮你少走不少弯路。需要说明的是,文中的测试数据来自我在城市小区、郊野公园两种场景下的实测结果,硬件平台以 SX1268 433MHz / SX1276 470MHz 为主,环境不同结论可能略有差异,但取舍逻辑是通用的。

2. 路线拆解:从“无脑广播”到“分层协议栈”

2.1 洪泛:最原始的自组织逻辑

洪泛的意思一句话就能说明白:节点收到一包数据,如果它不是给自己的,就直接转发出去。这种方式最大的优势是几乎没有组网开销,不需要维护路由表,也不需要知道网络的拓扑结构,任何一个节点进入网络就能立刻干活。

它的代价也同样明显——广播风暴。在一个 10 个节点的网络里,一包数据会被反复复制转发多次,信道占用呈指数级增长。我最早用纯洪泛做过一个 30 节点的温湿度采集网,在每 10 秒上报一次的情况下,实测信道冲突率接近 40%,网关收到的重复包占了有效负载的一半以上。这是因为 LoRa 是半双工的,一个节点在发射的时候会占住整个信道,一旦大量节点同时转发,冲突就不可避免。

但洪泛有一个门道:LoRa 的每个包天然携带 RSSI(接收信号强度指示值)和 SNR(信噪比)。你完全可以在转发逻辑里加上“弱信号不转发”的规则,让只有信号足够好的节点才参与转发。这么做能把参与转发的节点数量砍掉一半以上,同时又不破坏洪泛的“免组网”特性。实际做的时候,RSSI 阈值不是拍脑袋设的,而是要在部署区域里拿几个节点实测信号分布,再拿中位数做基准。

2.2 路由:从“所有人都转发”到“有人探路”

路由路线的本质是把“广播”换成“单播”。先通过一种发现机制把路径找出来,之后节点就沿着这条路径精确转发,不再需要全网广播。LoRa 自组网里常见的路由协议有 AODV、DSR 和 RPL 这几类,我三个都试过,最推荐从 AODV 入手,它对动态拓扑的适应能力比较均衡,实现上也相对成熟。

AODV 的逻辑不复杂:源节点发一个 RREQ(路由请求)广播出去,中间节点收到后先记录“我是从哪个邻居听到这个请求的”,再继续转发;当 RREQ 到达目标节点后,目标节点沿着记录的路径回一个 RREP(路由回复),源节点就有了完整的路径。听起来干净利落,但放到 LoRa 上有个现实问题:LoRa 的速率太低了,SF10、带宽 125kHz 时有效速率可能只有几百 bps,一个 RREQ 包本身就要占几十毫秒的空中时间,等整个路径建立起来,可能已经过了好几秒。

这就带出一个很关键的设计取舍:路由发现不能像 WiFi 那样频繁做,而应该是一次建立、长期复用,只有当路径断了才重新发起发现。我们实际工程里把路由表老化时间设成了 30 分钟,只有当连续 3 次数据包无 ACK 才触发重寻路。这个参数比协议本身更影响网络稳定性,必须根据你数据的采集频率动态调整。

2.3 网络栈:把传统网络的层次思维搬进来

网络栈这条路跟前两者最大的区别,是它不再把“网络层”和“链路层”混在一起,而是像 TCP/IP 那样分层处理。在 LoRa 自组网里,常见的做法是参考 IEEE 802.15.4e 的 TSCH(时隙跳频)思想:把时间切成固定时隙,每个节点在专属的时隙里发送数据,其他时间休眠,同时在物理信道之间跳频避开干扰。

分层带来的直接好处是可控性。你可以用底层时隙机制保证不冲突,用上层的 mesh 路由保证路径冗余,再用传输层的分片重组解决 LoRa 单包长度有限的问题。坏处也显而易见:协议栈复杂度上来了,开发和调试成本成倍增加。LoRaWAN 本身就是一个分层协议栈,但它依赖中心化的网关;自组网场景下你需要的是一个去中心化但又有分层的栈。我们最后用的是基于 LoRaMesh 改造的方案,在应用层之上叠加了自己的信令协议,才勉强达到了生产可用的水平。

每一条路线都不是银弹。选型时你需要先回答一个问题:网络的规模预期是多少?20 个节点以内,洪泛完全够用;20 到 100 个节点,路由是性价比最高的选择;100 个节点以上还要考虑多跳实时性,那网络栈几乎是绕不开的。

3. 一步一坑:三条路线的落地方案与参数细节

3.1 洪泛方案落地的三个关键参数

洪泛方案的工程实现其实只有三个参数需要重点调:最大跳数、RSSI 转发阈值、重传抑制时间。最大跳数直接限制了广播风暴的半径,比如一个覆盖半径 500 米的网络,每一跳按 200 米算,那最大跳数设成 3 就够了,再多就是白白浪费信道。RSSI 转发阈值的作用前面提过,它决定了哪些节点有资格转发;重传抑制时间则是让收到重复包的节点在一定时间内忽略相同来源的包,避免立即二次转发。

我踩过最大的坑是重传抑制时间。一开始设了 500ms,结果在一个多跳链路的场景里,下游节点收到数据后要等 500ms 才允许转发,整条链路的时延直接拉到了秒级,数据实时性彻底没戏。后来改成了 100ms,同时配合“包 ID + 源地址”去重,时延降到了 300ms 以内,而且没有出现明显的重复包爆炸。

在实际测试中还发现一个反常识的现象:降低发射功率反而能提升洪泛网络的吞吐量。因为洪泛网络里真正的瓶颈是信道冲突,而不只是覆盖距离。把 SF 从 10 降到了 7,单包空中时间从 300ms 左右降到了 50ms 以下,虽然单跳距离缩短了,但在多跳接力模式下,单位时间内整个网络能发出的数据量反而上去了。如果你的网络节点密度够大,不妨试试用低 SF 换吞吐。

3.2 AODV 路由在 LoRa 上的改造要点

LoRa 上跑 AODV 不能拿现成的 Linux 实现直接搬,必须针对射频特性做改造。我做的第一版是用标准的 AODV,结果一个 15 节点的链式拓扑里,路由发现过程占了整个通信周期的一半,节点大部分时间都在“找路”,真正传数据的时间被压缩到了可怜的地步。

改造方向有三点。第一,把 RREQ 重试次数从默认的 3 次降到 2 次,因为 LoRa 一个 RREQ 广播的空中时间可能长达几百毫秒,重试太频繁会导致信道拥塞。第二,在 RREP 里携带 RSSI 信息,让源节点可以同时评估路径的“连通性”而不是只看跳数。第三,把路由表容量限制在 16 条以内,超过就按最久未使用原则淘汰。LoRa 节点的内存通常只有几十 KB,路由表膨胀会直接挤占通信缓冲区,导致大量丢包。

路由建立之后的稳定性也值得关注。我们把每条路由的 ACK 间隔压到了 15 秒,也就是说 15 秒内没有收到下一跳的 ACK,就判定这条路断了,立即启动局部修复,而不是直接从头做全网路由发现。这个优化让链式拓扑的断线恢复时间从 6 秒降到了 2 秒左右,体感提升非常明显。

3.3 TSCH 风格网络栈的搭建思路

网络栈方案的门槛最高,但天花板也最高。我们实现的是一个简化版 TSCH:先把时间划分为定长的周期帧(例如 2 秒一个周期),每个周期内分成 50 个时隙,每个时隙 40ms;每个节点在分配到的时隙里发射,在非发射时隙里接收或休眠。这种机制从根本上消除了同频干扰带来的随机冲突,因为每个发射行为都发生在约定好的时间窗口内。

搭建的时候要特别注意“时钟漂移”问题。LoRa 节点用的晶振精度一般是 20ppm 左右,两个节点间的时钟漂移累积起来,会导致时隙错位。所以我们必须在每个超帧里留出一个“维护窗口”,所有节点在窗口内广播自己的绝对帧号,其他节点收到后校准本地时钟。这个维护窗口不能省,一旦省了,跑 24 小时后整个网络就会出现严重的时隙偏移。

网络栈方案另一个加分项是它能天然支持“低功耗侦听”。节点绝大部分时间处于休眠状态,只有在自己时隙前几毫秒才唤醒接收。实测下来,一个 5 分钟上报一次的节点,休眠电流能做到 10uA 以下,平均功耗比洪泛方案低了近 50 倍。这也是为什么在电池供电和节点数多的场景下,网络栈是唯一能长期自持的方案。

4. 量化对比:三套方案的实测数据与结论

为了把争议变成数据,我在同一块场地上、同一批硬件里分别跑了三套方案。硬件统一用 STM32L0 + SX1268,发射功率固定 22dBm,天线高度 1.5 米,场景一个是城市小区(建筑密集,多径明显),一个是郊野公园(地势开阔,遮挡少)。每个方案部署 25 个节点模拟多跳场景,网关位于中心位置,数据上报周期统一设为 30 秒。

4.1 关键指标实测结果

指标纯洪泛AODV 路由TSCH 网络栈
组网时间(25 节点)即时(无需组网)8~12 秒30~50 秒
端到端时延(3 跳)150ms 左右400ms 左右300ms 左右
数据包到达率(小区)84%93%97%
数据包到达率(公园)90%96%99%
平均节点功耗(1 小时)26mAh13mAh4mAh
网关接收重复包占比40%5%<1%
节点内存占用3.2KB9.8KB17.5KB
扩展极限(估计)30 节点左右100 节点左右300+ 节点

先说到达率。在小区场景下纯洪泛只有 84%,这个数字其实已经低于很多项目的最低要求了。原因是小区环境多径效应严重,同一个区域里多个节点同时转发同一个包的概率大增,冲突率和漏检率高。AODV 因为路径是单播的,转发者固定为一个节点,冲突概率骤降;TSCH 网络栈则因为时隙机制从根本上避免了并发发射,所以在两个场景下到达率都最高。

功耗方面差距更悬殊。洪泛模式下每个节点都可能是转发者,接收状态和发射状态频繁切换,电流根本降不下来;AODV 只有在转发时才全速发射,其余时间可以低速侦听;TSCH 节点大部分时间在休眠,功耗低了不止一个量级。如果节点是用两节五号电池供电、要求续航半年以上,洪泛方案基本就可以直接淘汰了。

内存占用这点容易被忽略。洪泛方案只维护一个包头去重表,3KB 左右就够;AODV 要维护路由表、RREQ 缓存和邻居列表,10KB 上下;TSCH 因为要有超帧调度、邻居管理、时隙分配表,17KB 跑不掉。选型之前一定要对照芯片规格书看 RAM 余量,否则代码写完才发现塞不进包就尴尬了。

4.2 实测定点测试过程与图表记录

测试流程我是这样跑的:每个节点以 30 秒周期上报温湿度;网关上记录收到的时间戳、包序号、RSSI 和转发次数;连续跑 30 分钟后统计到达率。为排除偶发干扰,一个方案跑完会休息 5 分钟再跑下一个。城市的测试刚好赶上上午高峰,路上汽车多,对 LoRa 的 470MHz 频段有些邻频干扰,但因为三个方案都测在同一时段,横向对比仍然有效。

最有意思的一组数据是网关收到的重复包占比。洪泛方案里,一个来自最远节点的数据包,经常被 4 到 5 个中间节点重复转发,网关收到同一包的多个副本是常态。AODV 方案因为有路由表定向转发,重复包几乎绝迹。这个差异直接影响了网关的软件设计——洪泛网关要花大量精力去重,而路由模式的网关只需要做 ACK 超时重传,代码逻辑完全是两码事。

从扩展性的推算来看,洪泛网络在 30 个节点左右就已经逼近瓶颈,因为信道资源被广播包吃掉了大半;AODV 在 100 个节点内都能维持 90% 以上的到达率,再往上路由表维护的开销会压过收益;TSCH 网络栈理论容量最大,但实现代价也最大,它需要每个节点做时间同步和调度协调,节点越多,超帧的规划和维护就越困难。所以“哪个方案最好”这个问题,永远要加上一个前提:你的节点数和数据频率是多少。

5. 工程实战中的高频问题与排查手记

5.1 洪泛网络“全部节点都有信号,但就是传不出去”

这个现象我查了很久才找到根因。看起来每个节点都能收到上一跳的数据,但到达网关的包极少。后来用频谱分析仪盯着看才发现,问题出在“多节点同时转发”:两个中间节点在同一个信道上、几乎同一时间往外发相同的数据包,在网关这边形成强碰撞,结果全盘皆输。

解决办法有两个方向。一是把洪泛改成带随机延时转发,即收到包后等待一个随机长度的时间再决定是否转发,这个等待时间必须在 0 到全包传输期的 2 倍之间随机取值。二是给不同跳数的节点预设不同的发射 SF,让上一跳和下一跳不在同一速率上,天然错开时间窗口。两者结合起来以后,洪泛方案的到达率能回升 10 个百分点左右,但代价是端到端时延增加了 200ms 上下,需要结合场景做取舍。

5.2 AODV 的路由环路问题

AODV 在拓扑变化频繁时容易产生路由环路,比如两个节点同时断开又重新连接,旧路由还没失效,新路由已经开始建立,数据包就会在两个节点之间来回跳。标准的解决办法是让每个数据包携带跳数计数器,超过最大跳数直接丢弃,同时回送一个路由错误消息,让上游节点重新发起路由发现。这个机制一定要做,不做的话环路会把电池一直耗到没电。

不过在 LoRa 上做环路检测有个特殊的地方:LoRa 本身单包最大只有 255 字节,跳数计数器这种控制字段会挤占有效负载。我们选择在应用层数据包头里只保留 3 位跳数计数,最大支持 7 跳,超过就丢。如果你的网络确实需要超过 7 跳,可以适当加长数据包头,但一定要和有效负载长度做权衡,分片传输的代价远大于省下这 3 个比特。

5.3 TSCH 网络栈的时隙错位排查

TSCH 方案最隐蔽的问题是“看似同步、实则漂移”。节点在出厂时做了时钟校准,刚开始跑一天完全正常,到第二天就出现随机丢包。排查的时候直接看节点日志里记录的预期发送帧号和实际发送帧号差异,发现问题节点每次都要偏差 20ms 左右。原因是它在维护窗口内没有成功地收到基准节点的广播帧,本地时钟没有得到校准。

这种问题解决起来不复杂:在超帧里加一个强制同步逻辑——连续两个维护窗口没收到基准帧的节点,自动切换到“搜网模式”,全信道扫描窗口信号重建同步。另外把维护窗口间隔从 2 秒缩短到 1 秒也能显著减少漂移累积,代价是降低了休眠占比,平均电流会上升 0.5uA 左右,属于可以接受的量级。我在文档里很少看到有人提这一条,但实测下来它比任何参数调优都重要。

6. 选型建议:到底选哪条路

根据我们这些项目里的“折返跑”经验,我最终会按这样一条线来推荐。如果节点数不超过 30、对功耗不敏感、随时可能有节点增删、还希望零配置部署,那就安心用洪泛,关键是调好跳数和重传抑制时间。如果你需要做到 100 个节点左右、要求数据稳定到达、但也接受秒级组网时间,AODV 或者简化的 RPL 路由是性价比最高的选择。如果你的项目面向长期无人值守运行、节点数量奔着 200 以上去,那不要挣扎了,直接上 TSCH 风格的网络栈,前期多付出的开发时间会在后期运维里几十倍地赚回来。

这里要特别提醒一句:不要因为在实验室里洪泛跑得好就不加思考直接上量产。实验室环境干净,干扰少、节点少、数据量低;真实环境有树、有墙、有车辆、有别人的无线电信号。我自己在项目里就吃过这种亏,实验环境 99% 到达率,一上现场打了对折。硬件方案定型前,最好在目标现场先拉一组真实节点做 24 小时稳定性摸底,这个投入远比“上线后救火”更划算。

7. 我在几轮迭代中的真实体会

做完这几轮方案对比,最大的感受是:LoRa 自组网没有“最好”的协议,只有“最匹配需求”的组合。洪泛的简单是它的护城河,路由的可控是它的卖点,网络栈的复杂度则是在换取极致的可靠和功耗。每一次方案切换,本质上都是拿一类指标交换另一类指标,没有谁是在所有维度上都赢的。

如果让我给一个在手项目的建议:从小规模起步,先在洪泛上把业务跑通,同时把路由和网络栈的软件框架预留好接口。等业务量上来、节点数逼近当前方案的瓶颈时,再平滑切到高一层方案。这样做的好处是,前期的业务验证不会被协议复杂度拖死,后期的扩容又不必推倒重来。我们在项目中就是这么干的,目前线上跑的是一个“洪泛 + 简单路由混合”的模式:默认洪泛转发,一旦检测到重复包过多,自动启用局部路由缓存,相当于两条路线之间的过渡态。这种渐进式策略,应该比较贴合多数团队的迭代节奏。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询