3、LoRaWAN协议入门:Class A/B/C模式、入网流程与数据包结构

好,咱们今天聊聊LoRaWAN协议。说实话,很多刚接触LoRa的朋友,容易把LoRa和LoRaWAN搞混。LoRa是物理层的无线调制技术,而LoRaWAN是MAC层的网络协议。你可以把LoRa想象成一条公路,LoRaWAN就是公路上跑的交通规则。没有规则,车再多也乱套。

我在做牧场项目时,一开始就踩过这个坑。以为只要LoRa模块能发数据就行,结果设备多了,信道冲突、数据丢包、功耗失控……嗯,后来老老实实把LoRaWAN啃了一遍,才把系统稳住。

3.1 三种设备模式:Class A / B / C

LoRaWAN定义了三种终端设备模式。说白了,就是三种不同的“作息时间表”。

Class A —— 最省电,最常用

Class A是所有LoRaWAN设备必须支持的模式。它的工作流程很简单:

  • 设备主动发送一个上行数据包
  • 发送后,打开两个短暂的接收窗口(RX1和RX2)
  • 如果没有数据要发,设备就进入休眠

你想想看,这对牧场里的牛羊定位项圈来说,简直是天作之合。动物平时不动,项圈就睡觉。每隔几小时上报一次位置,上报完听一下有没有指令,然后继续睡。一节电池用一年,不是吹的。

我的经验: 在牧场项目中,我习惯把Class A的上报间隔设为4小时。太频繁了电池扛不住,太稀疏了又怕错过异常事件。4小时是个不错的平衡点。

Class B —— 增加下行时隙

Class B在Class A的基础上,增加了额外的定时接收窗口。设备会定期从网关接收一个信标(Beacon),然后同步时间,在约定的时隙里监听下行数据。

为什么需要Class B?举个例子,你突然想远程给某个牛圈的设备升级固件。Class A模式下,你得等它下次主动上报才能下发指令,可能一等就是几小时。Class B可以让你在指定时间“叫醒”它。

不过代价也很明显——功耗比Class A高。我个人建议,除非你有明确的下行需求(比如远程控制、紧急报警),否则优先用Class A。

Class C —— 持续监听

Class C的设备几乎一直处于接收状态,只在发送数据时短暂关闭接收。延迟最低,但功耗最高。

这种模式适合那些插着电源的设备,比如牧场里的固定网关、饲喂站控制器。你总不能让一个220V供电的设备还学Class A去睡觉吧?

模式 下行延迟 功耗 典型场景
Class A 高(等待下次上行) 极低 电池供电传感器
Class B 中(定时时隙) 中等 需要定时下行的设备
Class C 低(持续监听) 供电充足的设备

3.2 设备入网流程:OTAA vs ABP

设备要加入LoRaWAN网络,有两种方式。我刚开始做的时候,觉得ABP简单就直接用了,后来发现……嗯,还是OTAA更靠谱。

OTAA —— 空中激活

OTAA(Over-The-Air Activation)是推荐的方式。设备在出厂时烧录三个关键参数:

  • DevEUI:全球唯一设备标识,类似身份证号
  • AppEUI:应用标识,用来区分不同的应用
  • AppKey:应用密钥,用于加密通信

入网流程分两步:

  1. 发送Join Request:设备广播一个入网请求,包含DevEUI和AppEUI
  2. 接收Join Accept:网络服务器验证后,返回一个加密的Accept消息,包含设备地址(DevAddr)和会话密钥

这样做的好处是,每次入网都会生成新的会话密钥。即使有人截获了通信,也无法破解后续的数据。我曾经在一个项目中,因为设备数量太多,用OTAA批量入网时遇到了网络拥塞。解决办法是给每个设备设置一个随机的入网延迟,避免同时发送请求。

避坑指南: 我曾经遇到过OTAA入网失败的问题,排查了半天,发现是AppKey写错了。注意,AppKey是16字节的十六进制字符串,大小写敏感。建议在烧录后用校验和验证一遍。

ABP —— 预配置激活

ABP(Activation By Personalization)直接把设备地址和会话密钥烧录在设备里。设备上电就能用,不需要入网流程。

听起来很方便对吧?但有个致命问题:会话密钥是固定的。如果密钥泄露,整个网络都不安全。而且设备换到另一个网络时,需要重新烧录参数。

我个人只在实验室测试时用ABP,生产环境一律用OTAA。你想想看,牧场里几百个项圈,万一哪个被动物啃坏了,换个新项圈还得重新烧录密钥,多麻烦。OTAA就简单了,设备上电自动入网。

3.3 数据包结构解析

LoRaWAN的数据包结构,其实不复杂。咱们从上往下看。

MAC层数据包格式

| 前导码 | PHDR | PHDR_CRC | PHYPayload | CRC |

前导码用于接收方同步时钟。PHDR是物理头,PHDR_CRC是头的校验。真正有用的是PHYPayload。

PHYPayload结构

| MHDR | MACPayload | MIC |
  • MHDR(1字节):消息类型,比如上行数据、下行数据、入网请求等
  • MACPayload:真正的数据内容
  • MIC(4字节):消息完整性校验,防止数据被篡改

MACPayload结构

| FHDR | FPort | FRMPayload |
  • FHDR(7-22字节):帧头,包含设备地址、帧计数器、控制位等
  • FPort(1字节):应用端口,用来区分不同的应用数据
  • FRMPayload:应用数据,最大长度取决于数据速率

这里有个细节要注意:帧计数器(FCnt)是递增的,网络服务器会检查这个值。如果设备重启后计数器重置,服务器可能会认为数据是重放攻击。我在项目中遇到过这个问题,解决办法是在设备断电前保存FCnt到非易失存储器,上电后继续累加。

核心要点: LoRaWAN的数据包虽然看起来层级多,但每一层都有明确的作用。MHDR告诉你怎么处理,FHDR告诉你是谁发的,MIC保证没人篡改。理解了这个结构,你就能自己解析和构造LoRaWAN数据包了。

3.4 实际应用中的选择建议

好了,理论说完了,咱们聊聊怎么选。

  • 牧场定位项圈:Class A + OTAA。省电、安全,动物跑丢了也能自动入网
  • 饲喂站控制器:Class C + OTAA。有电,随时待命,远程控制投料
  • 移动式监测设备:Class B + OTAA。需要定时接收指令,又不能太耗电

记住一点:能用OTAA就别用ABP,能用Class A就别用Class C。这是我在无数次项目迭代中总结出来的血泪教训。

下一章,咱们会深入LoRaWAN的频段与信道规划。到时候我会分享一个真实案例——如何在牧场里避开Wi-Fi干扰,让信号穿墙而过。敬请期待。