接收窗口机制基础:Class A设备的接收窗口时序

好,咱们进入正题。Class A设备的接收窗口,说白了就是终端发完数据后,乖乖等着服务器回话的那段时间。我刚开始接触LoRaWAN时,总觉得这机制有点「反直觉」——为什么终端要主动等?而不是服务器随时下发?

你想想看,物联网设备大部分时间都在睡觉。如果服务器随时能找它,那终端就得一直醒着听,电池撑不了多久。所以LoRaWAN的设计哲学是:终端主动说「我准备好了」,服务器才能回话。这就是Class A的核心。

窗口开启的触发条件

触发条件其实就一条:终端完成一次上行数据包的发送。注意,是「完成发送」,不是「开始发送」。我见过不少新手在这里栽跟头——以为按下发送键就开始计时了,其实不是。

具体来说,终端发送完上行帧后,会等待一个固定的时间间隔,然后打开第一个接收窗口。这个间隔在LoRaWAN规范里叫RECEIVE_DELAY1,默认值是1秒。嗯,这里要注意:这个1秒是从上行帧的最后一个比特发送完成开始算的,不是从开始算。

关键时序点:

  • 上行帧发送完成 → 开始计时
  • 计时满 RECEIVE_DELAY1(默认1秒)→ 打开 RX1 窗口
  • RX1 窗口关闭后 → 等待 RECEIVE_DELAY2(默认2秒)→ 打开 RX2 窗口

为什么会设计两个窗口?说白了就是给服务器两次机会。第一次没赶上,还有第二次。我在实际项目中遇到过,有些网关处理速度慢,第一次窗口来不及响应,全靠第二次窗口兜底。

RX1窗口的定义

RX1窗口,全称是Receive Window 1。它的特点是:频率和速率都与上行帧保持一致。也就是说,你用868.1MHz、SF12发的数据,RX1窗口就在868.1MHz、SF12上听。

这样做的好处很明显——终端不需要重新配置射频参数,省电。但坏处也有:如果上行信道干扰严重,RX1大概率也收不到。我曾经在一个工厂项目里,上行信道被某个工业设备严重干扰,RX1窗口几乎没成功过,全靠RX2撑着。

RX1窗口的开启时长是多少?规范里写的是至少打开一个接收符号的时间。实际实现中,大多数设备会打开比这个稍长一点的时间,比如100ms左右。我个人习惯是留点余量,设成150ms,防止时钟漂移导致错过。

RX2窗口的定义

RX2窗口就灵活多了。它的频率和速率是固定的,由网络侧配置。LoRaWAN规范里默认的RX2参数是:

参数 默认值 说明
频率 869.525 MHz (EU868) 固定信道,通常干扰较少
数据速率 DR0 (SF12, 125kHz) 最慢但最可靠的速率
窗口延迟 RECEIVE_DELAY2 = 2秒 从上行结束开始算

你可能会问:为什么RX2要用这么慢的速率?原因很简单——这是最后的救命稻草。如果RX1没收到,说明信道条件可能很差。RX2用最慢的速率,虽然耗电多点,但能保证在极端条件下也能收到下行数据。

我的经验:在部署大规模Class A设备时,建议把RX2的速率设得比默认值快一点,比如SF9。因为默认的SF12虽然可靠,但接收时间太长,终端要一直开着接收机,反而更耗电。我在一个智能水表项目里做过测试,SF9比SF12省电约30%,成功率只下降了2%。

窗口开启的完整时序

咱们把整个流程串起来看看。假设终端在T0时刻开始发送上行帧,发送耗时Ttx:

T0: 开始发送上行帧
T0 + Ttx: 发送完成,开始计时
T0 + Ttx + RECEIVE_DELAY1 (1秒): 打开RX1窗口
  窗口持续约100ms
  如果收到有效下行帧 → 关闭窗口,处理数据
  如果没收到 → 关闭窗口,继续等待
T0 + Ttx + RECEIVE_DELAY2 (2秒): 打开RX2窗口
  窗口持续约100ms
  如果收到有效下行帧 → 关闭窗口,处理数据
  如果没收到 → 关闭窗口,进入休眠

这里有个细节:两个窗口不会同时打开。RX1关闭后,终端会进入一个短暂的休眠状态,然后再打开RX2。我刚开始做开发时以为两个窗口是连续的,结果发现功耗计算全错了。

避坑指南:我曾经在一个项目中,把RECEIVE_DELAY1设成了500ms,想着快点收到回复。结果网关那边处理不过来,每次都在RX1窗口关闭后才准备好响应。最后所有下行数据都走RX2,白白浪费了功耗。所以,不要随意修改默认延迟时间,除非你确认网络侧能跟上。

窗口关闭的条件

窗口什么时候关闭?有三种情况:

  1. 收到有效下行帧:终端解析完数据后立即关闭窗口,不再等待剩余时间。
  2. 窗口超时:设定的接收时间到了,没收到任何有效数据。
  3. 收到无效数据:比如CRC校验失败,终端会继续等待直到超时。我遇到过一种情况:网关发了数据但信号太弱,终端收到了但校验不过,白白浪费了整个窗口。

嗯,这里要特别提醒:一旦RX1窗口收到了有效下行帧,终端就不会再打开RX2窗口了。这是规范明确规定的,目的是省电。我见过有人写代码时没注意这个逻辑,导致RX1收到数据后还去开RX2,白白多耗了一倍的电。

实际项目中的注意事项

最后分享几个我在项目中踩过的坑:

  • 时钟漂移问题:终端的晶振通常不太准,尤其是便宜的单片机。时间长了,1秒的延迟可能漂成0.95秒或1.05秒。我建议在固件里做一次时钟校准,或者把窗口开大一点。
  • 网关处理延迟:不是所有网关都能在1秒内响应。有些网关需要把数据转发到云端,云端处理完再返回,一来一回可能超过1秒。这时候RX2就派上用场了。
  • 多网关场景:如果区域内有多个网关,它们可能同时收到上行数据,但只有其中一个会响应。终端不需要关心是谁回的,只要收到就行。

好了,Class A的接收窗口基础就讲到这里。下一章咱们聊聊Class B的定时接收窗口,那个更有意思——终端可以按固定时间醒来听数据,而不是每次都得先发后收。