cmd line ctl

cmd doec
bluetoothctl 进入蓝牙控制台,也可以在命令后面加参数直接运行
paired-devices 列出所有已配对的设备
devices 列出所有可用的蓝牙设备
info device_mac_address 获取设备的详细信息
power on 打开蓝牙
scan on 扫描设备
scan off 关闭扫描
exit 退出 bluetoothctl


连接流程

  1. 设备发现
    • 扫描:主设备启动扫描,寻找周围的蓝牙设备。
    • 广播:从设备发送广播信号,通知其他设备其可用性和基本信息。
  2. 配对(Pairing)
    • 请求配对:主设备向从设备发送配对请求。
    • 配对方法:
      • PIN 码配对:用户输入一个 PIN 码。
      • 简单配对:通过 NFC 或其他简单的方式。
      • Just Works:无需用户输入(适用于不需要保护的连接)。
    • 确认:双方设备确认配对请求,建立安全连接。
  3. 连接
    • 建立连接:主设备向从设备发送连接请求,从设备响应并建立连接。
    • 连接参数交换:双方交换连接参数(如连接间隔、时隙等)。
  4. 服务发现
    • 服务查询:主设备查询从设备上可用的服务和特征。
    • UUID:主设备通过读取从设备的服务UUID,了解其支持的功能。
  5. 数据传输
    • 写入和读取:
      • 写操作:主设备可以向从设备的特征写入数据。
      • 读操作:主设备可以从从设备的特征读取数据。
    • 通知和指示:
      • 通知:从设备可以主动发送数据(如状态更新)给主设备。
      • 指示:类似于通知,但需要主设备确认。
  6. 断开连接(可选)
    • 断开请求:主设备或从设备可以发送断开连接请求。
    • 确认断开:双方确认并断开连接,释放资源。
  7. 后续操作(可选)
    • 重新连接:如果需要,主设备可以重新连接到从设备。
    • 配对信息存储:双方可以存储配对信息,以便未来的连接更加顺利。


蓝牙协议栈的层次

实现一个BLE应用,需要一个支持BLE射频的芯片,然后基于一个与芯片配套的协议栈,开发蓝牙应用。
协议栈的作用就是软件和硬件之间的桥梁,对应用数据进行封包然后生成可以通过射频发送的空中数据包及其逆向过程。

协议栈.png

应用层(Profiles) 包含公共任务和私有任务。 公共任务时SIG蓝牙协议小组定义的蓝牙任务, 私有任务时用户自定义的蓝牙任务。 开发应用者所有的任务应用就是在这个层。
主协议层 (Host) L2CAP (logic link control and adaptation) L2CAP对LL进行了一次简单封装,L2CAP要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
SMP (Secure manager protocol) 管理BLE连接的加密和安全。
ATT (Attribute protocol) 开发者接触最多的ATT。用来定义用户命令及命令操作的数据,比如读取某个数据,写某个 数据。BLE引入了attribute概念,用来描述 一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令。
GAP (Generic access profile) 主要用来进行广播,扫描和发起连接等。 GAP是对LL层payload(有效数据包)如何 进行解析的两种方式中的一种,最简单的那种。GAP简单的对LL payload进行一些规范和定义。
GATT (Generic attribute profile) GATT用来规范attribute 中的数据内容,并运用group(分组)的概念对attribute 进行分类管理。为主从设备交互数据提供Profile、 Service、Characteristic等概念的抽象、管理。没有GATT,BLE也能跑,但是互联互通会出问题,兼容性差。
控制层 (Controller) PEY (Physical layer 物理层) 指定BLE所用的无线-频段,调制解调方式和方法,传输数据的速度,整个BLE芯片功耗、灵敏度以及selectivity等视频指标。
LL (LinkLayer 链路层) 核心,具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据完整性,ACK接收, 重传,对链路的管理和控制等。 负责把数据发出去或者接收回来,对数据的解析是GAP或者ATT。
HCI (Host controller interface) 主要用于两个MCU实现BLE协议栈的场合,规范两者之间的通讯协议和命令。 HCI是可选的。
  • 应用层:用户应用程序与蓝牙协议栈的接口,负责具体的业务逻辑。
  • GAP 层(Generic Access Profile):处理设备的发现、连接、配对等基本功能。
  • GATT 层(Generic Attribute Profile):用于数据的传输和属性的管理,支持服务和特性的定义。
  • L2CAP 层(Logical Link Control and Adaptation Protocol):提供逻辑链路的控制和适配,负责数据分段和重组。
  • HCI 层(Host Controller Interface):主机与控制器之间的接口,负责控制蓝牙硬件。
  • 底层协议层:包括蓝牙的物理层(PHY)和链路层(LL),负责无线信号的发送和接收。


GATT

  • 蓝牙 GATT(Generic Attribute Profile)是蓝牙低功耗(BLE)通信中的一个关键概念,用于定义如何在蓝牙设备之间传输数据。GATT 是基于属性的协议,使设备能够以一种结构化的方式进行数据交换。

    • GATT 的基本概念
      1. 服务(Service):
        • 服务是一个或多个特征的集合,代表设备的某种功能。例如,一个心率监测设备可能有一个“心率服务”,其中包含读取心率的特征。
      2. 特征(Characteristic):
        • 特征是服务的基本单位,包含数据值(如温度、心率等)和描述该数据的属性(如可读、可写、可通知等)。
      3. 描述符(Descriptor):
        • 描述符是附加信息,用于描述特征的属性或提供额外的元数据。例如,一个特征可能有一个描述符,指示它的数据格式或单位。
    • GATT 的数据结构
      • GATT 使用层次结构组织数据:
        • 主设备(如手机)通过 GATT 访问从设备的服务和特征。
        • 每个服务和特征都有一个唯一的 UUID(通用唯一标识符)。
    • GATT 的工作流程
      1. 服务发现:
        • 主设备在连接后通过 GATT 查询从设备的服务和特征。主设备可以获取所有可用服务的 UUID 和特征信息。
      2. 数据读取:
        • 主设备可以读取特征的值,通常是通过发送一个读取请求。
      3. 数据写入:
        • 主设备可以写入特征的值,通常通过发送写入请求。
      4. 通知和指示:
        • 从设备可以通过通知或指示主动发送数据到主设备。通知是无确认的,而指示需要主设备确认接收。
  • GATT 是蓝牙低功耗通信的核心,提供了结构化和灵活的数据交换方式。通过定义服务、特征和描述符,GATT 使得设备能够高效地进行数据交互,适用于各种应用场景,如健康监测、智能家居等。