LoRaWAN 的 ADR 为什么值得关注
部署 LoRaWAN 网络时,很多团队会遇到一个两难:扩频因子选低了丢包,选高了信道容量上不去。LoRaWAN 的自适应数据速率机制(ADR)正是为了解决这个矛盾出现的。它在 SF7 到 SF12 之间动态调整,尝试在覆盖距离和吞吐量之间找到平衡点。但 ADR 不是“自动优化黑盒”,它有清晰的作用范围和前提条件。这篇文章从工程角度聊聊 SF 差异带来的实际影响,以及 ADR 应该在什么场景下用、该怎么配、什么时候该关掉。

扩频因子 SF7 到 SF12 到底改变了什么
先理清基础。LoRa 使用 CSS 调制,扩频因子 SF 决定一个符号能承载多少信息位。SF7 时每个符号传递 7 bit,SF12 时传递 12 bit,但符号时间更长,数据速率随之降低。在同样的发射功率和环境条件下,SF 越高,解调门限越低,接收灵敏度越好,信号能在更弱的情况下被正确解调,所以有效覆盖距离变大。
不过这里有个容易误判的地方:每提升 1 个 SF,灵敏度通常只改善 2~3 dB,折算成距离并非翻倍,大体上只增加 20%~30%。从 SF7 升到 SF12,总共 5 档,灵敏度改善约 12~15 dB,在开阔地里覆盖半径可能增加一倍多,但实际还要被天线高度、植被、建筑遮挡和同频干扰大幅削弱。指望从 SF7 到 SF12 就能“覆盖整个城市”并不现实。
下面这张表基于 125 kHz 带宽、编码率 4/5 的常见配置,列出了 SF7 到 SF12 的数据速率和典型接收灵敏度。
| 扩频因子 | 数据速率 | 典型灵敏度 | 相对覆盖参考 |
|---|---|---|---|
| SF7 | 5470 bps | -123 dBm | 基准 |
| SF8 | 3125 bps | -126 dBm | 约 1.15 倍 |
| SF9 | 1760 bps | -129 dBm | 约 1.3 倍 |
| SF10 | 980 bps | -132 dBm | 约 1.5 倍 |
| SF11 | 440 bps | -134 dBm | 约 1.75 倍 |
| SF12 | 250 bps | -137 dBm | 约 2 倍 |
不同厂家芯片的灵敏度数值会有 1~2 dB 差异,表格适合做相对比较。真正的链路预算还要把发射功率、天线增益、馈线损耗和路径损耗模型放进来算。
ADR 是如何在 SF 之间做选择的
ADR 的基本思路并不复杂。网络服务器收集某个终端最近一段时间(比如 20 帧)的 RSSI 和 SNR,结合当前数据速率的解调门限估算链路余量。如果余量充足,就通过 LinkADRReq 命令让终端提高数据速率,也就是降低 SF;如果余量不足,就把速率调回去,使用更大的 SF。
为了避免频繁抖动,网络侧通常取窗口内的最大 SNR 而不是平均值,因为出现过好信号说明链路存在上调空间。不过这也会带来一个后果:ADR 对迅速变化的环境不敏感,在移动设备上经常做出过时的决策。
一个简化的 ADR 决策逻辑大致是这样:
def adjust_dr(snr_history, dr_current, margin_db):
# 取最近窗口内最好的一次 SNR
snr_max = max(snr_history)
snr_threshold = demod_threshold[dr_current]
link_margin = snr_max - snr_threshold
if link_margin > margin_db:
return min(dr_current + 1, dr_max) # 提高速率,降低 SF
elif link_margin < 0:
return max(dr_current - 1, dr_min) # 降低速率,增大 SF
else:
return dr_current # 保持当前 SF
这里的 margin_db 是留给链路的额外余量,一般取 8~15 dB。城市环境高楼多、信号波动剧烈,margin 要调高;开阔农场 8 dB 就够。LoRaWAN 标准里还有 ADRACKReq 机制,节点如果多次没有收到下行指令,可以主动请求网络重新发 ADR 指令,这相当于一个兜底。
实际部署中 ADR 的常见误区
第一个误区是认为 ADR 能替代现场链路测试。ADR 依赖终端真正上发的帧,如果设备在两个网关覆盖边缘,本身丢包严重,网络根本收不到足够样本来计算,更谈不上优化。第二个误区是让所有终端都开启 ADR。固定安装在屋顶、塔杆上的设备很适合,但车载、巡检机器人、随身定位器等移动终端,SNR 变化太快,ADR 算出的速率往往比实际位置慢半拍,很容易造成连续重传。第三个误区是认为 SF 越高越好。高 SF 确实灵敏度好,但单帧占用时间长,大量节点同时使用 SF12 会迅速耗尽信道容量,实际吞吐量反而下降。
举两个真实典型的场景。
在农业大田项目里,节点分布在几公里范围,环境空旷但季节变化大。最初全部开启 ADR,网络把一部分上行质量好的节点调到了 SF8,结果到了雨季,树叶和湿度让链路余量迅速下降,重传率明显升高。后来限定了速率上限为 SF10,并把 margin 调到 12 dB,情况才稳定。另一个城市地下泊位项目,地磁节点埋在地表下,上方偶尔有金属板遮挡,信号衰减大但相对固定。固定用 SF7 时上报成功率不到 70%,网络通过 ADR 把速率降到 SF10 之后,成功率升到 95% 以上。代价是节点空中时间变长,单网关可容纳的节点数量要相应减少。
覆盖距离与吞吐量如何取舍
吞吐量不能只看单个终端的速率。LoRaWAN 是共享信道,同一区域内所有 SF 的数据都在同一无线环境中争抢时间。SF 越低,单帧的 on-air 时间越短,相同时间内能容纳的上报就越多。SF7 的单帧时间不到 SF12 的十分之一,这意味着在容量指标上,一个纯粹由 SF7 组成的网络,理论上要比 SF12 网络每信道承载更多节点。
所以在规划速率时,通常按业务场景分类处理。
| 场景 | 建议 SF 范围 | 主要原因 |
|---|---|---|
| 城市密集网关 | SF7~SF9 | 控制空中时间,降低同频冲突 |
| 郊外稀疏覆盖 | SF10~SF12 | 覆盖优先,单节点业务量低 |
| 移动终端 | 固定 SF8 或 SF10 | ADR 跟不上位置变化,固定值更可控 |
| 井盖、地下室 | 固定 SF10 以上 | 穿透损耗大,低速率换取解调余量 |
这张表适合作为初始配置。真实工程里还要结合每个节点的上报频率和数据包大小,因为同样的 SF 下,包越长占用信道时间越长,容量压力完全不同。
落地时应该怎么配置 ADR
我比较推荐分步走。
- 先把所有节点配置为固定速率,不开启 ADR,连续收集一到两周的 RSSI、SNR 和丢包率,这一步能把底噪地图画出来。
- 根据数据把节点分成三类:信号余量大且稳定的节点,允许 ADR 把它们向上调整;余量中等但波动明显的节点,设置较低速率上限;余量本身就紧张的节点,固定使用 SF10 或 SF12。
- 开启 ADR 时,除了 margin,还要设置速率上限和信道限制。不同地区的 LoRaWAN 规定可能不一样,比如有的区域不允许某些终端上报太快,需要遵守当地法规。
- 对移动终端要单独特判,不要简单沿用固定节点策略。移动场景下,关闭 ADR,用固定 SF8 或 SF10 往往比自适应更可靠。
还需要想清楚一点:ADR 的收益不是无条件的。速率提升后,终端功耗会随空中时间缩短而下降,这是好的一面;但换来的吞吐量提升只有在低 SF 节点占少数时明显。当网络中所有节点都试图追求最低 SF,网关的下行调度和信道规划将变得复杂,甚至出现因为重传增加而整体容量下降的情况。
结语
SF7 到 SF12 的跨度代表了 LoRaWAN 在覆盖距离和吞吐量之间最有价值的一段“调节区”。ADR 让网络可以基于真实链路质量自动切换速率,但它不是一个万能旋钮,更依赖于稳定的链路反馈和合理的配置前提。对于固定设备,ADR 值得投入精力去调优;对于移动设备和恶劣环境,手动固定速率才是更务实的选择。理解这一点,比记住任何一组参数都重要。
原创文章,作者:fudengji,如若转载,请注明出处:https://fudengji.cn/article/992/