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 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:应用密钥,用于加密通信
入网流程分两步:
- 发送Join Request:设备广播一个入网请求,包含DevEUI和AppEUI
- 接收Join Accept:网络服务器验证后,返回一个加密的Accept消息,包含设备地址(DevAddr)和会话密钥
这样做的好处是,每次入网都会生成新的会话密钥。即使有人截获了通信,也无法破解后续的数据。我曾经在一个项目中,因为设备数量太多,用OTAA批量入网时遇到了网络拥塞。解决办法是给每个设备设置一个随机的入网延迟,避免同时发送请求。
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到非易失存储器,上电后继续累加。
3.4 实际应用中的选择建议
好了,理论说完了,咱们聊聊怎么选。
- 牧场定位项圈:Class A + OTAA。省电、安全,动物跑丢了也能自动入网
- 饲喂站控制器:Class C + OTAA。有电,随时待命,远程控制投料
- 移动式监测设备:Class B + OTAA。需要定时接收指令,又不能太耗电
记住一点:能用OTAA就别用ABP,能用Class A就别用Class C。这是我在无数次项目迭代中总结出来的血泪教训。
下一章,咱们会深入LoRaWAN的频段与信道规划。到时候我会分享一个真实案例——如何在牧场里避开Wi-Fi干扰,让信号穿墙而过。敬请期待。