第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是默认类型,也是最省电的。它的工作流程是这样的:

  1. 终端主动发一个上行数据
  2. 发送结束后,打开接收窗口RX1(1秒后)
  3. 如果RX1没收到,再打开RX2(2秒后)
  4. 收完就继续休眠

说白了,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