目录
引言
一、广播及连接建立
1.1 广播类型
1.2 扫描/连接请求与响应
1.2.1 广播流程说明
1.2.1.1 广播流程示例图
1.2.1.2 广播信息设置
1.2.1.3 信道广播
1.2.1.4 信道切换
1.2.1.5 广播间隔
1.2.1.6 接收窗口与理论最小传输时间
1.2.2 扫描/连接流程说明
1.2.2.1 扫描/连接流程示例图
1.2.2.2 扫描请求和扫描
1.2.2.3 扫描间隔和扫描窗口
1.2.2.4 扫描请求(可选)
1.2.2.5 扫描响应(可选)
1.2.2.6 连接建立流程
二、数据信道交互中涉及的参数
2.1 Access Address 详解
2.2 CRCinit 详解
2.3 Interval详解
2.4 Timeout 详解
2.5 ChM详解
2.6 Hop详解
2.7 SCA详解
引言
上一篇讲解了广播报文以及数据报文的帧格式,这一章我们来讲广播、连接及扫描的流程
一、广播及连接建立
1.1 广播类型
BLE协议中将发送广播方称为从机,接收广播并可以选择是否发起扫描请求/连接请求的称为主机。
对于主机,BLE协议针对不同用途定义了如下几种不同的广播报文类型:
报文类型 | 是否可扫描 | 是否可连接 | 用途说明 |
---|---|---|---|
通用广播指示(ADV_IND) | 是 | 是 | 用于从机主动广播其存在,支持主机进行扫描与连接。 |
定向连接指示(ADV_DIRECT_IND) | 否 | 是 | 用于快速连接已知主机(如配对过的主机)。 |
不可连接指示(ADV_NONCONN_IND) | 否 | 否 | 用于仅广播信息、不接受连接或扫描。 |
可扫描指示(ADV_SCAN_IND) | 是 | 否 | 允许设备被扫描,但不允许连接。相比不可连接指示(ADV_NONCONN_IND),可以携带更多信息,通常用于展示信息后被查询更多内容。 |
由表格可知,从机不同广播报文类型主要是对扫描请求以及连接请求的支持情况不一样,因此我们重点讲解基于通用广播指示(ADV_IND)的扫描和连接请求流程。
1.2 扫描/连接请求与响应
1.2.1 广播流程说明
1.2.1.1 广播流程示例图
1.2.1.2 广播信息设置
上图为通用广播指示(ADV_IND)的报文格式示意图,由图可知其中大部分内容已被协议固定,我们重点关注以下内容:
① 发送地址类型
此字段用来标识广播报文发送者的地址类型。
- 0:公共地址,即MAC地址
- 1:随机地址,由从机动态生成
②Payload
6字节广播地址:根据从机广播的设计方案,填充MAC地址或者随机地址。
31字节(至多)数据:根据从机设计填充数据内容。
1.2.1.3 信道广播
当从机设置好广播信息并发起广播后,每一轮广播会在三个广播信道中依次进行,每一个信道广播完毕后会等待一个固定时间T_IFS(固定150us),这是BLE规范定义的收发切换保护时间,因为BLE本质上是半双工通信,收发不能同时进行。
T_IFS的存在给予了双方硬件和协议处理层一个稳定的时间窗口来切换状态(Rx→Tx或Tx→Rx)。
1.2.1.4 信道切换
BLE协议标准推荐每一轮广播按照37→38→39的顺序进行,同一轮广播中,三个信道的切换间隔不是固定的,主要取决于设备的调度机制和射频切换时间。
一般来说,设备会尽快在 3 个信道上发送广播数据,间隔可能在微秒到毫秒级,但不会有严格的固定值。
1.2.1.5 广播间隔
每两轮周期广播的间隔时间叫做广播间隔,这个时间是可配置的,通常在20ms到10.24s之间(具体范围受 BLE 版本和设备类型限制)。这个时间决定了广播的频率,也影响设备被发现的速度和功耗,另外有的厂商会在每轮广播(三个信道都广播完毕称为一轮)结束后插入一个0~几百us的随机延迟。
低功耗设备(如 Beacon)通常设定较长的广播间隔(如 1s),而希望被快速发现的设备(如配对模式下的耳机)可能会使用较短的广播间隔(如 50ms)。
此外,为了减少碰撞概率,部分厂商会等待广播间隔 + 一定时间延迟再开始下一轮。
1.2.1.6 接收窗口与理论最小传输时间
对于从机,在某一个信道完成广播并等待T_IFS间隔后,还需要在此信道维持Rx状态一段时间,以便于接收可能到来的主机的扫描或连接请求,那么应该等待多长时间呢?
先附上连接请求和扫描请求的帧格式图:
由图可知,扫描请求包长至多22字节,连接请求包长至多44个字节。因此可计算接收窗口大小:
① 1M PHY模式
扫描请求:Rx_Period = 22Byte × 8bit / 1Mbps/s ≈ 176 us
连接请求:Rx_Period = 44Byte × 8bit / 1Mbps/s ≈ 352 us
② 2M PHY模式
扫描请求:Rx_Period = 22Byte × 8bit / 2Mbps/s ≈ 88 us
连接请求:Rx_Period = 44Byte × 8bit / 2Mbps/s ≈ 176us
若接收周期内没有收到连接或扫描请求,则会切换至下一信道继续广播。实际工程上设置的接收窗口会比计算值大不少,以预留足够的冗余时间。
注意:
从机每次在某个信道广播后,必须在T_IFS间隔内从Tx模式切换到Rx模式;而主机则是确认要发起连接或扫描才会从Rx模式切换Tx模式。
1.2.2 扫描/连接流程说明
1.2.2.1 扫描/连接流程示例图
从机发送完广播后,在IFS时间内切换到接收模式,在IFS结束开始等待主机报文(即从机等待接收周期)。BLE主机扫描到从机广播后,如果需要发起连接或扫描,则在IFS时间内切换到发送模式。并在IFS时间结束后发送连接或扫描请求。
主机收到第一帧来自从机的数据信道包后,连接即建立。在此之后的数据信道包交互,就是基于interval的通信:
- 主机 interval 起点 = 收到从机数据包时刻
- 从机 interval 起点 = 收到主机数据包时刻
- IFS 等待时间在发送/接收模式切换之间,且必须强制等待
1.2.2.2 扫描请求和扫描
在讲解扫描流程之前,我们先要区分清楚扫描请求和扫描:
① 扫描请求
这个扫描请求是可选的,其主要意义是使主机可以在建立连接之前,向从机请求查询更多信息,再决定是否要进行连接。(对于不可连接指示(ADV_NONCONN_IND)以及可扫描指示(ADV_SCAN_IND)而言,扫描单纯是为了获取更多信息。由于BLE的低功耗特性,扫描的设计使得从机可以尽可能缩短广播的报文长度,从而降低功耗。)
② 扫描
扫描指的是主机按照扫描间隔和扫描窗口,周期性的在广播信道上检索从机发出的广播报文,并决定是否发起连接的流程。
1.2.2.3 扫描间隔和扫描窗口
① 扫描间隔
主机周期性按照扫描间隔在各个广播信道之间切换。
② 扫描窗口
主机切换到广播信道后,在广播信道等待广播报文的最长时间。如主机收到广播报文后,若决定发起连接,需要在T_IFS后立即返回(在从机接收周期内返回)。
注意:
从扫描和广播的机制可知:主机检测到从机的广播报文是一个概率事件,要想提高主机扫考到从机的成功率,需要合理地设计各个参数,尤其是:广播间隔、接收周期、扫描间隔、扫描窗口。
1.2.2.4 扫描请求(可选)
如果主机接收到广播包后需要获取更多信息,则可以先发起扫描请求,扫描请求包格式如下:
如图,扫描请求中需要填充如下内容:
① 接收和发送地址类型
② 扫描者地址(主机地址)和 广播者地址(从从机的广播报文中拷贝而来)
1.2.2.5 扫描响应(可选)
从机接收到主机的扫描请求后,可以选择是否回复。若选择需要回复,扫描响应格式如下:
如图,扫描响应中需要填充如下内容:
① 发送地址类型
② 广播者地址和扫描者地址(来自于扫描请求)
③ 扫描响应数据(至多31字节)
1.2.2.6 连接建立流程
连接请求的报文格式如下:
其中22字节的LL data格式如下:
字段名 | 字段大小 | 字段说明 |
---|---|---|
Access Address | 4字节 | 链路层连接访问地址:连接建立后,数据信道所有包的标识符(类似TCP连接的端口号) |
CRCinit | 3字节 | 数据信道包的CRC校验初始值,主设备随机生成 |
Winsize | 1字节 | TransmitWindowSize = WinSize * 1.25 ms(主设备发送首个数据包的时间窗口) |
WinOffset | 2字节 | TransmitWindowOffset = WinOffset*1.25ms (从广播结束到首个连接事件的延迟) |
Interval | 2字节 | ConnInterval = Interval *1.25ms(主设备发送连接事件的间隔) |
Latency | 2字节 | 从机最多可以连续跳过(不响应)多少次主机的连接事件 |
Timeout | 2字节 | 规定多长时间没通信连接会断开,Timeout >(1+Latency)*(ConnInterval) |
ChM | 5字节 | 哪些信道可以使用(信道映射,标记37个数据信道的可用性,每bit代表1个信道) |
Hop | 5bit | 跳频增量(范围5-16),用于计算下一个信道:next_ch = (curr_ch + Hop) % 37。 |
SCA | 3bit(和Hop公用一个字节) | 主设备时钟精度信息(主设备睡眠时钟精度(0=250ppm,7=500ppm),影响从设备的时序容差) |
当主机在自身的扫描窗口内,检测到从机的广播报文并解析后,如果主机需要发起连接请求,则主机需要在T_IFS时间内完成从Rx模式到Tx模式的切换,并在从机的接收窗口内发送出连接或扫描请求。
从机接收到连接请求后,以下来自主机请求的参数会参与接下来的流程建立流程:
① Winsize
Winsize用于计算主机从成功发起连接请求后,到发出第一个数据信道包的时间窗口长度,如下:
TransmitWindowSize = WinSize * 1.25 ms
从机若在这个窗口期间没有收到主机发来的数据包,则连接失败。
注意:
1)窗口的计时起点:Tstart = 从机收到主机连接请求的时刻 + 1.25ms + TransmitWindowOffset 。
即从机需要在[Tstart ,Tstart + TransmitWindowSize ] 时间窗口内收到第一帧来自主机的数据包。
这里的1.25ms是BLE协议硬性规定,即使WinOffset 为0,也需要等待1.25ms。
2)TransmitWindowSize 和 TransmitWindowOffset 只针对第一个连接事件!
② WinOffset
WinOffset用于计算TransmitWindowOffset = WinOffset*1.25ms ,Transmit Window Offset代表着收到连接请求后,开始进行数据包窗口计时的偏移量。如下图:
③ Latency
一旦从机接收到主机的数据包,理论上就应该对数据包予以回复。但是Latency扩展了这一逻辑,该参数定义了从机最多可以连续忽略多少个主机连接事件。在Latency达到最大值之后从机必须对主机的数据包进行回复。如果Latency为0则表示从机必须监听并回复每个连接事件。
而一旦从机第一次对主机的数据包进行回复,主机就会认为连接成功建立。
二、数据信道交互中涉及的参数
2.1 Access Address详解
连接建立后,数据信道所有包的标识符都会包含此字段。
2.2 CRCinit详解
数据信道包的CRC校验初始值,主设备随机生成。此值参与后面所有数据信道包的CRC计算。
2.3 Interval详解
当主机认为建立完毕后,会周期给从机发送连接事件(连接事件发生在数据信道),后续所有的数据通信都是基于连接事件。
主机发送连接事件的周期固定,由ConnInterval参数决定:
ConnInterval = Interval *1.25ms(主设备发送连接事件的间隔)
从机也是根据ConnInterval定时监听来自主机的连接事件。双方在连接建立(即从机接收到主机的第一个连接事件并进行响应)后,约定以ConnInterval为周期进行通信,并在通信的剩余间歇进入低功耗状态。
从这个角度而言,连接建立后,BLE其实是固定周期进行数据交互的。
2.4 Timeout详解
用于规定从机多长时间没收到主机的连接事件后,连接会自动断开,Timeout >(1+Latency)*(ConnInterval)
2.5 ChM详解
哪些信道可以使用(信道映射,标记37个数据信道的可用性,每bit代表1个信道)
2.6 Hop详解
跳频增量(范围5-16),用于计算下一个使用的数据信道:下一个信道 = (当前信道+ Hop) % 37。
2.7 SCA详解
SCA用于BLE休眠场景下的时钟同步,如果你的项目是给BLE供常电,不用过于深入。
想了解更多嵌入式技术知识,请点击阅读我的其他文章
烟花的文章链接集合-CSDN博客
如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!