# 第13章 Class B下行时隙时序

# 13.1 定义

为了使 Class B 模式能够正常运行,终端必须以信标规定的精准时刻打开接收时隙窗口。本节定义了所需的时序操作。

两个连续的信标起始点之间的间隔称为信标周期。信标帧的传输以 BEACON_RESERVED 时间间隔的起始端对齐。每个信标都有一个保护时间间隔,在该时间间隔之内是没有 ping 时隙的。保护间隔的长度对应于允许帧在空中的最长时间。这是为了确保在保护时间之前的一个 ping 时隙内发起的下行数据帧总是有时间去完成传输而不与信标的传输发生冲突。因此用于 ping 时隙的时间间隔是从 BEACON_RESERVED 时间间隔的末尾节点到下一 BEACON_GUARD 时间间隔的起点。

图53. 信标时序

Beacon_period 128 s
Beacon_reserved 2.120 s
Beacon_guard 3.000 s
Beacon_window 122.880 s
表18. 信标时序

信标帧在空中的时间实际上是远小于 BEACON_RESERVED 时间间隔的,目的是将来用于添加网络管理广播帧。

BEACON_WINDOW 时间间隔被划分为 2^12 = 4096 个小时段,每一段时长为 30ms,所有时段的编号从 0 到 4095。

每个使用时隙号 N 的终端必须在 Beacon start 开始之后的 秒打开它的接收窗口, 的计算公式如下:

N 称为时隙指数。

最后一个 ping 时隙的开始时间是在 beacon start 后的 或者下一个信标开始前的 3030ms。

# 13.2 时隙随机化

为了避免系统冲突或者过载问题,所以时隙编号是随机的并且在每个信标周期都会改变。

使用以下参数:

DevAddr 设备32位网络单播或者多播地址
pingNb 每个信标周期的ping时隙数量。必须为2的整数幂:pingNb = 2^k,0≤k≤7
pingPeriod 设备唤醒接收所间隔的时隙周期,其单位是时隙数量:pingPeriod = 2^12 / pingNb
pingOffset 在每个信标周期开始计算的随机偏移。值的范围为0到(pingPeriod-1)
beaconTime 这个时间将会在BCNPayload中携带。前一个信标帧的时间
slotLen 一个单元ping时隙长度=30ms
表19. classB slot randomization algorithm parameters

在每个信标周期终端和服务器都会计算出一个新的伪随机偏移来对齐接收时隙。使用全零的固定密钥的 AES 加密进行随机化:

  • Key = 16 × 0x00
  • Rand = aes128_encrypt(Key,beaconTime | DevAddr | pad16)
  • pingOffset = (Rand[0] + Rand[1] × 256) modulo pingPeriod

信标周期所使用的时隙是:

  • pingOffset + N × pingPeriod with N = [0:pingNb-1]

因此节点打开接收时隙的时间是:

First slot Beacon_reserved + pingOffset × slotLen
Slot 2 Beacon_reserved + (pingOffset + pingPeriod) × slotLen
Slot 3 Beacon_reserved + (pingOffset + 2 × pingPeriod) × slotLen
... ...

如果一个终端同时服务于单播和一个或多个多播时隙,则该计算将会在一个新的信标周期开始时执行多次。一次用于单播地址(节点网络地址),一次用于每个多播组地址。

当一个多播ping时隙和一个单播ping时隙发生了冲突并且终端接收窗口无法进行处理的情况之下,终端应该优先监听多播时隙的数据。如果多播接收时隙之间发生了冲突,则前一个多播帧的 FPending 位就可以用于设置优先级处理。

随机机制可以避免单播和多播时隙的系统冲突。如果在一个信标周期内发生了冲突,则在下一个信标周期内就不大可能发生。