广播和扫描在无线通信中是非常重要的一个技术点。在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_AD_TYPE_FLAG = 0x01, /* 设备BLE特性 */
- BLE_AD_TYPE_16SRV_PART = 0x02, /* 设备16bit部分uuid */
- BLE_AD_TYPE_16SRV_CMPL = 0x03, /* 设备16bit完整uuid */
- BLE_AD_TYPE_32SRV_PART = 0x04, /* 设备32bit部分uuid */
- BLE_AD_TYPE_32SRV_CMPL = 0x05, /* 设备32bit完整uuid */
- BLE_AD_TYPE_128SRV_PART = 0x06, /* 设备128bit部分uuid */
- BLE_AD_TYPE_128SRV_CMPL = 0x07, /* 设备128bit完整uuid */
- BLE_AD_TYPE_NAME_SHORT = 0x08, /* 设备简短名称 */
- BLE_AD_TYPE_NAME_CMPL = 0x09, /* 设备完整名称 */
- BLE_AD_TYPE_TX_PWR = 0x0A, /* 设备广播发射功率 */
- BLE_AD_TYPE_DEV_CLASS = 0x0D, /* 设备简单配对OOB标签(设备类别) */
- BLE_AD_TYPE_SM_TK = 0x10, /* 设备安全管理TK值 */
- BLE_AD_TYPE_SM_OOB_FLAG = 0x11, /* 设备安全管理OOB标志 */
- BLE_AD_TYPE_INT_RANGE = 0x12, /* 设备连接参数范围 */
- BLE_AD_TYPE_SOL_SRV_UUID = 0x14, /* 设备16bit服务UUID */
- BLE_AD_TYPE_128SOL_SRV_UUID = 0x15, /* 设备128bit服务UUID */
- BLE_AD_TYPE_SERVICE_DATA = 0x16, /* 设备16bit服务UUID数据 */
- BLE_AD_TYPE_PUBLIC_TARGET = 0x17, /* 设备公共目标地址 */
- BLE_AD_TYPE_RANDOM_TARGET = 0x18, /* 设备随机目标地址 */
- BLE_AD_TYPE_APPEARANCE = 0x19, /* 设备外观 */
- BLE_AD_TYPE_ADV_INT = 0x1A, /* 设备广播间隔 */
- BLE_AD_TYPE_LE_DEV_ADDR = 0x1b, /* 设备BLE地址 */
- BLE_AD_TYPE_LE_ROLE = 0x1c, /* 设备BLE角色 */
- BLE_AD_TYPE_SPAIR_C256 = 0x1d, /* 设备简单配对哈希C-256 */
- BLE_AD_TYPE_SPAIR_R256 = 0x1e, /* 设备简单配对随机化器R-256 */
- BLE_AD_TYPE_32SOL_SRV_UUID = 0x1f, /* 设备128bit服务UUID */
- BLE_AD_TYPE_32SERVICE_DATA = 0x20, /* 设备32bit服务UUID */
- BLE_AD_TYPE_128SERVICE_DATA = 0x21, /* 设备128bit服务UUID */
- BLE_AD_TYPE_MANUFACTURER_SPECIFIC = 0xFF, /* 厂商自定义数据 */
复制代码每个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为: - T_advEvent = advInterval + advDelay
复制代码
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。
如果扫描窗口=扫描间隔,则设备会一直扫描,没有间隔。 - scan interval = scan window + delay
复制代码
下图是事件中的图示
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq619203312/article/details/135333847
|