4. 物理层基础(三):LoRa数据包结构解析(显式/隐式模式)、数据包长度计算、空中传输时间(ToA)公式推导

好,咱们接着聊LoRa物理层。前两节我们把调制和扩频讲透了,这一节来啃一个实际开发中绕不开的话题——数据包结构

你可能觉得,数据包嘛,不就是前导码+数据?嗯,LoRa还真没那么简单。它有两种模式:显式和隐式。选错了,轻则丢包,重则整个系统瘫痪。我在一个智慧农业项目里就吃过这个亏,后面细说。

4.1 LoRa数据包长什么样?

先看整体结构。一个标准的LoRa数据包,由四部分组成:

  • 前导码(Preamble):唤醒接收机,同步时钟
  • 可选的头(Header):显式模式下才有
  • 数据负载(Payload):你要传的真正数据
  • CRC校验:检查数据完整性

说白了,前导码就像开会前的“喂喂喂”试音。接收机一直在监听,听到前导码就知道“有人要说话了”。

关键参数:前导码长度

前导码长度可配置,范围是6到65535个符号。默认是12个符号。我建议不要低于10,否则在强干扰环境下容易漏检。

4.2 显式模式 vs 隐式模式

这里有个坑,很多新手会搞混。

显式模式(Explicit Mode):数据包里带一个Header。这个Header里包含了:

  • 负载长度(1字节)
  • CRC开关(1位)
  • 编码率(2位)
  • Header自身的CRC(2字节)

接收机收到Header后,就知道后面该收多少数据、用什么编码率。灵活性高,但Header本身会占用4个字节的开销。

隐式模式(Implicit Mode):没有Header。收发双方提前约定好:

  • 负载长度固定
  • 编码率固定
  • CRC开或关固定

好处是省掉了Header的4个字节,传输效率更高。坏处是——一旦配置不一致,整个包就废了。

避坑指南

我曾经在一个LoRa网关项目里,为了省那4个字节的开销,全系统用了隐式模式。结果生产时有一批节点固件刷错了编码率,所有数据包都解析失败。排查了整整两天才找到原因。从那以后,除非对链路质量有绝对把握,否则我老老实实用显式模式。

4.3 数据包长度计算

好,现在我们来算算一个LoRa数据包到底有多长。

先给公式:

数据包符号数 = 前导码长度 + 负载符号数

其中负载符号数的计算稍微复杂一点:

负载符号数 = 8 + max( ceil( (8×PL - 4×SF + 28 + 16×CRC) / (4×(SF - 2×DE)) ) × (CR + 4), 0 )

别被吓到,我来拆解一下:

  • PL:负载字节数(Payload Length)
  • SF:扩频因子(Spreading Factor)
  • CRC:0或1,表示是否启用CRC
  • DE:0或1,表示是否启用低数据率优化
  • CR:编码率,取值1~4(对应4/5到4/8)

举个例子,假设:

  • PL = 10字节
  • SF = 12
  • CRC = 1(启用)
  • DE = 1(启用低数据率优化)
  • CR = 1(编码率4/5)

代入公式:

分子 = 8×10 - 4×12 + 28 + 16×1 = 80 - 48 + 28 + 16 = 76
分母 = 4×(12 - 2×1) = 4×10 = 40
ceil(76/40) = ceil(1.9) = 2
负载符号数 = 8 + 2×(1+4) = 8 + 10 = 18 个符号

加上前导码12个符号,整个数据包就是30个符号。

我的经验

实际开发中,我习惯写个小脚本算这个。手算太容易出错。特别是SF=12时,一个符号的时长已经很长了,算错一个数,空中时间可能差好几秒。

4.4 空中传输时间(ToA)公式推导

ToA(Time on Air),说白了就是一个数据包从发出去到收完,在空中待了多久。

这个参数太重要了。为什么?

  • 影响功耗:ToA越长,发射机耗电越多
  • 影响信道占用:ToA越长,别人越难插进来
  • 影响法规合规:很多国家对单次发射时长有上限

先算一个符号的时间:

T_sym = (2^SF) / BW

其中:

  • SF:扩频因子(7~12)
  • BW:带宽(Hz),常见125kHz、250kHz、500kHz

举个例子,SF=12,BW=125kHz:

T_sym = 2^12 / 125000 = 4096 / 125000 = 0.032768 秒 ≈ 32.768 毫秒

一个符号就要32.8毫秒!你想想看,如果数据包有30个符号,那ToA就是:

ToA = 30 × 32.768 ≈ 983 毫秒

接近1秒了。这在很多场景下是不可接受的。

完整ToA公式

ToA = (前导码长度 + 负载符号数) × T_sym

其中负载符号数用上一节的公式计算。

4.5 实际应用中的权衡

嗯,这里要注意一个核心矛盾:传输距离 vs 传输时间

SF越大,传输距离越远,但ToA越长。SF=12时,一个包可能占空口近1秒。SF=7时,可能只要几十毫秒。

我做过一个城市级传感器网络,节点密集(几百个),但每个节点只传几个字节。我选择了SF=7,显式模式,ToA控制在50毫秒以内。这样信道利用率高,碰撞概率低。

另一个项目是偏远山区的气象站,节点稀疏,但要求传得远。我用了SF=12,隐式模式,ToA接近1秒。反正周围没别的设备,慢就慢点。

场景 推荐SF 推荐模式 典型ToA
城市密集节点 7~9 显式 30~150ms
郊区中等密度 9~11 显式 100~500ms
偏远山区稀疏节点 11~12 隐式 500ms~1.5s

法规红线

欧洲的ETSI规定,868MHz频段单次发射占空比不能超过1%。也就是说,如果你ToA是1秒,那两次发射间隔至少100秒。别踩红线,我见过有公司被罚过。

4.6 小结

这一节我们干了三件事:

  1. 搞清了显式和隐式模式的区别——显式灵活但多4字节开销,隐式高效但需要双方约定好
  2. 学会了数据包长度计算——公式看着吓人,拆开一步步算其实不难
  3. 推导了ToA公式——核心就是符号数乘以单个符号时长

下一节,我们会深入LoRa的编码和交织,看看数据在发射前到底经历了什么“折腾”。

记住一句话:LoRa的物理层,每一个参数都是权衡。没有银弹,只有适合你场景的方案。