4. LPWAN载荷限制:LoRaWAN最大载荷与占空比限制,数据包结构解析

各位同学,咱们今天聊点实在的。LPWAN 里最让人头疼的,不是协议有多复杂,而是——你发出去的数据,到底能装多少东西?

我刚开始做 LoRaWAN 项目时,就踩过这个坑。满心欢喜写好了应用层代码,结果一算,载荷超了,数据包发不出去。嗯,那感觉,就像你打包好了行李,结果箱子太小,塞不进去。

所以这节课,咱们就把 LoRaWAN 的载荷限制、占空比限制,还有数据包结构,彻底掰扯清楚。

4.1 LoRaWAN 数据包结构:从物理层到应用层

先看一张图,这是我个人习惯用的数据包结构拆解。你想想看,一个 LoRaWAN 数据包,从天线发出去,到网关收到,中间经历了多少层封装?

LoRaWAN 数据包结构(从物理层到应用层) 物理层(LoRa 调制) Preamble(前导码) | PHDR(物理头) | PHDR_CRC | PHYPayload | CRC MAC 层(LoRaWAN 协议) MHDR(1字节) | MACPayload(可变) | MIC(4字节) MHDR: MType(3bit) | RFU(3bit) | Major(2bit) MACPayload(MAC 载荷) FHDR(7~22字节) | FPort(1字节) | FRMPayload(可变) FHDR: DevAddr(4B) | FCtrl(1B) | FCnt(2B) | FOpts(0~15B) FRMPayload: 应用层数据(加密后) 应用层(你的数据) AppPayload(应用载荷) 注意:FRMPayload 是 AES-128 加密的,FPort=0 时表示 MAC 命令

从这张图你能看到,一个 LoRaWAN 数据包,从物理层到应用层,层层嵌套。说白了,你真正能用的应用层数据,只是最里面那一小块。

4.2 最大载荷限制:不是你想发多少就发多少

LoRaWAN 的最大载荷,取决于两个因素:数据速率(DR)区域规范

我记得有一次,客户要求终端设备每 5 秒上报一次数据,我一看,数据量还挺大。结果一查表,在 SF12 下,最大载荷才 51 字节。嗯,那肯定不行。后来只能把数据拆成两包,或者降低扩频因子。

下面这张表,是我从 LoRaWAN 1.0.4 规范里摘出来的,你直接拿去用。

数据速率(DR) SF / BW 最大载荷(字节) 典型应用场景
DR0 SF12 / 125kHz 51 超远距离,低速率
DR1 SF11 / 125kHz 51 远距离,低速率
DR2 SF10 / 125kHz 51 中等距离
DR3 SF9 / 125kHz 115 中等距离,较高速率
DR4 SF8 / 125kHz 222 近距离,高速率
DR5 SF7 / 125kHz 222 最近距离,最高速率
⚠️ 注意: 以上是 EU868 频段的数据。不同区域(如 US915、CN470)的载荷限制不同。我曾经在 US915 频段下,SF10 时最大载荷只有 11 字节,差点没把我整崩溃。所以,一定要查你所在区域的规范

4.3 占空比限制:别把信道占满了

占空比限制,说白了就是:你发完一包数据,得等多久才能发下一包?

LoRaWAN 的占空比限制,通常由当地法规决定。比如 EU868 频段,占空比限制是 1%。什么意思呢?

假设你发一包数据,空中传输时间(ToA)是 100ms。那么,你至少得等:

等待时间 = ToA / 占空比 - ToA
         = 100ms / 0.01 - 100ms
         = 9900ms
         ≈ 10 秒

也就是说,你发完一包,得等 10 秒才能发下一包。如果你强行多发,网关会直接丢弃你的数据包,甚至可能被罚款(嗯,真的会罚款)。

💡 我的经验: 在实际项目中,我一般会留出 20% 的余量。比如占空比限制是 1%,我按 0.8% 来设计。这样即使有突发流量,也不会违规。

4.4 数据包结构实战:如何计算有效载荷

好了,理论讲完了,咱们来点实战。假设你要设计一个温湿度传感器,上报温度(2 字节)、湿度(2 字节)、电池电压(2 字节),总共 6 字节。

你想想看,这 6 字节能直接发吗?不行。因为还有 MAC 层的开销。

咱们来算一笔账:

  1. MHDR:1 字节(固定)
  2. FHDR:至少 7 字节(DevAddr 4B + FCtrl 1B + FCnt 2B)
  3. FPort:1 字节
  4. FRMPayload:你的 6 字节数据(加密后还是 6 字节)
  5. MIC:4 字节

所以,总 MACPayload 大小 = 7 + 1 + 6 = 14 字节。加上 MHDR 和 MIC,总 MAC 层大小 = 1 + 14 + 4 = 19 字节。

在 DR0(SF12)下,最大载荷是 51 字节。19 字节远小于 51 字节,所以完全没问题。

✅ 结论: 对于大多数传感器数据(几字节到几十字节),LoRaWAN 的载荷限制是够用的。但如果你要传图片、音频,或者大量日志,那就得考虑分包或者压缩了。

4.5 避坑指南:我踩过的那些坑

做 LoRaWAN 项目这几年,我踩过不少坑。分享几个典型的:

  • 坑一:忽略 FOpts 的长度。FHDR 中的 FOpts 字段,最多可以带 15 字节的 MAC 命令。如果你不小心把 FOpts 填满了,FHDR 就变成 22 字节了。我曾经因为这个,导致载荷超限,查了半天才找到原因。
  • 坑二:占空比计算错误。有些同学只算了上行数据的占空比,忘了下行数据(比如网关的确认帧)也会占用占空比。嗯,这个坑我踩过两次。
  • 坑三:不同区域的载荷限制不同。我有个项目,从 EU868 迁移到 US915,结果发现同样的数据包,在 US915 下发不出去。后来一查,US915 的载荷限制更严格。
⚠️ 重要提醒: 如果你用的是 LoRaWAN 1.1 版本,注意数据包结构有变化。1.1 版本引入了「双 MIC」机制,数据包大小会略有增加。

4.6 总结:记住这三点就够了

好了,这节课的内容就这些。我帮你总结一下:

  1. 数据包结构:物理层 → MAC 层 → 应用层,层层嵌套。你真正能用的,只是最里面的 FRMPayload。
  2. 最大载荷:取决于数据速率和区域规范。SF12 下最多 51 字节,SF7 下最多 222 字节。
  3. 占空比限制:EU868 是 1%,发完一包得等至少 99 倍的时间才能发下一包。

记住这三点,你的 LoRaWAN 项目就不会在载荷和占空比上翻车。下一节课,咱们聊聊数据压缩——怎么在有限的载荷里塞进更多的数据。


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