一、简介
广播类型有如下:
非定向可连接广播(ADV_IND)。可连接的非定向广播,表示当前设备可以接受任何设备的连接请求。
定向可连接广播(ADV_DIRECT_IND)。可连接的定向广播,设备不能被主动扫描。
非定向不可连接广播(ADV_NONCONN_IND)。不可连接的非定向广播,仅发送广播数据,而不被连接。设备不能被主动扫描。
非定向可发现不可连接广播(ADV_DISCOVER_IND/ADV_SCAN_IND)。可扫描的非定向广播,设备可以被发现。即可以发送广播数据,也可以响应扫描发送回应数据,但不能建立链接。
如果忘记了,可以回顾一下之前的文章:蓝牙学习四(广播)_蓝牙广播-CSDN博客
本章主要介绍ADV_DIRECT_IND定向可连接广播。
二、定向广播PDU
当使用定向可连接广播时,链路层将发送定向广播数据包。也就是说,链路层将不会发送之前设置的广播内容,比如名字,外貌等等。而是发送特定内容类型的广播帧。
定向广播指示数据包中包含如下内容
Access Address(访问地址)
Packet Header(PDU包头)
Advertising Address(广播地址)
Target Address(目标地址)
访问地址还是熟悉的0x8e89bed6,通用访问地址。
PDU包头中包含了广播类型,和发送/接受地址类型。广播类型为ADV_DIRECT_IND定向可连接广播。
广播地址为设备自身的MAC地址。
目标地址为定向要连接的目标设备的地址。
可连接定向广播类型允许主机响应广播事件,从而使得广播者和主机均进入连接状态。 可连接定向广播采用ADV_DIRECT_IND或者ADV_EXT_IND两种数据包类型,前者在主广播信道上发送,后者在主广播信道上发送并指向在副广播信道上发送的辅助广播AUX_ADV_IND数据包。
三、ADV_DIRECT_IND
ADV_DIRECT_IND广播类型使得发起者(主机)能在主广播物理信道上响应链接请求,从而建立ACL(异步无连接,一主多从之间的多点连接)连接。ADV_DIRECT_IND的PDU中包含发起者设备地址和广播者设备地址。仅寻址的发起者可通过向广播者发送CONNECT_IND数据包发起ACL连接。
发起者在一个广播信道发送ADV_DIRECT_IND的数据包后,应在相同的广播信道上监听CONNECT_IND数据包,并忽略可能接收到的任何SCAN_REQ数据包。
当广播者接收到包含其设备地址的CONNECT_IND数据包,且此PDU的设备地址与之前发送的ADV_DIRECT_IND数据包中包含的目标设备地址相同时,应退出广播状态,并切换到连接状态。
当广播者在该信道上没有接收到目标地址的CONNECT_IND时,应转移到下一个主广播物理信道上再次发送ADV_DIRECT_IND数据包,或者关闭广播事件。
ADV_DIRECT_IND中包含“high duty cycle(高占空比)”和“low duty cycle(低占空比)”两种模式。
高占空比可连接定向广播,用于快速ACL连接/重连。该模式为高能耗以及高带宽占用广播模式,仅在需要快速建立连接时使用。
低占空比可连接定向广播,用于慢速ACK连接/重连,或在不知道目标设备是否在通讯范围内使用。
3.1、low duty cycle
在低占空比模式中,在两个ADV_DIRECT_IND数据包发送间隔应小于或等于10毫秒。广播事件应在广播间隔内关闭。
全部主广播信道发送且未收到CONNECT_IND数据包的低占空比模式广播示意图如下图:
下图为在第二个广播信道收到CONNECT_IND数据包的示意图:
使用wireshark抓取数据包如下图:
可以看到,依次在37、38、39信道进行广播。且相邻信道到的广播周期在1毫秒左右。
且地占空比定向广播会一直广播,广播周期在几十毫秒到几百毫秒。
3.2、high duty cycle
在高占空比模式中,在相同广播信道上发送两个ADV_DIRECT_IND数据包的时间间隔应小于或等于3.75毫秒。链路层在进入广播状态后1.28秒内退出广播状态。
使用wireshark抓数据包:
可以看到,在两个37信道发送数据包的间隔为3.751毫秒。
从数据包中也可以看到广播的频率非常快。
整个广播事件只持续了1.28秒后就停止了。
四、ADV_EXT_IND
采用ADV_EXT_IND,发起者(主机)可以在副广播物理信道上响应连接请求,从而建立ACL连接。在此事件中,广播者每发送一个AUX_ADV_IND数据包后,均应在相同的付广播物理信道上监听是否有AUX_CONNECT_REQ数据包,并应忽略可能存在的任何AUX_SCAN_REQ数据包。
当隐私未激活时,广播者接收到包含其设备地址的AUX_CONNECT_REQ数据包,且发起者的设备地址包含在之前AUX_ADV_IND数据包中,广播者应在相同的副广播信道上响应包含此设备地址的AUX_CONNECT_RSP数据包。完成AUX_CONNECT_RSP数据包发送后,广播设备的链路层应退出广播模式,并进入连接状态。任何在副广播物理信道上接收到的AUX_SCAN_REQ数据包均应被忽略。
广播事件中的两个ADV_EXT_IND数据包时间间隔应小于或等于10毫秒。广播事件应在广播间隔内关闭。
副广播信道索引SAdv_idx在ADV_EXT_IND数据包中的AuxPtr字段中指明。
下图为ADV_EXT_IND但未接收到AUX_CONNECT_REQ的情况
下图为ADV_EXT_IND并在副广播信道索引上接收到AUX_CONNECT_REQ数据包
因为目前还没有使用过 ADV_EXT_IND,所以这里不做实例分析。
参考:
低功耗蓝牙广播事件类型之可连接定向广播 - 知乎