第4章 LoRaWAN协议栈架构:层次结构与网络拓扑
好,咱们今天聊聊LoRaWAN的协议栈。说实话,很多初学者一上来就被各种协议层搞晕了。我当年也是,看了半天文档,脑子里还是一团浆糊。后来我总结了一个方法——你把它想象成一个快递系统,就特别好理解。
4.1 LoRaWAN的层次结构
LoRaWAN协议栈分三层:物理层、MAC层、应用层。每一层各司其职,就像快递的运输、分拣、派送。
4.1.1 物理层(Physical Layer)
物理层就是LoRa射频那一套东西。它负责最原始的比特流传输。说白了,就是把0和1变成无线电波发出去,再把收到的无线电波变回0和1。
物理层的关键参数有这些:
| 参数 | 说明 | 我的经验 |
|---|---|---|
| 频段 | CN470、EU868、US915等 | 国内用CN470,注意信道规划 |
| 扩频因子(SF) | SF7~SF12 | SF12最远但最慢,我一般默认SF9 |
| 带宽(BW) | 125kHz、250kHz、500kHz | 125kHz最常用,覆盖和速率平衡 |
| 编码率(CR) | 4/5 ~ 4/8 | 4/5是默认,抗干扰够用 |
核心要点:物理层只管发和收,不关心数据是什么内容。它就像快递的运输卡车,只管把包裹从A运到B。
4.1.2 MAC层(Media Access Control Layer)
MAC层就复杂多了。它负责信道访问、数据确认、重传、加密这些事。嗯,这里要注意,LoRaWAN的MAC层和Wi-Fi的MAC层完全不一样。
MAC层主要干这几件事:
- 信道访问:终端设备用ALOHA协议随机发数据。不需要先听信道空不空,直接发就行。简单粗暴,但效率其实不高。
- 数据确认:确认帧(ACK)由网络服务器决定要不要发。不是每个包都要确认,看应用需求。
- 重传机制:没收到ACK就重传。我建议最多重传3次,再多就浪费电了。
- 加密:用AES-128加密,应用层和网络层各有一对密钥。
我的小技巧:MAC层有个叫ADR(自适应数据速率)的功能,我强烈建议开启。它会根据信号质量自动调整速率和发射功率。我在一个项目中没开ADR,结果终端功耗高了30%,后来一查才发现是发射功率一直用最大档。
4.1.3 应用层(Application Layer)
应用层最贴近你的业务。它定义了数据怎么打包、怎么解析。LoRaWAN的应用层数据是加密的,网络服务器看不到你的业务数据,只能看到MAC层的信息。
应用层的数据格式很简单:
// 应用层数据帧格式
[端口号(1字节)] [数据负载(N字节)]
// 举个例子
// 端口号: 0x01 (温度传感器)
// 数据: 0x1A 0x2B (温度值,大端模式)
// 完整帧: 0x01 0x1A 0x2B
我个人习惯把端口号规划好:
- 端口1~100:留给传感器数据
- 端口101~200:留给配置命令
- 端口201~223:留给固件升级
4.2 LoRaWAN的网络拓扑
LoRaWAN用的是星型拓扑。终端设备直接和网关通信,网关再通过IP网络连到服务器。
你想想看,为什么不用Mesh?因为LoRa本身通信距离就远,星型拓扑最简单,功耗也最低。Mesh虽然覆盖更广,但每个节点都要转发数据,功耗蹭蹭往上涨。
星型拓扑的特点:
- 终端只和网关通信,不互相通信
- 网关是透明转发,不做数据处理
- 所有智能都在网络服务器上
我曾经在一个项目中尝试过让终端之间直接通信,结果发现根本行不通。LoRaWAN协议就没设计这个功能,你硬要搞就得自己写私有协议,那还不如用别的技术。
4.3 终端设备分类
LoRaWAN定义了三种终端类型:Class A、Class B、Class C。它们的主要区别在于接收窗口的打开方式。
4.3.1 Class A(双向通信终端)
Class A是默认类型,也是最省电的。它的工作流程是这样的:
- 终端主动发一个上行数据
- 发送结束后,打开接收窗口RX1(1秒后)
- 如果RX1没收到,再打开RX2(2秒后)
- 收完就继续休眠
说白了,Class A的接收窗口是跟着上行数据走的。你不发数据,服务器就找不到你。这适合传感器上报的场景,比如温度、湿度、水位这些。
我的建议:90%的场景用Class A就够了。我做过一个水表项目,每天上报一次数据,两节AA电池用了3年多。
4.3.2 Class B(定时接收终端)
Class B在Class A的基础上,增加了定时接收窗口。它会同步网关的信标(Beacon),然后在约定的时间点打开接收窗口。
Class B的接收窗口是:
- RX1和RX2:和Class A一样,跟着上行数据走
- 定时接收窗口:每隔一段时间固定打开一次
这样做的好处是,服务器可以在约定时间给终端下发数据,不用等终端主动上报。但代价是功耗增加了,因为要定期同步信标。
注意:Class B对时钟精度要求很高。我曾经在一个项目中用Class B,结果终端晶振漂移太大,信标同步经常失败。后来换了温补晶振才解决。
4.3.3 Class C(持续接收终端)
Class C最耗电,但延迟最低。它除了发送数据的时候,其他时间一直在监听接收窗口。
Class C的接收窗口是:
- RX1和RX2:和Class A一样
- 持续接收窗口:除了发送和RX1/RX2期间,其他时间都在监听
Class C适合需要实时控制的场景,比如阀门控制、开关控制。但功耗很大,一般要用市电供电。
| 类型 | 功耗 | 下行延迟 | 适用场景 |
|---|---|---|---|
| Class A | 极低 | 高(需等待上行) | 传感器上报 |
| Class B | 中等 | 中等(定时接收) | 定时控制 |
| Class C | 高 | 低(持续监听) | 实时控制 |
选型建议:能选Class A就别选Class B,能选Class B就别选Class C。我见过有人用Class C做温度传感器,结果电池一周就没电了,这就是典型的选型失误。
4.4 本章小结
LoRaWAN的协议栈其实不复杂。物理层管收发,MAC层管规则,应用层管业务。星型拓扑简单可靠,三种终端类型各有用处。
我个人建议初学者先从Class A开始,用现成的LoRaWAN模组搭一个最简单的温湿度上报系统。等跑通了,再慢慢研究MAC层的细节。一口吃不成胖子,做嵌入式开发更是这样。
下一章我们聊聊LoRaWAN的入网流程,那是很多新手容易踩坑的地方。到时候我把我当年踩过的坑都告诉你。
公众号:蓝海资料掘金营,微信deep3321