广播和扫描在无线通信中是非常重要的一个技术点。在BLE中,扫描和广播是通信的基础,用户可以直接用扫描和广播进行数据的传输(数据量不大,功耗要求较高的情况下),也可以在广播和扫描的基础上进行连接后点对点通信。
目前BLE广播有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场景。
一个广播数据包最长为37个字节 , 前6个字节为设备地址,后面是数据区,数据区最大31个字节,又分为若干个AD Sturcture,扩展广播包的最大长度为255字节。 数据区没用完的话,系统会在后面补0。
每个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, /* 厂商自定义数据 */
数据格式与广播数据格式一样,可以用于拓展广播数据大小,数据最大同样为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),如果需要固定广播间隔,则需要将两个参数设置成一样。
之所以要这么设计,是为了防止在批量测试或者使用设备时,由于多个设备的同时广播,而形成数据风暴,防止设备之间的干扰。
扫描窗口(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
学习笔记,有问题欢迎指出