BLE协议—广播和扫描
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq619203312/article/details/135333847
BLE协议—广播和扫描
广播和扫描在无线通信中是非常重要的一个技术点。在BLE中,扫描和广播是通信的基础,用户可以直接用扫描和广播进行数据的传输(数据量不大,功耗要求较高的情况下),也可以在广播和扫描的基础上进行连接后点对点通信。
广播
访问地址
广播包:广播包Access Address 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者)。
数据包:数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。
广播类型
目前BLE广播报文有7种类型,其中关于连接的报文有3种,关于广播方式的报文有4种,分别为可连接的非定向广播(ADV_IND)、可连接的定向广播(ADV_DIRECT_IND)、可扫描非定向广播(ADV_SCAN_IND)、不可连接的非定向广播(ADV_NONCONN_IND)
4种广播的使用场景各不相同
可连接的非定向广播(ADV_IND):可以被连接,可以回复扫描响应包,最常用的广播类型,适合大部分场景。
可连接的定向广播(ADV_DIRECT_IND):可以被连接,不可以回复扫描响应包,适用于连接特定的主设备。
可扫描非定向广播(ADV_SCAN_IND):不可以被连接,可以回复扫描响应包,适用于一些网关子设备。
不可连接的非定向广播(ADV_NONCONN_IND):不可以被连接,不可以回复扫描响应包,适用于beacon场景。
广播数据PDU
一个广播数据包最长为37个字节 , 前6个字节为设备地址,后面是数据区,数据区最大31个字节,又分为若干个AD Sturcture,扩展广播包的最大长度为255字节。 数据区没用完的话,系统会在后面补0。
AD Stucture
每个AD Stucture由 长度(1字节)、类型(1字节)、内容(多字节)三个部分组成 , 长度指的是类型+内容字节数。
下列是部分常用的AD Stucture Type
每个BLE设备的广播通常都有带有BLE_AD_TYPE_FLAG类型来表示BLE设备的特性,Flags代表的特性有以下几种:
例如:0x6代表不支持BR/EDR
广播响应包
数据格式与广播数据格式一样,可以用于拓展广播数据大小,数据最大同样为31字节。
通常动态数据使用常规广播包发送,固定数据则使用响应包进行发送。
广播间隔
BLE设备每次广播时,会在3个广播信道(37/38/39,对应的中心频率是2402MHz,2426MHz,2480MHz)上发送相同的报文,这些报文被称为一个广播事件。两个相邻广播事件之间的时间称为广播间隔。广播间隔是针对从机设备来说的,广播间隔决定了从机设备的广播频率。其实际广播间隔时间为32~16448,单位是0.625ms,所以实际的广播间隔时间是20ms ~10.28s。
下图是一个广播事件。
从下图可以看出来,两个广播事件之间的间隔T_advEvent为:
advInterval为用户可配置的广播间隔,范围是20ms ~10.28s
advDelay是一个随机数,范围为0-10ms
然而,在实际配置广播间隔时,配置的是最大广播间隔(Advertising_Interval_Max)和最小广播间隔(Advertising_Interval_Min),如果需要固定广播间隔,则需要将两个参数设置成一样。
之所以要这么设计,是为了防止在批量测试或者使用设备时,由于多个设备的同时广播,而形成数据风暴,防止设备之间的干扰。
扫描
扫描类别
- 主动扫描:设备主动扫描来获取更多对端设备的信息上报Host,为后续建立链路做准备。主动扫描不仅仅可以扫描到对端设备的广播数据包,还可以捕获对端设备的响应包(回应包)。
- 被动扫描:设备被动扫描周围环境中对等设备发送出来的广播包并直接上报到Host。不连接的情况下常用。
扫描窗口和间隔
-
扫描窗口(scan window):一次扫描进行的时间。范围是4 ~ 16384单位是0.625ms,所以实际的时间是2.5ms ~10.24s。
-
扫描间隔(scan interval):一次扫描窗口开始,到下一次扫描窗口开始的时间。范围是4 ~ 16384单位是0.625ms,所以实际的时间是2.5ms ~10.24s。
如果扫描窗口=扫描间隔,则设备会一直扫描,没有间隔。