蓝牙学习笔记之实例广播数据的解析

须要定义广播类型和广播数据。

BLE 中有两种角色 Central 和 Peripheral ,也就是中心设备和外围设备。中心设备能够主动链接外围设备,外围设备发送广播或者被中心设备链接。外围经过广播被中心设备发现,广播中带有外围设备自身的相关信息。

 

广播包 (Advertising Data)和 响应包 (Scan Response),其中广播包是每一个设备必须广播的,而响应包是可选的。 数据包的格式以下图所示(图片来自官方 Spec):每一个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。html

      Len ,表示接下来的 
Len
       个字节是数据部分。数据部分的第一个字节表示数据的类型 
AD Type
       ,剩下的 
 AD type 很是关键,决定了 AD Data 的数据表明的是什么和怎么解析,这个在后面会详细讲;
  • 无效数据部分 :由于广播包的长度必须是 31 个 byte,若是有效数据部分不到 31 本身,剩下的就用 0 补全。这部分的数据是无效的,解释的时候,忽略便可。

全部的 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: 预留
  • 特别注意的是 : 这里咱们发现咱们的广播数据为0x06,其实就是咱们程序设计广播模式flag:
  • flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;      
  • 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 能够是设备的全名,也能够是设备名字的缩写,其中缩写必须是全名的前面的若干字符。post

  • 设备全名: TYPE = 0x08
  • 设备简称: TYPE = 0x09
  • TX Power Level: TYPE = 0x0A,表示设备发送广播包的信号强度。DATA 部分是一个字节,表示 -127 到 + 127 dBm。spa

  • 带外安全管理(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 个字节:code

  • 前 2 字节:定义最小链接间隔,取值范围:0x0006 ~ 0x0C80,而 0xFFFF 表示未定义;
  • 后 2 字节:定义最大链接间隔,同上,不过须要保证最大链接间隔大于或者等于最小链接间隔。
  • 服务搜寻:外围设备能够要请中心设备提供相应的 Service。其数据定义和前面的 Service UUID 相似:htm

  • 16 bit UUID 列表: TYPE = 0x14
  • 32 bit UUID 列表: TYPE = 0x??
  • 128 bit UUID 列表: TYPE = 0x15
  • Service Data: Service 对应的数据。blog

  • 16 bit UUID Service: TYPE = 0x16, 前 2 字节是 UUID,后面是 Service 的数据;
  • 32 bit UUID Service: TYPE = 0x??, 前 4 字节是 UUID,后面是 Service 的数据;
  • 128 bit UUID Service: TYPE = 0x??, 前 16 字节是 UUID,后面是 Service 的数据;
  • 公开目标地址:TYPE = 0x17,表示但愿这个广播包被指定的目标设备处理,此设备绑定了公开地址,DATA 是目标地址列表,每一个地址 6 字节。图片

  • 随机目标地址:TYPE = 0x18,定义和前一个相似,表示但愿这个广播包被指定的目标设备处理,此设备绑定了随机地址,DATA 是目标地址列表,每一个地址 6 字节。ip

  • Appearance:TYPE = 0x19,DATA 是表示了设备的外观。

  • 厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商本身按照需求添加,里面的数据内容本身定义,咱们的程序在这块添加了mac地址。

  • 还有一些其余的数据,用的很少你们须要能够查阅核心手册。
相关文章
相关标签/搜索