7. 数据流7.1 非编码型物理层 对于非编码型物理层,数据处理流程如下: 上面一行表示发送过程,数据流从左至右,BLE数据先进行加密,然后生成CRC校验信息,再进行白化(Whiten),从天线发射出去。 下面一行表示接收过程,数据流从右至左,执行发送过程的逆过程。 白化过程对数据序列执行多项式变化,使连续的0或连续的1数字序列被打散。因为接收机长时间接收0或1会误以为信号发生了频偏。 反白化则将白化数据还原成原始数据。由于白化和反白化是公开可逆的,所以它们无需加密。 BLE数据接收时,再进入反白化之前,首先检查访问地址是否正确,检测失败的数据会被抛弃。CRC校验失败的数据也会被抛弃。 7.2 编码型物理层相对于非编码型物理层,编码型物理层多了编解码过程,数据的处理流程如下:
编码过程包含前向纠错编码(FEC)和模式映射(Pattern Mapper)两个子过程。 前向编码将原始数据做卷积处理,处理后1个比特原始数据变成2个比特。 模式映射对卷积结果进行展宽,展宽映射如下: 卷积结果 | 模式映射(S=2) | 模式映射(S=8) | 0 | 0 | 0011 | 1 | 1 | 1100 |
最终,S=2情况下1个比特变成了2个比特,S=8情况下1个比特变为8个比特。冗余的比特可以用来自矫正,从而减少重传次数,间接的
提升了接收灵敏度。
8. 空中接口协议空中接口协议定义了链路层在各种状态下的行为和时序规范。 8.1 帧间隔帧内间隔T_IFS(Inner Frame Space) 帧内间隔表示前一帧的末尾与下一帧的开头之间的时间。 这个间隔时间为固定150us,通常表示为T_IFS = 150us。 最小辅助帧间隔T_MAFS(Min AUX Frame Space) 假如一个帧包含AuxPtr,最小辅助帧间隔表示该帧末尾与其辅助帧开头之间的时间。 这个间隔时间为固定300us,通常表示为T_MAFS = 300us。 8.2 时钟精度链路层需要用到两个时钟精度参数,广播事件和连接事件使用活动时钟精度,其他事件则使用睡眠时钟精度。 活动时钟精度为±50ppm,睡眠时钟精度为±500ppm。 活动时钟驱动的行为事件,其时序误差应小于±2us,睡眠时钟驱动的行为事件,其时序误差应小于16us。 除此之外,BLE 5引入了一个距离延迟(Range Delay)的概念。 由于BLE 5极大的扩展了通信距离,假如两个设备相距1km,那么电磁波在空间传输,会产生一个时延,称为距离延迟。 电磁波速度为光速,考虑通信介质(空气),做了一个保守估计1/c = 4ns。 于是可以得到:距离延迟T(range) ≈ 2Distance * 4ns。 (蛋疼) 8.3 设备过滤机制链路层基于设备地址执行设备过滤机制,利用一个白名单,记录设备的地址和地址类型。 广播状态、扫描状态和发起状态三种状态下的过滤机制相互独立,拥有各自的过滤策略,但是三种过滤机制共享一个白名单。
广播事件 | 广播信道 | 描述 | Advertising Event | 主要广播信道 | 传统的广播事件 | Extended Advertising Event | 次要广播信道 | 扩展的广播事件,使用带AUX_ADV_IND | Periodic Advertising Even | 次要广播信道 | 周期的广播事件,使用AUX_SYNC_IND |
传统的广播事件 广播事件是指完成一次广播数据的发送。 一次广播事件中,设备依次在37、38、39三个信道上传输相同的广播数据,并监听扫描请求和连接请求。收到请求时如果扫描过滤策略或连接策略允许,则做相应的响应,否则关闭本次广 播事件或跳到下一个主要广播信道继续广播。如下图所示: 两个相邻的广播事件之间的时间差称为广播间隔。广播间隔是一个整数乘以0.625ms,有效范围是20ms至10485.759375s。 两个相邻广播之间会加入一个0-10ms的随机时延,称为advDelay。下图为三次广播事件,依次发生在37、38、39广播信道上: 实际上两次广播事件之间的时间略大于广播间隔,T_advEvent = advInterval + advDelay。 扩展的广播事件 扩展的广播事件可以通过多个辅助PDU来传输广播数据,极大扩展了广播数据的容量。 扩展广播事件包含了一个传统的广播PDU,以及一些列辅助广播PDU,如下图所示: 周期的广播事件 周期广播,以一个恒定的连接间隔进行广播,广播一旦开始就不能更改广播间隔。 周期广播,使用AUX_SYNC_IND作为广播周期的标识,两个相邻的AUX_SYNC_IND PDU之间的事件间隔称为周期广播事件的广播间隔。如下所示:
广播间隔是一个整数乘以1.25ms,有效范围是7.5ms至81.91875s。 广播事件类型 按照能否连接、能否接受主动扫描和是否定向三个维度可以将广播事件做如下分类: 广播事件 | 可连接/可扫描/定向 | 可用PDU类型 | 广播信道 | connectable and scannable undirected event | Y/Y/N | ADV_IND | 主要广播信道 | connectable undirected event | Y/N/N | ADV_EXT_IND | 次要广播信道 | connectable directed event | Y/N/Y | ADV_DIRECT_IND, ADV_EXT_IND | 主要广播信道,次要广播信道 | non-connectable and non-scannable undirected event | N/N/N | ADV_NONCONN_IND, ADV_EXT_IND | 主要广播信道,次要广播信道 | non-connectable and non-scannable directed event | N/N/Y | ADV_EXT_IND | 次要广播信道 | scannable undirected event | N/Y/N | ADV_SCAN_IND, ADV_EXT_IND | 主要广播信道,次要广播信道 | scannable directed event | N/Y/Y | ADV_EXT_IND | 次要广播信道 |
8.5 扫描事件链路层在扫描状态下在主要广播信道监听广播数据。被动扫描不发任何数据,主动扫描发出扫描请求并监听扫描响应。 扫描行为的持续过程称为扫描窗口scanWindow,两次扫描行为之间的时间间隔成为扫描间隔scanInterval,显然扫描窗口不能大于扫描间隔,如果扫描窗口等于扫描间隔,链路层将持续扫描。 扫描间隔的最大值是40.96s。 假如广播设备扩展广播,链路层还需监听次要广播信道中的辅助广播包。 链路层监听到广播数据,或接收到扫描响应数据,则向主机发出广播报告(Advertising Report)。 8.6 连接事件链路层属于Master Role的设备称为主机(master),属于Slave Role的设备称为从机(slave)。 一旦进入连接状态,就视为建立了连接。建立连接后,主机会发出一个数据并等待从机的响应,如果在6个连接间隔内都未等到从机的数据包,则视为连接断开。 在连接状态下,两端设备发送数据包的最小单元称为连接事件。链路层仅在连接事件中发送PDU数据,在一个连接事件内,可以发出多个PDU,相邻PDU之间至少保留T_IFS时间。 8.6.1 连接参数连接事件的时序受两个参数的影响:连接间隔和从机握手潜伏数。 两个连接事件之间的事件间隔称为连接间隔。连接间隔是一个整数乘以1.25ms,有效范围是7.5ms至4s。 从机无需监听每一次主机的连接事件,忽略的事件总数称为从机握手潜伏数。主机设置一个监听超时,当主机等待超时仍未获得从机的响应,则认为连接断开,并向主机报告。监听超时是一个整数乘以10ms,有效范围为100ms至32s。 8.6.2 连接过程 – 主机端主机在发出CONNECT_REQ之后,即进入连接状态,然后等待一会时间,发送第一个数据包。 等待的时间主要是为了留下空余让从机有充分时间唤醒和准备。 等待的时间包括三个参数:transmitWindowDelay,transmitWindowOffset和transmitWindowSize。其中第一个参数对于不同的物理层实现是一个固定值,后两项则可以通过主机进行设置。 主机连接过程的时序图如下: 主机的一个数据包总是在发送窗口(Transmit Window)中发送,发送窗口的时序位置由以上三个参数共同确定。 辅助广播包引起的连接过程,与上图基本一致。 8.6.3 连接过程 – 从机端在建立连接时,从机端需要监听主机端发出的第一包数据。假如从机错过了传输窗口,则在下一个连接间隔中监听主机第一包数据。如下图所示: 辅助广播包产生的连接过程,与上图基本一致。 8.6.4 关闭连接事件关闭连接事件并非断开连接,仅表示当次数据传输事件完毕。 当连接事件中仅有一个PDU需要发送,则发送完毕后即可关闭连接事件。 如果连接事件中有多个PDU需要发送,那么将在PDU中设置MD(More Data)字段,在一个PDU发送完毕后持续发送,直到全部PDU发送完毕,再关闭连接事件。 每次主机发送一个PDU,从机都需要返回一个响应。假如从机没有返回响应,则主机中断发送,关闭连接事件。如果PDU没有发送完毕,从机没有收到主机发送的数据包,则从机端关闭连接事件。如果PDU的CRC校验失败,则关闭连接事件。 8.6.5 窗口展宽连接事件的时序由睡眠时钟决定,而两端设备的睡眠时钟的精度均是±500ppm,因此从机为了收到主机的PDU,需要提前一段时间唤醒以监听主机的数据。 这段提前唤醒的监听时间,称为“窗口展宽”。显然提高睡眠精度将减少从机的窗口展宽时间。 windowWidening = (( masterSCA + slaveSCA ) / 1000000) * timeSinceLastAnchor 其中masterSCA表示主机的睡眠时钟精度,slaveSCA表示从机的睡眠时钟精度,timeSinceLastAnchor表示上一次 8.7 流程控制数据信道PDU中有两个参数可以实现确认机制:SN,NESN。其中SN表示当前数据包的序号SeqNum,NESN表示下一个期望包的序号NextExpectedSeqNum。 SN和NESN字段长度均为1比特,在连接事件开始时,二者均设置为0,之后在0与1之间变换。 设备接收数据包时,如果发现SN和NESN相同,表明该数据包为新数据,则跳变NESN。如果发现SN和NESN不同,表明上次发送从机未收到,该数据位重发数据,则不跳变NESN。 设备发送数据包时,如果发现SN和NESN不同,表明上次数据被成功收到,则发送新的数据并跳变SN。如果发现SN和NESN相同,表明上次数据未被成功收到,则重发上次数据且不跳变SN。 归纳数据接收和发送两种情况,如下图所示: 数据信道PDU中还包括MD(More Data)字段,表示当前数据包后面是否还有更多数据包。 利用SN、NESN、MD三个字段,即可实现长包发送的流程控制。 8.8 PDU长度链路层的连接状态PDU长度范围如下: 是否支持数据包扩展特性 | 是否支持编码性物理层 | 最大长度(字节) | 最大传输时间(微秒) | N | N | 27 | 328 | Y | N | 27-251 | 328-2120 | N | Y | 27 | 328-2704 | Y | Y | 27-251 | 328-17040 |
根据上表,对于不支持扩展数据包和非编码型物理层的设备,链路层传输一个27字节PDU的时间为328us。 8.9 特性支持设备可以选择性支持链路层的功能特性,对于两端设备均支持的功能特性,才可以使用。 链路层的功能特性列表如下,许多特性与链路层控制命令一致。 9. 链路层控制链路层定义了控制链路的规程,利用这些规程,更新链路层的参数,如下表: 链路层应该单线程操作规程,并且设置超时,如果同时进行两个不兼容的规程,将导致断开连接。 10. 隐私链路层的隐私特性就是使用可解析的私有地址。 链路层维护一个计时器,当计时器触发,则更新私有地址,如果连接断开,也更新私有地址。协议栈推荐该计时器的周期为15分钟。 如果广播设备使用了可解析的私有地址,则PDU中的广播设备地址字段使用本地的IRK生成。 如果发起设备使用了可解析的私有地址,则PDU中的设备地址字段可以使用该私有地址。 如果广播设备收到了使用了可解析私有地址的扫描设备或发起设备的请求,则需要解析该地址。 如果发起设备收到了使用了可解析私有地址的广播设备的广播数据,则需要解析该地址。
|