1. 前言

最初,A类设备出现了,专家们觉得是好的,于是在A类上行接收窗口外,常开了接收窗口2,于是出现了C类设备。

A类设备实时性低,功耗也低,C类设备实时性高,功耗也高,于是专家们设计了精密的时钟同步系统,网关定期广播时间,节点定期打开接收窗口,兼顾功耗与实时性,于是出现了B类设备。

最后专家们觉得还不够复杂,于是设计了基于B、C类的多播协议,然后是基于多播协议的分段数据块传输协议,再然后是基于分段数据块传输协议的OTA固件升级协议。

在深入LoRaWAN的过程中,我发现时钟同步的概念贯穿到每一个环节,节点何时发送、何时接收、又如何兼顾实时性与低功耗?梳理清楚这个问题,就能逐步搭建复杂的应用层协议。

PS:下面的内容基于LoRaWAN 1.0.3版本,由于博主是服务端开发人员,对物理层与嵌入式设备的理解还不够深入,因此在专业名词翻译上可能存在一些不准确的表述,原始文档请参考

2. 设备数据收发

2.1 数据帧格式

上行数据帧格式

Preamble PHDR PHDR_CRC PHYPayload CRC

下行数据帧格式

Preamble PHDR PHDR_CRC PHYPayload

2.2 数据发送

节点发送数据

  • 随机跳频:从可用的上行信道中选取一个,若无法使用,则再随机抽取一个
  • LBT机制:选取信道后,发射数据前,首先侦听该信道是否被占用,若无占用则开始发送数据
  • 休眠与接收:标准A类设备发射结束后进入休眠,并在随后的1秒和2秒的时间节点附近进行接收,B、C类设备会有额外的接收窗口

网关发送数据

  • 从网关下行队列中直接取数据按给定信道、速率发射,无跳频与LBT

2.3 数据接收

节点接收数据

  • 接收窗口频率与速率:A类设备在每次上行结束后,都会开启两个短暂的接收窗口,其中RX1按区域参数定义,随节点上行频点和速率变化,RX2在RX1接收失败时打开,RX2的频点、速率与C类单播/多播一致,按区域参数定义固定频点和速率
  • 接收窗口持续时间:不同区域具有不同的前导码设计,接收窗口持续时间必须足够让节点探测到下行信号
  • 校验:节点在接收数据的过程中,可根据区域参数定义的数据格式检查数据帧、执行CRC校验、DevAddr比对等,若出现异常,可随时中断接收

网关接收数据

  • 接收窗口频率与速率:网关最多可同时侦听8个信道,N个速率,N在区域参数中定义,例如CN470速率为DR0~DR5,网关最多可同时侦听8x6=48个频点+速率的组合
  • 接收窗口持续时间:半双工网关在同一时刻只能接收或发送数据,只要不发送数据,就一直处于接收状态;全双工网关可同时接收和发送数据,相当于一直处于接收状态
  • 校验:类似节点,由于网关只做透传,仅执行CRC校验,不核查DevAddr

3. A类设备

classa_device

  • 节点发射数据的速率慢,最长可能长达数秒
  • 数据传输速度接近光速,可认为发射(Transmit)结束的那一刻,节点和网关的时间是对齐的
  • 节点发射结束后进入休眠,并分别在接下来的1s和2s的时间点附近打开接收窗口,短时间内可认为节点内部晶振稳定,不会令时间大幅度偏移
  • 网关接收数据完成的后,为数据打上当前时间戳(SX1301芯片内部时间),发送到服务器
  • 服务器处理数据,若有回包,则在上行数据包时间戳(SX1301芯片内部时间)的基础上加1s或2s,并下发给网关
  • 网关接收到服务器回包,根据当前SX1301内部时间,在网关下行队列中插入数据,并在节点打开接收窗口RX1或RX2时,通过射频发送
  • 上述的整个流程只需要使用SX1301的内部时间,且只取相对时间

4. C类设备

classc_device

  • 包含A类设备的所有特性
  • 持续侦听,除节点上行数据、节点侦听RX1、节点接收数据外,都按RX2设定的频点和速率进行侦听,随时接收数据
  • 服务器主动下行时,数据包不含SX1301内部时间,而是将imme标志位置为true,提示网关尽快下发

5. B类设备

5.1 GPS

GPS全称是全球定位系统,卫星搭载高精度时钟,最初的设计功能主要是提供全球定位功能,同时会广播一个时钟数据,因此也具备授时功能,精度相比NTP高很多,例如1981年的氢原子钟精度达到10^-14秒,使得定位误差可以降低到1米。

GPS的计时器每1024周会溢出反转,2012年及之前的iPhone和iPad系统都直接使用GPS进行对时,苹果当时也提前发布了警告通知,提醒用户升级系统,否则系统时间可能出现回退:https://support.apple.com/en-us/HT210239

GPS时间是绝对时间,是以原子振荡周期确定的原子时;世界时(太阳时间)是基于地球自转的天文测量而得出的;UTC时间(世界协调时)则是在原子时秒长基础上,在时刻上尽量接近世界时的时间计量系统。

GPS时间与UTC时间的互转可以通过查表(leap second table)的方式进行,给定一个UTC时间减去自GPS起始时间开始以来的所有闰秒,可以换算出GPS时间,反之可以从GPS时间得到UTC时间。

5.3 网关时间同步

  • 网关配备GPS模块和GPS天线接收GPS信号
  • GPS模块上电启动后,会持续同步位置信息与时间信息
  • GPS位置信息同步过程与GPS时间同步过程是独立的
  • GPS时间与SX1301时间在网关内部通过定时对齐完成同步,以便下发带GPS时间戳的数据
  • 网关按照区域参数定义的格式,以固定速率、频率,每128秒广播一次GPS时间(Beacon)
  • 多网关的场景下,通过高精度时钟确保不同网关能够在同一个相位内完成时间广播

5.4 节点时间同步

5.4.1 首次时间同步

  • 首次时间同步以A类模式进行
  • 节点上行DeviceTimeReq,配备GPS的网关接收到数据时,会同时打上GPS时间戳及SX1301时间戳
  • 服务器接收到数据后,将GPS时间戳编码进DeviceTimeAns,通过RX1或RX2下发给节点
  • 节点接收到DeviceTimeAns后,结合上次发射结束的时间换算出当前的GPS时间,完成同步

5.4.2 节点接收Beacon

  • LoRaWAN协议定义支持ClassB的网关每128秒广播一次Beacon,供节点同步时间
  • 节点首次同步时间后,可以快速换算出下一个Beacon的发射时间,既加快时间同步过程,也避免持续接收影响功耗
  • 节点接收到第一个Beacon后,完成第二次时间同步,后续会每128秒打开一次接收窗口,持续从网关同步时间,确保时间不会漂移

5.5 节点上报PingSlotPeriod && 切换ClassB

  • B类设备的接收窗口,按PingSlotPeriod大小N划分为2^N个接收窗口,称为PingSlot
  • 128秒的周期由2^N个PingSlot和Beacon接收窗口组成
  • N取值范围是0~7,即节点可根据配置,在128秒的周期内开放1~128个B类接收窗口
  • 节点在这一步做确认上行,上报的PingSlotInfoReq必须得到服务器的PingSlotInfoAns,确保双方完成同步
  • 获取PingSlotInfoAns成功后,节点立刻上报一帧ClassB标志位置为1的数据帧,提示服务器节点已经进入ClassB模式

5.6 服务器主动下行

  • 服务器可根据存储的节点devAddr、PingSlotPeriod、UTC时间、区域参数定义等,计算出节点下一个PingSlot打开的时间和频率、速率
  • 服务器下发数据前打上计算出GPS时间,网关根据GPS时间换算SX1301时间,并在节点打开接收窗口时下发

5.7 时序

classb_device

  • B类设备包含所有A类设备的特性
  • B类设备除定时接收Beacon外,还会定期打开PingSlot接收服务器的主动下行
  • 每个节点会根据自身的devAddr生成的初始PingSlot窗口时间,即接收Beacon结束后打开的第一个PingSlot,实现时分复用
  • 按区域参数定义,部分频率计划固定B类主动下行频率和速率,部分预设信道的频率计划会根据PingSlot自动调频选择下行频率,实现频分复用

6. 多播

6.1 单播、广播与多播的区别

  • 节点和网关发射数据时,在无线环境下始终是广播的形式
  • 多播下行数据帧与单播下行数据帧格式一致
  • 单播:对于同一帧服务器下行数据,可能存在N个节点接收,但只有目标节点完成接收处理,获得原始数据,从最终结果看,是点对点通信
  • 广播:对于B类场景,当网关定时广播时间数据时,所有频率计划相同的B类节点都可以接收处理数据,相当于一对所有通信
  • 多播:也称为组播,若一批节点同时配置了一组相同的devAddr、nwkSKey、appSKey,那么对于一帧服务器多播下行数据,这一批节点都可以完成接收处理,获得原始数据,而组外节点则不会响应,从最终结果看,相当于一对一组通信

6.2 密钥同步

  • 节点单播时使用单播地址和单播密钥,配置为多播节点时,额外增加一套多播地址和多播密钥
  • 同一个分组内的节点具有相同的多播参数,包括密钥、频率、速率等
  • 密钥可通过手动配置,也可通过多播组创建协议自动从服务器配置

6.3 C类多播

  • C类节点的RX2与C类单播、C类多播一致,无额外的时序
  • C类节点进入主动接收的状态下后,在RX2的频率、速率下侦听信号,可接收A类下行、C类主动下发及C类多播下行
  • 节点根据接收到的数据帧devAddr取对应的密钥解析数据

6.4 B类多播

  • 在B类单播的章节中,我们知道
    • 每个B类节点根据devAddr计算出各自的初始PingSlot起始时间
    • 128的周期由2^N个PingSlot和Beacon接收窗口组成
  • B类多播设备至少拥有一个devAddr和一个mcAddr,因此将在单播的基础上,再次插入一组PingSlot,并按区域参数定义侦听指定的频点和速率
  • 不同于C类节点,B类多播节点将轮流侦听单播和多播模式下指定的频点,以接收服务器的主动下发