第2章:LoRaWAN协议栈:物理层、MAC层、应用层分层架构、各层职责与交互流程

说实话,很多刚接触LoRaWAN的朋友,一上来就被「物理层」、「MAC层」、「应用层」这些词给唬住了。其实没那么玄乎。我当年第一次看LoRaWAN协议栈时,脑子里就一个想法:这不就是一套「谁负责发、谁负责管、谁负责用」的分工体系吗?

嗯,今天我就带你一层层拆开来看。咱们不搞教科书式的罗列,而是从实际工程的角度,聊聊每一层到底在干什么。

2.1 物理层:最底层的「搬运工」

物理层,说白了就是负责把数据变成无线电波发出去,再把收到的无线电波变回数据。它不关心你发的是什么内容,只关心「能不能发出去」、「能不能收回来」。

LoRaWAN的物理层用的是Semtech公司的LoRa调制技术。这是一种扩频调制,好处是灵敏度极高——我实测过,在市区环境下,-130dBm的信号都能解调出来。你想想看,这相当于什么呢?相当于你在北京,能听到上海一根针掉在地上的声音。

物理层核心参数:

  • 频段:EU868(欧洲)、US915(北美)、CN470(中国)等
  • 扩频因子(SF):SF7~SF12,数值越大,传输距离越远,但速率越慢
  • 带宽(BW):通常125kHz、250kHz、500kHz
  • 编码率(CR):4/5 ~ 4/8,用于前向纠错

我在一个智慧农业项目里就吃过亏。当时为了追求最远距离,把扩频因子设成了SF12。结果呢?数据包是能传3公里了,但一个包要传将近2秒。网关那边收包超时,直接丢包。后来我改成SF9,距离虽然短了点,但系统稳定多了。

我的经验:别盲目追求SF12。除非你的节点真的在深山老林里,否则SF9~SF10足够用了。速率和距离,永远是个trade-off。

2.2 MAC层:通信的「交通警察」

物理层把路修好了,但车怎么开、谁先走、撞车了怎么办?这些事归MAC层管。

LoRaWAN的MAC层定义了节点和网关之间的通信规则。它主要干这几件事:

  • 信道接入:节点什么时候可以发数据?用ALOHA协议,想发就发,撞了重传。
  • 数据确认:发出去的包,网关收到没?没收到就重发。
  • 自适应数据速率(ADR):根据信号质量,自动调整速率和发射功率。
  • 安全加密:用AES-128对数据进行加密,防止被窃听。

这里有个关键点:LoRaWAN的MAC层是「星型拓扑」的。节点只和网关通信,节点之间不直接通信。你想想看,如果每个节点都去跟其他节点握手,那信道早就挤爆了。

注意:LoRaWAN的MAC层不支持节点之间的直接通信。如果你需要做点对点传输,得用LoRa的私有协议,而不是LoRaWAN。

我记得有一次做城市井盖监测项目,井盖都在地下,信号很差。节点发数据到网关,经常收不到ACK。我一开始以为是物理层的问题,后来抓包分析才发现,是MAC层的重传机制没配置好。默认重传次数是3次,但地下环境干扰大,我改成了5次,问题就解决了。

2.3 应用层:数据的「翻译官」

物理层负责收发,MAC层负责管理,那应用层呢?它负责把收到的二进制数据,翻译成业务能理解的信息。

比如,一个温度传感器发来一串字节:0x01 0x2A。应用层知道:第一个字节是传感器ID,第二个字节是温度值(0x2A = 42°C)。然后它把这个数据交给服务器,服务器再显示到仪表盘上。

LoRaWAN的应用层其实很薄。它主要定义了:

  • FPort:端口号,用于区分不同的应用。比如FPort=1表示温度数据,FPort=2表示湿度数据。
  • Payload格式:数据内容的编码方式。可以是纯二进制,也可以是JSON、CBOR等。
  • 上下行消息:节点上报数据(上行),服务器下发指令(下行)。

应用层设计的关键:Payload格式一定要提前定义好。我见过太多项目,节点和服务器各写各的,结果数据对不上,排查起来非常痛苦。

2.4 三层之间的交互流程

光说理论没意思,咱们走一遍实际流程。假设你有一个温湿度传感器,每隔10分钟上报一次数据:

  1. 应用层:传感器采集到温度25°C,湿度60%。应用层把数据打包成二进制:0x19 0x3C(25和60的十六进制)。然后指定FPort=1,交给MAC层。
  2. MAC层:收到应用层的数据后,MAC层加上帧头(设备地址、帧计数器等),用AES-128加密,然后计算校验码。接着,它检查信道是否空闲,如果空闲就交给物理层。
  3. 物理层:MAC层的数据到了物理层,物理层用LoRa调制技术,把数据调制成无线电波,通过天线发射出去。
  4. 网关接收:网关的物理层收到无线电波,解调成二进制数据,交给MAC层。MAC层解密、校验,确认无误后,把原始数据提取出来,交给应用层。
  5. 服务器处理:服务器的应用层解析数据,得到温度25°C、湿度60%,存入数据库。

整个过程,从传感器采集到服务器收到,大概需要几百毫秒到几秒不等。具体时间取决于扩频因子和数据包大小。

避坑指南:我曾经在一个项目中,应用层打包数据时忘了加帧计数器。结果MAC层发现帧计数器没变,以为是重放攻击,直接把数据包丢弃了。排查了整整两天才找到原因。所以,应用层和MAC层的交互,一定要严格按照协议来。

2.5 分层架构的SVG示意图

下面这张图,是我用SVG画的LoRaWAN协议栈分层架构。你可以看到每一层的位置,以及数据在层与层之间的流动方向。

LoRaWAN协议栈分层架构 应用层(Application Layer) 数据解析、FPort管理、上下行消息 数据下发 MAC层(Medium Access Control) 信道接入、数据确认、ADR、加密 数据下发 物理层(Physical Layer) LoRa调制解调、频段管理、信号收发 数据上报 数据上报:节点 → 网关 → 服务器 数据下发:服务器 → 网关 → 节点 节点侧 网关/服务器侧

这张图里,数据上报是从下往上走,数据下发是从上往下走。每一层只和相邻层通信,不能跨层。这就是分层架构的核心思想——各司其职,互不干扰。

2.6 为什么分层这么重要?

你可能会问:搞这么复杂干嘛?直接一股脑把数据发出去不就行了?

嗯,我刚开始做嵌入式开发时也这么想。直到有一次,我需要把一套LoRaWAN方案从868MHz频段移植到915MHz频段。如果协议栈不分层,我得把整个通信代码重写一遍。但因为分层了,我只需要改物理层的频段配置,MAC层和应用层完全不用动。这就是分层架构带来的好处——模块化、可复用、易维护。

总结一下:

  • 物理层:管收发,不关心内容。
  • MAC层:管规则,保证通信有序。
  • 应用层:管解析,让数据有意义。

这三层各干各的,但配合起来,就是一个完整的LoRaWAN通信系统。

好了,这一章的内容就到这里。下一章我们会深入MAC层,聊聊信道接入和ADR的具体实现。到时候我会分享一个我在实际项目中踩过的坑——关于ADR自动调整速率导致节点掉线的案例,挺有意思的。

专注资料整理