wahahahehehe

Tips:

1. 博客内容主要为博主的学习笔记,引用已表明出处,如有侵犯请联系我删除;

2. 如有错误请指出,万分感谢;

3. 博主邮箱:yukai_tao@163.com。

BLE广播

广播

BLE的广播,类似于村头的喇叭,喇叭一响,全村人都通知到位,其目的如下:

  1. 将自身的数据发送出去,此过程不需要建立连接。如蓝牙温度计,将测量的温度通过广播的方式发送出去。
  2. 让别人发现自己并建立连接。通过广播中携带的设备能力、名称以及其他自定义的数据,让周围蓝牙扫描到并建立连接,以便进一步交互。

1、广播通道

广播的数据只能通过37/38/39这三个通道发送出去,默认广播一次在这三个通道上轮流发送一遍数据,每个通道广播间隔小于10ms,也可指定每次广播只在其中某个通道上发送。

image

2、广播间隔

以一定的时间间隔广播数据,这个时间间隔称为广播间隔,即advertising interval。为了改善设备的兼容性,在两个广播时间间隔之间,还会加上一个随机的0-10ms的delay时间。如下图所示,一个广播事件的周期为advertising interval+delay

  • advertising interval的范围为20ms ~ 10.24s,并且是0.625ms的整数倍。
  • 不可连接的广播类型广播间隔最低为100ms。
  • 特殊的定向广播方式:
    • high duty cycle directed advertising,以小于等于3.7ms的广播间隔持续定向广播,且1.28s后需退出此广播模式。用于快速连接,如蓝牙键鼠设备,断开后需要快速连接,就采用这样的定向广播方式。
    • Low duty cycle directed advertising,和普通广播一样。

image

3、广播包PDU格式

image

3.1 Advertising Header

Advertising Header,长度1个字节,每bit的具体定义如下:

  • PDU Type为4 bits,详细定义如下表:

    PDU Type Packet Name Description Payload
    0000 ADV_IND 通用广播指示
    connectable undirected advertising event
    AdvA (6 octets) + AdvData (0-31 octets)
    0001 ADV_DIRECT_IND 定向连接指示
    connectable directed advertising event
    AdvA (6 octets) + InitA (6 octets)
    0010 ADV_NONCONN_IND 不可连接指示
    non-connectable undirected advertising event
    AdvA (6 octets) + AdvData (0-31 octets)
    0011 SCAN_REQ 主动扫描请求
    Scanner wants information from Advertiser
    ScanA (6 octets) + AdvA (6 octets)
    0100 SCAN_RSP 主动扫描响应
    Advertiser gives more information to Scanner
    AdvA (6 octets) + ScanRspData (0-31 octets)
    0101 CONNECT_REQ 连接请求
    Initiator wants to connect to Advertiser
    initA (6 octets) + AdvA (6 octets) + LLData(22 octets)
    0110 ADV_SCAN_IND 可扫描指示
    scannable undirected advertising event
    AdvA (6 octets) + AdvData (0-31 octets)
    0111~1111 Reserved 保留 Reserved Reserved
  • TxAdd/RxAdd,各占1bit,表示随后的Advertiser Address字段代表的蓝牙MAC地址类型,值0代表Public地址,值1代表Random地址。

1)如果只需要定时传输一些简单的数据(如某一个温度节点的温度信息),后续不需要建立连接,则可以使用ADV_NONCONN_IND。广播者只需要周期性的广播该类型的PDU即可,接收者按照自己的策略扫描、接收,二者不需要任何额外的数据交互。

2)如果除了广播数据之外,还有一些额外的数据需要传输,由于种种原因,如广播数据的长度限制、私密要求等,可以使用ADV_SCAN_IND。广播者在周期性广播的同时,会监听SCAN_REQ请求。接收者在接收到广播数据之后,可以通过SCAN_REQ PDU,请求更多的数据。

3)如果后续需要建立点对点的连接,则可使用ADV_IND。广播者在周期性广播的同时,会监听CONNECT_REQ请求。接收者在接收到广播数据之后,可以通过CONNECT_REQ PDU,请求建立连接。

4)通过ADV_IND/CONNECT_REQ的组合建立连接,花费的时间比较长。如果双方不关心广播数据,而只是想快速建立连接,恰好如果连接发起者又知道对方(广播者)的蓝牙地址(如通过扫码的方式获取),则可以通过ADV_DIRECT_IND/CONNECT_REQ的方式。

3.2 Advertiser Address(AdvA)

俗称蓝牙MAC地址,长度为6个字节。如果是广播包,则是advertiser的MAC地址;如果是扫描包或者连接请求包,则是scanner的MAC地址。参考前面的设备地址说明:

image

3.3 AD Type 广播数据格式

所有的 AD Type的定义在文档 Core Specification Supplement 中。 AD Type 包括如下类型:

  • Flags: TYPE = 0x01。这个数据用来标识设备 LE 物理连接的功能。DATA 是 0 到多个字节的 Flag 值,每个 bit 上用 0 或者 1 来表示是否为 True。如果有任何一个 bit 不为 0,并且广播包是可连接的,就必须包含此数据。各 bit 的定义如下:
    • bit 0: LE 有限发现模式
    • bit 1: LE 普通发现模式
    • bit 2: 不支持 BR/EDR
    • bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR
    • bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
    • bit 5..7: 预留
  • Service UUID: 广播数据中一般都会把设备支持的 GATT Service 广播出来,用来告诉外面本设备所支持的 Service。有三种类型的 UUID:16 bit, 32bit, 128 bit。广播中,每种类型类型有有两个类别:完整和非完整的。这样就共有 6 种 AD Type。
    • 非完整的 16 bit UUID 列表: TYPE = 0x02;
    • 完整的 16 bit UUID 列表: TYPE = 0x03;
    • 非完整的 32 bit UUID 列表: TYPE = 0x04;
    • 完整的 32 bit UUID 列表: TYPE = 0x05;
    • 非完整的 128 bit UUID 列表: TYPE = 0x06;
    • 完整的 128 bit UUID 列表: TYPE = 0x07;
  • Local Name: 设备名字,DATA 是名字的字符串。 Local Name 可以是设备的全名,也可以是设备名字的缩写,其中缩写必须是全名的前面的若干字符。
    • 设备全名: TYPE = 0x08
    • 设备简称: TYPE = 0x09
  • TX Power Level: TYPE = 0x0A,表示设备发送广播包的信号强度。DATA 部分是一个字节,表示 -127 到 + 127 dBm。
  • 带外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每个 bit 表示一个功能:
    • bit 0: OOB Flag,0 表示没有 OOB 数据,1 表示有
    • bit 1: 支持 LE
    • bit 2: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
    • bit 3: 地址类型,0 表示公开地址,1 表示随机地址
  • 外设(Slave)连接间隔范围:TYPE = 0x12。数据中定义了 Slave 最大和最小连接间隔,数据包含 4 个字节:
    • 前 2 字节:定义最小连接间隔,取值范围:0x0006 ~ 0x0C80,而 0xFFFF 表示未定义;
    • 后 2 字节:定义最大连接间隔,同上,不过需要保证最大连接间隔大于或者等于最小连接间隔。
  • 服务搜寻:外围设备可以要请中心设备提供相应的 Service。其数据定义和前面的 Service UUID 类似:
    • 16 bit UUID 列表: TYPE = 0x14
    • 32 bit UUID 列表: TYPE = 0x1F
    • 128 bit UUID 列表: TYPE = 0x15
  • Service Data: Service 对应的数据。
    • 16 bit UUID Service: TYPE = 0x16, 前 2 字节是 UUID,后面是 Service 的数据;
    • 32 bit UUID Service: TYPE = 0x20, 前 4 字节是 UUID,后面是 Service 的数据;
    • 128 bit UUID Service: TYPE = 0x21, 前 16 字节是 UUID,后面是 Service 的数据;
  • 公开目标地址:TYPE = 0x17,表示希望这个广播包被指定的目标设备处理,此设备绑定了公开地址,DATA 是目标地址列表,每个地址 6 字节。
  • 随机目标地址:TYPE = 0x18,定义和前一个类似,表示希望这个广播包被指定的目标设备处理,此设备绑定了随机地址,DATA 是目标地址列表,每个地址 6 字节。
  • Appearance:TYPE = 0x19,DATA 是表示了设备的外观。
  • 厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义。

posted on 2021-09-08 20:11  Wahahahehehe  阅读(2139)  评论(0编辑  收藏  举报

导航