蓝牙Extend Adv说明

蓝牙Extend Adv说明

在蓝牙5.0 Spec之后引入了Extend Adv的一整套控制行为,相比以前简单清晰的BLE Adv,空口交互行为复杂很多,HCI Command也引入新的Command,参数也多了很多。本文重点对Extend Adv进行说明,关于LE Audio和AoA/AoD的概念暂不展开。

本文更多是概述性的讲解,让大家对Extend ADV有个总体认识。更详细的基本概念请大家看Core Specification | Bluetooth® Technology Website,也可以看一些中文博主的讲解:如:BLE_爱洋葱的博客-CSDN博客

本文大多数图片截取自蓝牙5.4-Core Spec

优缺点概述

要理解Extend Adv,主要从需求来分析,其解决了Legacy ADV的一些痛点问题,大致如下:

痛点LegacyExtend
广播长度单笔包最大只能支持31字节,加上scan response也只有31+31=62字节单笔包最大255字节,更多包可以通过AUX_CHAIN_IND连接。同时支持Scan Response机制
多广播同一时间只能支持一组ADV+SCAN_RSP的设置,要实现Mesh的多广播需求只能不断地开关广播引入Advertising SID概念,可以同时开启多组不同配置的广播参数
发送功率配置不支持独立配置广播发送功率不同Advertising SID配置不同的发送功率
Sync通道不支持支持periodic ADV(AUX_SYNC_IND),为LE Audio提供支持
独立Random Address配置不支持可以独立生成Random Address
Coded PHY不支持支持特殊长距离需求,进入连接也是Coded PHY
Connect Req握手不支持(容易Initial进入了,ADV未进入)需要回复Connect Res才进入,可靠性高一些
AoA/AoD不支持支持CIS等特别字段
支持channel选择只能37/38/39primary是37/38/39是短数据,second channel可以选择data channel
同广播更新数据区分手机开启duplicate后更新数据无法上报可以通过Advertising DID更新

当然解决一些问题同时也引入了一些问题

引入问题LegacyExtend
功耗更高1. 只用37/38/39就行;2. 发完3个包就可以进deep sleep1. 37/38/39并不带数据包,需要再second channel才发有效数据;2. 一般需要等second channel发完后才进Deep Sleep
业务逻辑复杂简单清晰复杂,一堆状态
RAM/Code Size需求更多广播总共31+31就可以了,代码也少单包最长255,还支持aux包,还有多ADV,RAM和Code Size需求倍增

由于其功耗更高,业务更复杂,大多数场景下还是用Legacy,Mesh场景用Extend也是使用其多Advertising Set的功能。

包类型

HCI层定义的包类型

Legacy

可以通过HCI_LE_Set_Advertising_Parameters这个Command的Advertising_Type来定义。这个Command只支持定义Legacy的广播。

image-20230729102719325

image-20230729102815505

image-20230729102846829

Extend

可以通过HCI_LE_Set_Extended_Advertising_Parameters[v1]HCI_LE_Set_Extended_Advertising_Parameters[v2]这两个Command来设置,通过Advertising_Event_Properties来设置广播类型。

image-20230729103053285

image-20230729103251953

image-20230729103311130

LL层定义的包类型

空口交互的类型只有4bit,在PDU Type中定义。

image-20230729101405638

蓝牙5.0把广播信道抽象为两类,一种叫主广播信道(Primary),工作在37,38,39三个信道中,蓝牙4.0的广播使用的都是主广播信道,另一种叫第二广播信道(Secondary),工作在0–36的Data信道中,这是蓝牙5.0新增的。

其实可以看出为了兼容考虑,在相同的主广播信道(Primary),由于原本定义有限,Extend在主广播信道(Primary)的PDU Type使用了ADV_EXT_IND

为考虑兼容性,在相同PDU Type下通过所在信道区分和具体行为来分。

需要注意的是,Extend实际通过Common Extended Advertising Payload Format来实现对应HCI Command包类型定义。

image-20230729101835483

image-20230729101914552

广播包定义和Event定义

Event定义

按照是否可以Scan、Connect和Direct,Spec定义了如下Advertising Event类型。

image-20230729110957945

这些事件类型对应的PDU Type和可交互的PDU如下图所示。

image-20230729110859369

Legacy ADV

这里按照HCI_LE_Set_Extended_Advertising_Parameters Command的Advertising_Event_Properties参数来划分各个包类型。

EventPDUConnect-ableScan-ableDirectHigh DutylegacyOmit AddrTxPowerData
Connectable and Scannable UndirectedADV_IND----
Connectable Undirected---------
Connectable DirectedADV_DIRECT_IND----
Non-Connectable and Non-Scannable UndirectedADV_NONCONN_IND------
Non-Connectable and Non-Scannable Directed---------
Scannable UndirectedADV_SCAN_IND-----
Scannable Directed---------
ADV_IND定义

image-20230729113147515

ADV_DIRECT_IND定义

image-20230729113157956

ADV_NONCONN_IND定义

image-20230729113249399

ADV_SCAN_IND定义

image-20230729113313529

Extend ADV

从上述描述可以看出,Extend ADV只用了主广播信道(Primary)的PDU Type使用了ADV_EXT_IND,具体是通过Common Extended Advertising Payload Format来实现对应HCI Command包类型定义。Extend ADV引入了Event的概念,通过AdvModeExtended
Header Flags定义来划分不同Event。

Spec定义的如下,其实就是定义了一系列的Event Type,再根据HCI Command中定义的参数来区分,需要注意的是ADV_EXT_IND本身不带Adv Data,如果HCI Command中定义了Adv Data必须设置ADIAux Ptr,说明在第二广播信道(Secondary)会发送AUX_ADV_IND,数据会在这个包里发送。

注意ADV_EXT_IND本身不带Adv Data!!!

EventPDUConnect-ableScan-ableDirectHigh DutylegacyOmit AddrTxPowerData
Connectable and Scannable Undirected---------
Connectable UndirectedADV_EXT_IND AUX_ADV_IND------
Connectable DirectedADV_EXT_IND AUX_ADV_IND-----
Non-Connectable and Non-Scannable UndirectedADV_EXT_IND AUX_ADV_IND-------
Non-Connectable and Non-Scannable DirectedADV_EXT_IND AUX_ADV_IND------
Scannable UndirectedADV_EXT_IND AUX_ADV_IND-------
Scannable DirectedADV_EXT_IND AUX_ADV_IND------
ADV_EXT_IND定义

image-20230729105339358

AUX_ADV_IND定义

image-20230729110140966

image-20230729110158323

Common Extended Advertising Payload Format定义

所有Extend ADV都是用该格式。也就是下面这些包类型。

image-20230729113525367

帧格式如下所示。

image-20230729113419405

AdvMode

其实就是connectable和scannable的排列组合,由于Extend不支持Connectionable and Scannable所以预留了1个值。

image-20230729113700136

Extend Header

只有Extended Header Flags定义了对应bit位,后续的对应的数据才会存在,数据顺序不变。

image-20230729114140683

Extended Header Flags

对应位设置,相应数据才会存在。

image-20230729114321593

AdvA field

自身的广播地址,地址类型在TxAddr中定义。

image-20230729114419960

TargetA field

目标的地址,地址类型在RxAddr中定义。

image-20230729114545666

CTEInfo field

AoA/AoD的东西。

AdvDataInfo field

最主要的SID,支持多广播设置。DID用于当前广播需要更新Data的场景(常用于传感器之类的广播数据更新,不然手机一般打开了duplicate)。

image-20230729115122523

AuxPtr field

可以配置Aux包的交互信道由Channel Index决定;交互时间点由 Offset UnitsAUX Offset共同决定;交互的PHY由AUX PHY决定;CA用于定义时钟精度,便于长时间的时候不确定窗口开多大。

image-20230729115907889

image-20230729120223359

SyncInfo field

用于Periodic Adv场景,定义了AUX_SYNC_IND PDUs or AUX_SYNC_SUBEVENT_IND PDUs的信息。

image-20230729120454042

image-20230729123559751

TxPower field

指示当前包实际的发送功率,beacon之类定位需要,Controller会填入真实的发送功率。

image-20230729123253990

ACAD field

是变长的,根据Header Length减去其他存在数据后的剩余长度指定。有特殊的用途,暂没用过。

业务模型

Legacy ADV业务模型

基本业务

在设定的advInterval基础上会加入随机的advDelay,以便有相同advInterval的设备不会一直在同一时间发送数据包,导致设备一直冲突。

image-20230728224210968

Event行为
Connectable and scannable undirected-ADV_IND

只有Legacy才有,可以被connect和scan,最常用的包类型。

只有广播包的场景。

image-20230728225455781

被Scan的场景,中间被scan并不会结束Event。

image-20230728225519732

image-20230729125523179

被Connect的场景,收到CONNECT_IND后立即结束广播。

image-20230728230008804

Connectable directed-ADV_DIRECT_IND

Low Duty场景

image-20230729125855482

收到CONNECT_IND后立即结束。

image-20230729125938651

Higi Duty场景。

image-20230729130018445

Scannable undirected-ADV_SCAN_IND

不可被连接,收到SCAN_REQUEST后回复SCAN_RSP,并不会结束Event。

image-20230729130125340

image-20230729130135588

image-20230729130149611

Non-connectable and non-scannable undirected-ADV_NONCONN_IND

只管发广播就行,可以不开Scan Window。

image-20230729130418598

Extend ADV业务模型

基本业务
常规事件

多个Advertising Event也有Random的T_advEvent和advDelay的概念,多个Advertising Event可以共享一个AUX_ADV_IND。

照理说多个Advertising Event共享一个AUX_ADV_IND,功耗应该更低才对,但是实际业内大多数做法是一个Advertising Event对应一个AUX_ADV_IND,然后再睡眠,所以功耗高。

image-20230728224330134

带有AUX_CHAIN_IND的场景,这个场景下如下图所示。

image-20230728224351438

Periodic业务

AUX_ADV_IND中会指向一个AUX_SYNC_IND,两个AUX_SYNC_IND之间是固定的Periodic Advertising Interval

image-20230728224828973

下面是一些Subevent和Response Slot的一些定义。

image-20230729130632388

image-20230729130717035

Event行为
Connectable directed event

能接收AUX_CONNECT_REQ后回复AUX_CONNECT_RSP,之后就进入Connection State。

image-20230729131102137

image-20230729131119641

Scannable undirected event

能接收AUX_SCAN_REQ后回复AUX_SCAN_RSP,之后继续发广播。

image-20230729131356818

image-20230729131418608

Non-connectable and non-scannable undirected event

不会接收SCAN和CONNECT请求。

image-20230729131526297

image-20230729131548885

Connectable undirected event

能接收AUX_CONNECT_REQ后回复AUX_CONNECT_RSP,之后就进入Connection State。

image-20230729131640134

image-20230729131703973

Scannable directed event

Scannable undirected event行为基本一样,但是这个AUX_ADV_IND会带TargetA,并且收到AUX_SCAN_REQ会检查其TxAddr信息是否匹配。

image-20230729131418608

Non-connectable and non-scannable directed event

Non-connectable and non-scannable undirected event行为基本一致,只是会带TargetA信息,接收端需要过滤不是发给自己的数据。

image-20230729131548885

MSC(MESSAGE SEQUENCE CHARTS)

Legacy

可以用Extend发,当然也可以用以前的命令发。

image-20230729134026679

image-20230729134107708

Extend

必须用LE_Set_Extended_Advertising_ParametersLE_Set_Extended_Advertising_DataLE_Set_Extended_Scan_Response_DataLE_Set_Extended_Advertising_Enable来发送。

image-20230729134154641

image-20230729134420870

PERIODIC

注意PERIODIC广播和Extend广播走的命令不同。必须用LE_Set_Extended_Advertising_ParametersLE_Set_Periodic_Advertising_DataLE_Set_Periodic_Advertising_EnableLE_Set_Extended_Advertising_Enable来发送。

image-20230729134525919

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderBob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值