在FiRa标准中,MAC的基本数据框架基于IEEE 802.15.4-2020标准,在IEEE保证之上,增加了基于块的测距模式的调度,整体实现也比较复杂,这里先简单进行粗略的框架介绍,后续陆续进行相对完整的讲解。
在FiRa标准的规范中,将设备分为了Controller、Controlee、Initiator以及Responder四种。
设备也分为了四种,如下图:
Controller + Initiator
Controlee + Responder
Controller + Responder
控制器,通过发送控制消息来定义和控制测距流程。
受控端,根据控制器发送的消息来执行测距的流程。
Initiator,通过发送RFRAME测距初始消息(Ranging initiation message, RIM),开始一个测距流程。
Responder,发送响应消息,应答Initiator发送的RIM消息。
在FiRa MAC中的调度模式采用:time-scheduled-based ranging(基于时间调度的测距),测距设备由控制器调度在不同的时隙发送测距帧(RFRAME)或测量报告。
基于时间调度的模式下,FiRa中引入了测距块、测距轮以及测距时隙的概念,在接下来将对基于块的测距模式进行讲解。
对于基于块的测距模式而言,首先要理解其构成框架:每个会话中的测距分为了多个块(Block
),在每个块内有分为若干测距轮(Ranging Round
),而每个测距轮内又拆分为更小的测距时隙(Slot
)单元。正常情况下,测距过程将在每个块的固定测距轮之内完成。
基于块的模式,连续测距轮之间的时间是固定的。控制器应在第一个测距块(Block索引为0)的第一个测距轮(Round索引为0)中启动测距会话。(不论Hopping模式与否,都应从Block 0的Round Index 0开启测距)
为了应对复杂环境中的冲突等考虑,FiRa规范在此基础之上,增加了跳频(Round Hopping)的设计,以便能够在运行过程中动态避开冲突。
这一机制的实现,如要通过引入Round Hopping,设计了相关的Hopping序列规则,这样在测距中的多方都能够形成先验知识,能够实现有效的同步。
轮次跳转是FiRa设备调到不同的测距轮,以便在下一个测距块中成功执行测距的一个特性。
FiRa设备在下一个测距块中要使用的RR有Hoppoing序列决定。
S ( B l o c k I n d e x , S e s s i o n I D , N R o u n d ) = ( ( A E S ( B l o c k I n d e x , S e s s i o n I D ) & 0 x F F F F ) ∗ N R o u n d ) > > 16 S(BlockIndex, SessionID, N_{Round}) = \\[6pt] ((AES(BlockIndex, SessionID) \& 0xFFFF) *N_{Round}) >> 16 S(BlockIndex,SessionID,NRound)=((AES(BlockIndex,SessionID)&0xFFFF)∗NRound)>>16
N R o u n d N_{Round} NRound代表一个测距块中的Ranging Round的数量。
AES算法应使用AES-128的ECB模式。BlockIndex、SessionID都用零填充到左边以达到AES块大小的要求,分别用于明文和密钥。
注意,BlockIndex为AES的明文,SessionID为AES的密钥。
AES之后的结果与上0xFFFF,然后乘以 N R o u n d N_{Round} NRound。
跳变序列确定测距块中的Ranging Round的Round Index,当跳变模式启用时需要使用Round Index。
区块索引0(即测距会话中的第一个测距区块)无论是否使能Round Hopping都始终为0。
示例
BlockIndex为1(即当前测距会话的第二个测距块),SessionID为0x10203,每个测距块内有4个RR,在AES处理时都需要在左侧补充0:
通过AES函数处理之后,得到:0x3170_1ba5_ee72_4e1b_5fbf_d519_1c3d_77de,
与0xFFFF执行与操作后得到:0x77de, 乘以RR数量4,得到:0x0001_df78,
右移16bit之后,得到S的值为0x1。
连续的BlockIndex 2/3/4的S的值为0,3和1。
这意味着,对于测距块0,1,2,3,4,测距轮的索引分别为:0,1,0,3,1,如图所示:
块跨步功能可用于跳过测距块。当不需要频繁测距时,测距设备可以通过跳过测距块来降低功耗。
步幅长度指示在下一次测距之前将跳过多少测距块。如果步幅长度为N,当前的BlockIndex为M,则下一个测距块索引为:M+N+1。