还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

BLE协议—广播和扫描

来源:转载     2024-05-28 10:24:06    人气:     我有话说( 0 人参与)

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

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_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

下图是广播事件中扫描的图示
在这里插入图片描述

ble 广播 扫描

本文源自互联网,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,
版权归原作者,如有问题请联系service@tsingfun.com (编辑:admin)
分享到: