BLE 广播格式定义

@(嵌入式)[蓝牙]

低功耗蓝牙两类报文 : 广播报文 和 数据报文。 本文讨论广播报文数据段,不包括完整报文其他部分,比如前导,接入地址等

蓝牙设备通过广播表明自己的存在,等待被连接, 就好象一个人站在接口大喊“我要脱单,我要脱单,快来牵手...”。 BLE 考虑功耗, 使用了3个广播信道,顺序广播。

两个蓝牙设备想要建立连接, 第一步是 从机(server) 向外广播, 主机(client) 搜索到后发起请求。 从机广播中包含设备的相关信息,比如设备名称,设备具有的服务uuid 等。

广播包类型

  • 广播包 (Advertising Data)
  • 响应包 (Scan Response) 主机主动扫描的情况下, 发送扫描请求给从机, 从机返回扫描响应数据。

广播数据包格式

7f223bf9-4d85-4e25-917d-222fb063b540.png

每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。

  • 有效数据部分 包含若干个广播数据单元,称为 AD Structure 。如图所示,AD Structure 的组成是:
    • 长度 Len ,表示这个 AD Structure 的长度(除去 len本身 1)
    • 类型 AD Type 标记这段广播数据代表什么, 比如设备名, uuid 等。
    • 数据 AD data
  • 无效数据部分 广播包的长度必须是 31 个 byte,如果有效数据部分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的。

Flags

对于低功耗蓝牙设备, 广播中需要包括的一个 Structure, 包含一个byte 的标记, 标记设备 Flags used over the LE physical channel are:

  • Limited Discoverable Mode
  • General Discoverable Mode
  • BR/EDR Not Supported
  • Simultaneous LE and BR/EDR to Same Device Capable (Controller)
  • Simultaneous LE and BR/EDR to Same Device Capable (Host)

广播设备的服务uuid

假如蓝牙设备有心率等profile, 可以在广播中添加那对应的服务uuid ,这样其他设备可以通过广播直接了解设备具备的功能。 GAP 和 GATT 服务的 UUID 不应该出现在广播中, 这对于每个设备都是具有的。 广播中包含服务uuid 包括六种类型, 对应不同程度 uuid 和列表完整性(complete 和 incomplete)

  • 16-bit Bluetooth Service UUIDs
  • 32-bit Bluetooth Service UUIDs
  • Global 128-bit Service UUIDs

complete 和 incomplete 的区别

比如, 我设备有两个服务对应的 16 bit uuid 分别是 0x1122 和 0x 2233。

  • 如果我只想广播其中一个

value

note

0x03

len

0x02

Incomplete List of 16-bit Service Class UUIDs

0x22

uuid_L

0x11

uuid_H

  • 如果我两个都广播

value

note

0x05

len

0x03

Complete List of 16-bit Service Class UUIDs

0x22

uuid1_L

0x11

uuid1_H

0x22

uuid2_L

0x33

uuid2_H

广播中的厂商信息

这个一段的广播标记时 0XFF, 对应用于标记设备的生产商和其他信息。 数据前两个字节时厂商ID, 其他自定义。

具体其他广播数据段类型详见 参考。

官方提供例子

Value

Notes

0x02

Length of this Data

0x01

Flags

0x06

广播标记头

0x06

Length of this Data

0x09

Complete Local Name

0x50

'P'

0x68

'h'

0x6F

'o'

0x6E

'n'

0x65

'e'

0x05

Length of this Data

0x03

Complete list of 16-bit Service UUIDs, 列出所有服务uuid ,否则使用imcomplete

0x15

PANU service class UUID

0x11

0x1F

Hands-free Audio Gateway service class UUID

0x11

0x01

Length of this data

0x05

Complete list of 32-bit Service UUIDs

0x01

Length of this data

0x07

Complete list of 128-bit Service UUIDs

0x00

End of Data (Not transmitted over the air)


参考

Bluetooth SIG - 增补文档 Bluetooth SIG - 广播类型定义

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

我所理解的接口设计

前言 自己做接口开发的时间也算不短了(三年),想写这篇文章其实差不多已经有一年多的时间了。我将从下面的方向来对我所理解的接口设计做个总结: 接口参数定义 -> ...

33270
来自专栏Android 研究

OKHttp源码解析(四)--中阶之拦截器及调用链

那我们书接上文。上篇文章已经说明了OKHttp有两种调用方式,一种是阻塞的同步请求,一种是异步的非阻塞的请求。但是无论同步还是异步都会调用下RealCall的 ...

43450
来自专栏用户2442861的专栏

操作系统的几种地址详解

http://bbs.chinaunix.net/thread-2083672-1-1.html

31610
来自专栏大内老A

使命必达: 深入剖析WCF的可靠会话[编程篇](下)

整个可靠会话的机制是完全在信道层实现的,而整个信道层的最终缔造者就是绑定,所以可靠会话编程是围绕着绑定进行的。《上篇》对实现可靠会话的绑定元素已经如何使用系统绑...

20870
来自专栏友弟技术工作室

MongoDB简易教程mongo简介及应用场景安装和使用mongodbPHP中操作mongo数据库python中操作mongo数据库

传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无规则数据的存储时,传统关系型数据库建表时对不同字段的处理也显得有些乏力,mongo应运而...

48960
来自专栏Kubernetes

Linux Kernel Cgroups源码浅析

本文是我几个月前在研究linux kernel Cgroups时整理的。文中大部分的理论知识是从网上各种贴子solo的,源码分析部分,我是基于kernel 4....

1.1K80
来自专栏Linyb极客之路

一份超详细的Java问题排查工具单

平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希...

14020
来自专栏用户画像

第31章 配置链路聚合

190. 在S3610 交换机上创建包含有端口Ethernet1/0/1,ID 为2 的聚合端口,其正确命令是_____。B

12910
来自专栏潇涧技术专栏

ChromeADB Project Analysis

chromeadb项目源码:https://github.com/importre/chromeadb chromeadb工具的本质就是利用adb命令以可视化...

39210
来自专栏CSDN技术头条

如何在JavaScript中处理大量数据

在几年之前,开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了,很多Ajax程序需要在客户端和服务器端传输大量的数据。此外,更新DOM节点的处...

19790

扫码关注云+社区

领取腾讯云代金券