3. LoRaWAN协议架构:网络拓扑、终端类型与MAC层帧结构

各位同学,咱们今天来聊聊LoRaWAN协议的核心架构。说实话,很多初学者一上来就被各种术语搞晕了——什么Class A、Class B、MAC层帧头……其实没那么复杂。我当年第一次接触LoRaWAN时,也是对着协议栈文档发了好几天呆。后来在项目中亲手搭了一套网络,才真正搞明白这些设计背后的逻辑。

咱们今天就把这三块内容拆开揉碎了讲:网络拓扑长什么样?终端设备分哪几类?MAC层的帧结构又是怎么组织的?

3.1 LoRaWAN网络拓扑

LoRaWAN用的是星型拓扑,不是Mesh网。这一点我特别想强调——终端设备不直接互相通信,所有数据都通过网关转发到网络服务器

你想想看,为什么这么设计?

说白了,就是为了省电。终端设备只需要跟网关打交道,不需要监听其他节点的消息,也不用做路由转发。我在一个智慧农业项目里,传感器节点用两节AA电池,Class A模式,跑了两年多没换过电池。要是用Mesh,早就没电了。

典型的LoRaWAN网络包含四个角色:

  • 终端设备(End Device):传感器、执行器等,负责采集数据或接收指令
  • 网关(Gateway):也叫集中器,负责转发终端和服务器之间的数据包
  • 网络服务器(Network Server):核心大脑,处理MAC层逻辑、去重、确认等
  • 应用服务器(Application Server):处理业务数据,比如温湿度告警、设备控制

这里有个容易踩的坑——网关本身不解析数据内容。它只做物理层转发,把收到的LoRa射频信号转成IP包发给服务器。我曾经遇到一个客户,非要在网关上做数据解析,结果网关负载过高,丢包率飙升。嗯,后来改回标准架构,问题就解决了。

核心要点:LoRaWAN是星型拓扑,终端→网关→网络服务器→应用服务器,数据流是单向或双向的,但终端永远不直接跟其他终端通信。

下面这张图是我自己画的,把整个网络拓扑和消息流向展示清楚了:

LoRaWAN 网络拓扑结构 终端设备 传感器节点 执行器节点 定位标签 Class A/B/C 上行 下行 网关 LoRa射频模块 IP网络模块 数据包转发 TCP/IP TCP/IP 网络服务器 MAC层处理 数据去重 确认重传 应用数据转发 应用数据 应用服务器

3.2 终端设备类型:Class A / B / C

LoRaWAN定义了三种终端类型,核心区别在于下行接收窗口的时机和功耗。我直接说结论:Class A最省电,Class C最费电,Class B是折中方案

Class A —— 最省电,最常用

Class A是所有LoRaWAN终端必须支持的模式。它的逻辑很简单:终端主动发上行数据,发完之后打开两个接收窗口,等服务器回复

具体流程是这样的:

  1. 终端发送上行数据包
  2. 发送结束后1秒,打开第一个接收窗口(RX1),持续约100ms
  3. 如果RX1没收到数据,再等1秒,打开第二个接收窗口(RX2)
  4. 两个窗口都关闭后,终端进入休眠状态

我在一个环境监测项目里,传感器每15分钟上报一次温度数据,Class A模式,两节AA电池用了两年半。为什么这么省电?因为终端99%的时间都在睡觉,只有上报那几毫秒才工作。

我的建议:如果你的应用是传感器周期性上报数据,且下行指令不频繁,优先选Class A。这是LoRaWAN的默认模式,兼容性最好。

Class B —— 定时接收下行

Class B在Class A的基础上,增加了定时接收窗口。终端会从网关接收一个同步信标(Beacon),然后按照约定的时间周期性地打开接收窗口。

说白了,Class B就是「我虽然大部分时间在睡觉,但我定了闹钟,到点就醒过来听听有没有消息」。

Class B的典型应用场景:

  • 需要服务器主动下发指令,但终端不能一直开着接收
  • 比如智能路灯控制,服务器可能在任意时间下发调光指令

不过Class B有个麻烦——终端需要跟网关保持时间同步。我有个同事在做智能停车项目时,Class B终端在信号不好的地下车库经常收不到Beacon,导致同步失败,最后不得不降级成Class A。嗯,这个坑大家要注意。

Class C —— 实时监听,最费电

Class C的终端几乎一直在监听下行数据。除了发送数据那几毫秒,其他时间接收窗口都是打开的。

你想想看,这意味什么?功耗最高,但延迟最低。服务器随时可以下发指令,终端几乎立即响应。

Class C适合的场景:

  • 需要实时控制的执行器,比如阀门、开关
  • 有市电供电的设备,不担心功耗

注意:Class C终端如果使用电池供电,可能几天就没电了。我曾经见过一个项目,客户把Class C用在电池供电的传感器上,结果一周换一次电池,运维成本直接爆炸。所以,选Class C之前,先确认供电方式

三种类型的对比,我整理了一张表:

特性 Class A Class B Class C
下行接收时机 上行后两个窗口 上行后 + 定时窗口 几乎一直监听
功耗 极低 中等
下行延迟 取决于上行周期 取决于Beacon周期 极低
典型应用 传感器上报 定时控制 实时控制
供电要求 电池可用数年 电池可用数月 市电或大容量电池

3.3 MAC层帧结构

MAC层帧结构,说白了就是数据包的组织格式。LoRaWAN的MAC帧分为上行帧和下行帧,结构基本一致,但有些字段含义不同。

标准的MAC帧结构如下:

+----------------+----------------+----------------+----------------+----------------+
|  MAC Header    |  MAC Payload   |  MIC           |
|  (MHDR)        |  (FRM_Payload) |  (消息完整性码) |
|  1 byte        |  1..N bytes    |  4 bytes       |
+----------------+----------------+----------------+----------------+----------------+

咱们拆开来看每个部分:

3.3.1 MAC Header (MHDR)

MHDR只有1个字节,但信息量不小。它包含:

  • MType (3 bits):消息类型,比如Join Request、Unconfirmed Data Up、Confirmed Data Down等
  • RFU (3 bits):保留位,目前必须为0
  • Major (2 bits):LoRaWAN版本号,目前是0x00

我刚开始看协议时,总觉得1个字节能存什么?后来发现,MType决定了整个帧的处理方式。比如Confirmed Data Up要求服务器必须回复ACK,而Unconfirmed Data Up则不需要。这个区别在项目中很重要——确认帧会增加网络负载,但能保证数据可靠到达

3.3.2 MAC Payload

MAC Payload是帧的核心,它又分为两部分:

+----------------+----------------+----------------+----------------+
|  FHDR          |  FPort         |  FRM_Payload   |
|  (帧头)         |  (端口号)      |  (应用数据)     |
|  7..22 bytes   |  1 byte        |  0..N bytes    |
+----------------+----------------+----------------+----------------+

FHDR(帧头)包含:

  • DevAddr(4字节):终端设备地址
  • FCtrl(1字节):流控标志,比如ACK、ADR等
  • FCnt(2字节):帧计数器,防止重放攻击
  • FOpts(0~15字节):可选MAC命令,比如LinkCheckReq

FPort(端口号)

  • 0:用于MAC命令传输
  • 1~223:应用数据端口
  • 224~255:保留给未来使用

FRM_Payload(应用数据)

  • 最大长度取决于数据速率(DR)
  • 数据速率越低,传输距离越远,但Payload越小
  • 比如DR0(SF12)下,最大Payload只有51字节

重要提醒:LoRaWAN的Payload长度受限于数据速率。我在一个项目中,为了追求传输距离用了SF12,结果发现一个数据包只能传51字节,传感器数据稍微多一点就得拆包。后来调整了SF和Payload的平衡,才解决问题。

3.3.3 MIC(消息完整性码)

MIC是4字节的校验码,用于验证消息的完整性和真实性。它使用AES-CMAC算法计算,密钥是终端和网络服务器共享的AppKey或NwkKey。

简单说,MIC就是数据包的「防伪标签」。如果接收方计算的MIC跟发送方的不一致,说明数据被篡改或者不是合法设备发的,直接丢弃。

我遇到过一种情况:终端固件升级后,MIC计算逻辑出了bug,导致所有上行数据都被服务器丢弃。排查了两天才发现是密钥配置错了。所以,MIC相关的代码一定要仔细测试

3.4 小结

好了,这一章的内容就这些。咱们回顾一下:

  • 网络拓扑:星型结构,终端→网关→服务器,简单可靠
  • 终端类型:Class A最省电,Class B定时监听,Class C实时响应
  • MAC帧结构:MHDR + Payload + MIC,每个字段都有明确用途

这些是LoRaWAN协议的基础,也是后续章节的基石。我个人建议,如果你刚开始做LoRaWAN开发,先拿Class A设备跑通一个简单的数据上报流程,把MAC帧抓出来看看,理解每个字节的含义。纸上得来终觉浅,绝知此事要躬行嘛。


公众号:蓝海资料掘金营,微信deep3321