清泛IT社区

标题: BLE协议—广播和扫描 [打印本页]

作者: App Inventor 2     时间: 2024-05-28 10:32
标题: BLE协议—广播和扫描

广播和扫描在无线通信中是非常重要的一个技术点。在BLE中,扫描和广播是通信的基础,用户可以直接用扫描和广播进行数据的传输(数据量不大,功耗要求较高的情况下),也可以在广播和扫描的基础上进行连接后点对点通信。

广播

(, 下载次数: 13683)

访问地址

广播包:广播包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)
(, 下载次数: 13428)

4种广播的使用场景各不相同
可连接的非定向广播(ADV_IND):可以被连接,可以回复扫描响应包,最常用的广播类型,适合大部分场景。
可连接的定向广播(ADV_DIRECT_IND):可以被连接,不可以回复扫描响应包,适用于连接特定的主设备。
可扫描非定向广播(ADV_SCAN_IND):不可以被连接,可以回复扫描响应包,适用于一些网关子设备。
不可连接的非定向广播(ADV_NONCONN_IND):不可以被连接,不可以回复扫描响应包,适用于beacon场景。
(, 下载次数: 13559)

广播数据PDU

一个广播数据包最长为37个字节 , 前6个字节为设备地址,后面是数据区,数据区最大31个字节,又分为若干个AD Sturcture,扩展广播包的最大长度为255字节。 数据区没用完的话,系统会在后面补0。
(, 下载次数: 13514)

AD Stucture

每个AD Stucture由 长度(1字节)、类型(1字节)、内容(多字节)三个部分组成 , 长度指的是类型+内容字节数。
下列是部分常用的AD Stucture Type

  1.     BLE_AD_TYPE_FLAG                     = 0x01,    /* 设备BLE特性 */
  2.     BLE_AD_TYPE_16SRV_PART               = 0x02,    /* 设备16bit部分uuid */
  3.     BLE_AD_TYPE_16SRV_CMPL               = 0x03,    /* 设备16bit完整uuid */
  4.     BLE_AD_TYPE_32SRV_PART               = 0x04,    /* 设备32bit部分uuid */
  5.     BLE_AD_TYPE_32SRV_CMPL               = 0x05,    /* 设备32bit完整uuid */
  6.     BLE_AD_TYPE_128SRV_PART              = 0x06,    /* 设备128bit部分uuid */
  7.     BLE_AD_TYPE_128SRV_CMPL              = 0x07,    /* 设备128bit完整uuid */
  8.     BLE_AD_TYPE_NAME_SHORT               = 0x08,    /* 设备简短名称 */
  9.     BLE_AD_TYPE_NAME_CMPL                = 0x09,    /* 设备完整名称 */
  10.     BLE_AD_TYPE_TX_PWR                   = 0x0A,    /* 设备广播发射功率 */
  11.     BLE_AD_TYPE_DEV_CLASS                = 0x0D,    /* 设备简单配对OOB标签(设备类别) */
  12.     BLE_AD_TYPE_SM_TK                    = 0x10,    /* 设备安全管理TK值 */
  13.     BLE_AD_TYPE_SM_OOB_FLAG              = 0x11,    /* 设备安全管理OOB标志 */
  14.     BLE_AD_TYPE_INT_RANGE                = 0x12,    /* 设备连接参数范围 */
  15.     BLE_AD_TYPE_SOL_SRV_UUID             = 0x14,    /* 设备16bit服务UUID */
  16.     BLE_AD_TYPE_128SOL_SRV_UUID          = 0x15,    /* 设备128bit服务UUID */
  17.     BLE_AD_TYPE_SERVICE_DATA             = 0x16,    /* 设备16bit服务UUID数据 */
  18.     BLE_AD_TYPE_PUBLIC_TARGET            = 0x17,    /* 设备公共目标地址 */
  19.     BLE_AD_TYPE_RANDOM_TARGET            = 0x18,    /* 设备随机目标地址 */
  20.     BLE_AD_TYPE_APPEARANCE               = 0x19,    /* 设备外观 */
  21.     BLE_AD_TYPE_ADV_INT                  = 0x1A,    /* 设备广播间隔 */
  22.     BLE_AD_TYPE_LE_DEV_ADDR              = 0x1b,    /* 设备BLE地址 */
  23.     BLE_AD_TYPE_LE_ROLE                  = 0x1c,    /* 设备BLE角色 */
  24.     BLE_AD_TYPE_SPAIR_C256               = 0x1d,    /* 设备简单配对哈希C-256 */
  25.     BLE_AD_TYPE_SPAIR_R256               = 0x1e,    /* 设备简单配对随机化器R-256 */
  26.     BLE_AD_TYPE_32SOL_SRV_UUID           = 0x1f,    /* 设备128bit服务UUID */
  27.     BLE_AD_TYPE_32SERVICE_DATA           = 0x20,    /* 设备32bit服务UUID */
  28.     BLE_AD_TYPE_128SERVICE_DATA          = 0x21,    /* 设备128bit服务UUID */
  29.     BLE_AD_TYPE_MANUFACTURER_SPECIFIC    = 0xFF,    /* 厂商自定义数据 */
复制代码

每个BLE设备的广播通常都有带有BLE_AD_TYPE_FLAG类型来表示BLE设备的特性,Flags代表的特性有以下几种:
例如:0x6代表不支持BR/EDR
(, 下载次数: 13777)

广播响应包

数据格式与广播数据格式一样,可以用于拓展广播数据大小,数据最大同样为31字节。
通常动态数据使用常规广播包发送,固定数据则使用响应包进行发送。

广播间隔

BLE设备每次广播时,会在3个广播信道(37/38/39,对应的中心频率是2402MHz,2426MHz,2480MHz)上发送相同的报文,这些报文被称为一个广播事件。两个相邻广播事件之间的时间称为广播间隔。广播间隔是针对从机设备来说的,广播间隔决定了从机设备的广播频率。其实际广播间隔时间为32~16448,单位是0.625ms,所以实际的广播间隔时间是20ms ~10.28s。
下图是一个广播事件。
(, 下载次数: 13591)


从下图可以看出来,两个广播事件之间的间隔T_advEvent为:

  1. T_advEvent = advInterval + advDelay
复制代码

advInterval为用户可配置的广播间隔,范围是20ms ~10.28s
advDelay是一个随机数,范围为0-10ms
然而,在实际配置广播间隔时,配置的是最大广播间隔(Advertising_Interval_Max)和最小广播间隔(Advertising_Interval_Min),如果需要固定广播间隔,则需要将两个参数设置成一样。
之所以要这么设计,是为了防止在批量测试或者使用设备时,由于多个设备的同时广播,而形成数据风暴,防止设备之间的干扰。
(, 下载次数: 13528)

扫描扫描类别扫描窗口和间隔

如果扫描窗口=扫描间隔,则设备会一直扫描,没有间隔。

  1. scan interval = scan window + delay
复制代码

(, 下载次数: 13692)

下图是事件中的图示

(, 下载次数: 13583)

————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq619203312/article/details/135333847





欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3