清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.72

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

开通会员送SVIPApp Inventor 2 拓展有奖征文 VIP会员享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 1924|回复: 0
打印 上一主题 下一主题

[经验分享] BLE协议—广播和扫描

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 283 天

    [LV.8]以坛为家I

    527

    主题

    914

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    22449

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 2024-05-28 10:32:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    广播和扫描在无线通信中是非常重要的一个技术点。在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

    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

    广播响应包

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

    广播间隔

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


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

    1. 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。

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

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

    下图是事件中的图示



    ————————————————
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    原文链接:https://blog.csdn.net/qq619203312/article/details/135333847
    App Inventor 2 中文网 - MIT同步更新的中文本土化平台!v2.72 支持Android 14 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2024 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2024-11-24 13:02 , Processed in 0.020994 second(s), 35 queries .