乐鑫ESP32-C3 BLE教程
公共基础篇(理论)
红旭无线相关源码的约定俗称
基于VSCODE的ESP32C3开发环境的搭建
基于JTAG对ESP32-C3的调试及下载
初识ESP32-C3
ESP32-C3启动流程详解
第一课:Hello World
基于Docker+WSL+VSCODE的ESP32-C3开发环境搭建
BLE
基础篇(理论)
BLE基础知识
BLE的不同地址类型
不同类型的BLE广播事件浅析
BLE扫描的基本概念
广播篇(实战)
可连接可扫描的非定向广播
基于隐私的可连接可扫描的非定向广播
不可连接不可扫描的非定向广播
不可连接不可扫描的定向广播(扩展广播)
不可连接可扫描非定向广播
不可连接可扫描的定向广播(扩展广播)
可连接不可扫描的非定向广播(扩展广播)
不可连接不可扫描的非定向广播(链式广播)
低占空比的可连接不可扫描定向广播
高占空比的可连接不可扫描定向广播
BLE 5.0新特性---广播集(Advertising Set)
BLE 5.0新特性---周期广播(Periodic Advertising)
不可连接不可扫描的非向定匿名扩展广播
不可连接不可扫描的非向定匿名链式广播
不可连接不可扫描的链式周期广播
扫描篇(实战)
扫描非定向广播
扫描非定向广播(基于白名单)
扫描非定向广播(基于隐私)
扫描非定向的扩展广播
扫描定向的扩展广播
扫描可连接定向扩展广播
扫描不可连接不可扫描的链式广播(1650字节)
扫描不可连接不可扫描的匿名扩展/链式广播
扫描周期广播
如无权限阅读,请联系微信:17625815328
-
+
首页
不同类型的BLE广播事件浅析
# 前言 我相信绝大多数BLE新人在接触BLE时,最先接触到的就是BLE广播;蓝牙联盟自Spec v5.0开始,就对BLE的广播特性做了大量升级并新增了很多相关的特性,其中周期广播就是一个非常有用的功能;倘若对这些特性不了解,那么你很有可能就比别人慢一步挖掘一些新兴的市场;因此,本篇将着重讲解BLE不同类型的广播事件,让大家对BLE广播有一个基本的了解。 # 广播事件类型 在讲解广播事件类型之前,我们先看看什么是广播事件: ## 传统广播事件 所谓传统广播事件,指的是在`37,38,39`三个信道传输单个或者多个广播PDUs,如下图所示: ![](https://docdisk.wireless-tech.cn/img/2021/10/24/advertising_event_20211024000501051463.png) 细心的读者可能会发现,在`37`,`38`,`39`三个信道发送完成相应的PDU之后,**为什么还会停留一段时间,然后再切换至下一信道?**这是因为需要预留足够的时间用于`连接请求`、`扫描请求`、`扫描响应`、`帧间隔T_IFS(150us)`以及`信道切换的时间`。换句话说,如果在某些事件上不需要上述对应的某些内容,那么这个停留时间就会相应地减少;但是,这停留时间的长短完全是由协议栈去控制的。 ## 扩展广播事件 相对于上面的[传统广播事件](#传统广播事件),扩展广播事件不单单在`37,38,39`这3个传统的广播信道传输,其还在数据通道上传输广播PDUs,如下图所示: ![](https://docdisk.wireless-tech.cn/img/2021/10/24/extended_adv_event_20211024232829545799.png) 从上图可知,完整的扩展广播事件指的就是从传统广播事件开始,直至辅助广播数据发送完成为止。如果中途有`AUX_CONNECT_REQ`,那么以发出`AUX_CONNECT_RSP`之后为止。同理,因为在`ADV_EXT_IND`之间不允许插入除`帧间隔T_IFS(150us)`和`信道切换的时间`之外的内容,所以发送完成`ADV_EXT_IND`之后,立马切换至下一个信道。 ## 周期广播事件 该广播事件与上面的[扩展广播事件](#扩展广播事件)类似,但是它不是从传统广播事件开始的,详情如下图所示: ![](https://docdisk.wireless-tech.cn/img/2021/10/24/period_adv_event_20211024235534428787.png) 显然,周期广播事件指的是从辅助同步数据开始,直至所有的辅助数据发送完成为止。同理,如果中途有`AUX_CONNECT_REQ`,那么以发出`AUX_CONNECT_RSP`之后为止。 **注意:其中上图中的T_MAFS最小值为300us**。 ------------ 在了解了什么是广播事件之后,接下来我们看看广播事件的类型有哪几种: - 可连接 **表示可以响应连接请求** - 不可连接 **表示不响应连接请求** - 可扫描 **表示可以响应扫描请求** - 不可扫描 **表示不响应扫描请求** - 定向 **表示只响应指定设备的请求** - 非定向 **表示可以响应任意设备的请求** 只有读者理解了上述的单个广播事件类型的含义之后,才能更好地明白它们两两组合所组成下述不同的广播事件的作用: ## 可连接可扫描非定向广播事件(connectable and scannable undirected event) 有了上述单个广播事件类型的概念之后,该广播事件的功能就好理解了,即该事件即可以响应发起者的连接请求,同时也支持响应扫描者的扫描请求;前者用于建立连接,后者则用于向扫描者提供更多关于广播者的消息,这也是我们日常使用最多的一种广播事件。 ## 可连接不可扫描非定向广播事件(connectable undirected event) 该广播事件表示只响应发起者的连接请求,对于任何扫描者的扫描请求都忽略,但是该事件仅用于**扩展广播**。 ## 可连接不可扫描定向广播事件(connectable directed event) 该广播事件不同的地方在于,其只响应被广播者寻址的发起者的连接请求,而且忽略任何扫描者的扫描请求,通常与高占空比的方式搭配使用,用于重连。**仅该广播事件的ADV_DIRECT_IND PDU类型可以支持高占空比和低占空比两种模式**: - 高占空比 其意思就是说,在相同的广播信道上发送的两个连续的ADV_DIRECT_IND PDU之间的时间间隔要少于等于3.75ms; ![](https://docdisk.wireless-tech.cn/img/2021/12/05/high_duty_cycle_connectable_directed_advertising_20211205171259338937.png) 常用于链路层的快速重连的场景。 - 低占空比 同理,其表示在一个广播事件内两个连续的ADV_DIRECT_IND PDU之间的时间间隔要少于等于10ms; ![](https://docdisk.wireless-tech.cn/img/2021/12/05/low_duty_cycle_connectable_directed_advertising_20211205171243959592.png) 其常用于需要与特定设备重新连接,但时间不重要或不知道中央设备是否在范围内的情况。 ## 不可连接不可扫描非定向广播事件(non-connectable and non-scannable undirected event) 该广播事件既不响应发起者的连接请求,也不响应扫描者的扫描请求;也就是说其在链接层不做任何的监听,常用于Beacon相关的应用场景。 ## 不可连接不可扫描定向广播事件(non-connectable and non-scannable directed event) 该广播事件跟上述的**不可连接不可扫描非定向广播事件**的功能基本是一样的,只不过该事件其仅用于**扩展广播**,用于暗示该广播数据是给指定的扫描者。 ## 不可连接可扫描非定向广播事件(scannable undirected event) 该广播事件表示其仅响应扫描者的扫描请求,但是忽略任何发起者的连接请求。 ## 不可连接可扫描定向广播事件(scannable directed event) 该广播事件表示其仅响应广播者所寻址的扫描者的扫描请求,忽略任何发起者的连接请求,但是其仅用于**扩展广播**。 # 总结 介绍完上述不同类型的广播事件之后,敏感的读者可以会觉察到,并不是所有类型的PDU都适用于这些广播事件,换句说有的广播事件仅支持特定类型的PDU,接下来让我们看看它们之间的关系(**为保证原汁原味,这里就不翻译成中文**): <table> <thead> <tr> <th colspan="2"></th> <th colspan="4">Allowable response PDUs</th> </tr> </thead> <tbody> <tr> <td>Advertising Event Type</td> <td>Type of PDU being responded to</td> <td>SCAN_REQ</td> <td>CONNECT_IND</td> <td>AUX_SCAN_REQ</td> <td>AUX_CONNECT_REQ</td> </tr> <tr> <td>Connectable and Scannable Undirected event</td> <td>ADV_IND</td> <td>YES</td> <td>YES</td> <td>NO</td> <td>NO</td> </tr> <tr> <td rowspan="2">Connectable Undirected event</td> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>YES</td> </tr> <tr> <td rowspan="3">Connectable Directed event</td> <td>ADV_DIRECT_IND</td> <td>NO</td> <td>YES</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>YES</td> </tr> <tr> <td rowspan="3">Non-Connectable and Non-Scannable Undirected event</td> <td>ADV_NONCONN_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td rowspan="2">Non-Connectable and Non-Scannable Directed event</td> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td rowspan="3">Scannable Undirected event</td> <td>ADV_SCAN_IND</td> <td>YES</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>YES</td> <td>NO</td> </tr> <tr> <td rowspan="2">Scannable Directed event</td> <td>ADV_EXT_IND</td> <td>NO</td> <td>NO</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>AUX_ADV_IND</td> <td>NO</td> <td>NO</td> <td>YES</td> <td>NO</td> </tr> </tbody> </table> 其中,**SCAN_REQ** 和 **CONNECT_IND** 不支持**CODED PHY**;此外针对扩展广播,还引入了一个非常重要的概念,即`AdvMode`: <table style="undefined;table-layout: fixed; width: 324px"> <colgroup> <col style="width: 89px"> <col style="width: 119px"> <col style="width: 116px"> </colgroup> <thead> <tr> <th>Value</th> <th colspan="2">Mode</th> </tr> </thead> <tbody> <tr> <td>0b00</td> <td>Non-connectable</td> <td>Non-scannable</td> </tr> <tr> <td>0b01</td> <td>Connectable</td> <td>Non-scannable</td> </tr> <tr> <td>0b10</td> <td>Non-connectable</td> <td>Scannable</td> </tr> <tr> <td>0b11</td> <td colspan="2">Reserved for future use</td> </tr> </tbody> </table> 从上表可知,不同的PDU类型对应着不同的广播事件类型;但是,缺少一部分新增类型的PDU对应的广播事件类型,所以下表描述了全部新增类型的PDU所对应的广播事件类型: - ADV_EXT_IND <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_144437_825693.png" width = "500" height = "" alt="" align=center /> <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_140628_354212.png" width = "500" height = "" alt="" align=center /> - AUX_ADV_IND <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_140728_364559.png" width = "500" height = "" alt="" align=center /> <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_140850_761400.png" width = "500" height = "" alt="" align=center /> - AUX_SYNC_IND <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_140953_182932.png" width = "500" height = "" alt="" align=center /> - AUX_CHAIN_IND <img src="https://docdisk.wireless-tech.cn/img/2022/02/28/2022-02-28_141048_806610.png" width = "500" height = "" alt="" align=center /> > **M** 强制要求. **O** 可选. **X** 保留用于以后使用. **C1** LE 1M PHY时,可选,LE Coded PHY时,保留用于以后使用. **C2** 如果对应的字段在ADV_EXT_IND PDU中不存在,则强制要求;否则保留用于以后使用. **C3** 对应的字段存于在该PDU的上一级PDU中,则强制要求;否则保留用于以后使用. **C4** 如果对应的字段在ADV_EXT_IND PDU中不存在,则可选;否则保留用于以后使用. **C5** 对应的字段存于在该PDU的上一级PDU中,则可选,否则保留用于以后使用. 至此,小编相信读者们应该对不同的BLE广播事件类型,已经完全了解了。
红旭无线
2022年9月18日 14:12
4819
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
欢迎关注红旭无线官方微信公众号
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期