4、自适应数据速率(ADR)原理
4.1 ADR概念:它到底解决了什么问题?
自适应数据速率,英文叫 Adaptive Data Rate,简称 ADR。说白了,就是让 LoRaWAN 终端设备自己“找”一个最合适的数据速率来干活。
我刚开始接触 LoRaWAN 时,有个问题一直困扰我:为什么同一个网络里,有的节点要发好几秒,有的几百毫秒就搞定了?答案就在数据速率上。LoRa 的数据速率从 DR0 到 DR5,速率越高,传输越快,但覆盖距离越短。反过来,速率越低,传得越远,但占空时间也越长。
ADR 的核心思想很简单:在保证通信可靠的前提下,尽可能用最高的数据速率。你想想看,如果一个节点离网关很近,信号强得很,还用最低的 DR0 慢慢发,那不是浪费信道资源吗?
关键点:ADR 不是让所有节点都用高速率,而是让每个节点找到自己的“最佳速率”。这个速率会随着环境变化而动态调整。
我在实际项目中遇到过这样的情况:一个部署在楼顶的传感器,白天信号很好,用 DR5 跑得飞快。到了傍晚,周围工厂开始作业,干扰一上来,丢包率就飙升了。如果没有 ADR,它还在傻傻地用 DR5 发,数据就全丢了。ADR 这时候会自动降速,保证数据能传回来。
4.2 ADR工作流程:网络侧和终端侧的分工
ADR 的工作流程,其实分两个角色:网络服务器和终端节点。它们各自干各自的活,配合起来才能把速率调好。
先说说网络服务器这边。它会收集终端节点最近一段时间(通常是 20 个包)的上行信号质量数据,包括 RSSI 和 SNR。然后根据这些数据,算出一个“建议速率”。这个建议速率会通过下行链路告诉终端。
终端节点呢?它有两种模式:
- 网络控制模式(默认):终端完全听网络服务器的。服务器说用 DR3,它就乖乖用 DR3。
- 终端自主模式:终端自己根据信号质量做判断。这种模式用得少,我一般不建议,除非你的网络服务器不支持 ADR。
具体的工作流程,我习惯把它分成三步:
- 采集阶段:终端用当前速率发数据,网络服务器记录每次的 RSSI 和 SNR。
- 决策阶段:服务器收集够样本后,计算链路预算余量。如果余量很大,就建议提高速率;如果余量不足,就建议降低速率。
- 执行阶段:服务器在下行链路中携带 ADR 命令,终端收到后调整速率。
我的经验:采集阶段至少需要 20 个上行包,样本太少的话,决策容易出错。我曾经遇到一个项目,客户把样本数设成了 5,结果速率一天跳好几次,数据反而更不稳定了。
4.3 上行链路与下行链路:谁说了算?
这里有个容易搞混的地方。ADR 的调整指令,是通过下行链路下发的。但决策依据,却来自上行链路的信号质量。
为什么会这样?因为 LoRaWAN 是典型的“上行主导”协议。终端主动发数据,网关被动收。网关没法主动知道终端那边的信号好不好,只能通过终端发上来的包来推断。
我举个例子你就明白了。假设终端用 DR2 发了一个包,网关收到了,SNR 是 10dB。这个 SNR 值就告诉网络服务器:嗯,信号余量很足,可以试试 DR4。于是服务器在下一次下行时,带上一个 LinkADRReq 命令,告诉终端:“下次你试试用 DR4 发。”
这里有个坑,我曾经踩过:下行链路本身也可能丢包。如果终端没收到 ADR 命令,它就会继续用原来的速率发。网络服务器如果没收到终端的确认,就会一直重发 ADR 命令。所以,我建议在终端侧实现一个“ADR 命令超时重试”机制,避免死循环。
注意:下行链路不是免费的。每发一次下行,就占用一次接收窗口。如果网络里节点很多,下行链路会成为瓶颈。我见过一个网络,下行链路拥堵导致 ADR 命令延迟了十几分钟才生效。
4.4 ADR与网络负载:别让速率调整变成灾难
ADR 调整速率,直接影响的是空中占用时间。速率越高,数据包在空中待的时间越短。这听起来是好事,对吧?但事情没那么简单。
你想想看,如果一个网络里有 1000 个节点,本来都用 DR0 慢慢发,每个包占空时间 2 秒。突然 ADR 把它们都调到了 DR5,每个包只占 100 毫秒。信道瞬间就空出来了,看起来效率提高了。但问题来了——
高速率意味着低灵敏度。那些离网关远的节点,用 DR5 根本发不过去。它们会一直丢包,然后 ADR 又检测到丢包,再降回低速率。这种来回震荡,我称之为“ADR 振荡”。
怎么避免?我个人习惯的做法是:
- 设置速率上限:根据节点的部署位置,手动设定一个最高速率。比如室外的节点,最高只允许到 DR3。
- 增加迟滞:不要 SNR 一达标就立刻升速,留 3-5dB 的余量。这样即使信号有小波动,也不会频繁跳变。
- 分批调整:不要所有节点同时做 ADR 调整。可以分批次,比如每 10 分钟调整一批,避免网络负载瞬间变化太大。
| 数据速率 | SF 因子 | 带宽(kHz) | 空中时间(ms) | 典型覆盖 |
|---|---|---|---|---|
| DR0 | SF12 | 125 | ~2000 | 远距离 |
| DR1 | SF11 | 125 | ~1000 | 较远 |
| DR2 | SF10 | 125 | ~500 | 中等 |
| DR3 | SF9 | 125 | ~250 | 较近 |
| DR4 | SF8 | 125 | ~125 | 近 |
| DR5 | SF7 | 125 | ~60 | 最近 |
这张表我经常拿出来看。你会发现,从 DR0 到 DR5,空中时间差了 30 多倍。这就是为什么 ADR 对网络负载影响这么大——一个节点从 DR0 升到 DR5,相当于释放了 30 倍的信道容量。
但反过来,如果一个节点从 DR5 降到 DR0,它就占用了 30 倍的信道时间。如果同时有几十个节点降速,网络可能瞬间就堵死了。嗯,这里要特别注意。
总结一下:ADR 是一把双刃剑。用好了,网络容量翻倍;用不好,网络稳定性崩盘。我的建议是:先保守,后激进。新部署的网络,先把 ADR 关掉或者设得很保守,等运行一段时间摸清规律了,再慢慢放开。
最后说一句,ADR 不是万能的。它解决的是“信号好但速率低”的问题。如果你的网络本身覆盖就有问题,节点信号本来就弱,那 ADR 也帮不了你。该加网关就加网关,该换天线就换天线,别指望 ADR 能包治百病。