蓝牙

概述

结构

蓝⽛是⼀种短距通信系统,其关键特性包括鲁棒性、低功耗、低成本等。蓝⽛系统分为两种不同的技术:经典蓝⽛ (Classic Bluetooth) 和蓝⽛低功耗 (Bluetooth Low Energy)。
ESP32 ⽀持双模蓝⽛,即同时⽀持经典蓝⽛和蓝⽛低功耗。
从整体结构上,蓝⽛可分为控制器 (Controller) 和主机 (Host) 两⼤部分:

  • 控制器包括 PHY、Baseband、Link Controller、Link Manager、Device Manager、HCI 等模块,⽤于硬件接⼝管理、链路管理等等;
  • 主机包括了 L2CAP、SMP、SDP、ATT、GATT、GAP 以及各种规范,构建了向应⽤层提供接⼝的基础,⽅便应⽤层对蓝⽛系统的访问。

主机可以与控制器运⾏在同⼀个宿主上,也可以分布在不同的宿主上。ESP32 蓝牙主机与控制器关系结构图如下所示。
结构图

运行环境

ESP-IDF 的默认运⾏环境为双核 FreeRTOS,ESP32 的蓝⽛可按照功能分为多个任务 (task) 运⾏,不同任务的优先级也有不同,其中优先级最⾼的为运⾏控制器的任务。控制器任务对实时性的要求较⾼,在 FreeRTOS 系统中的优先级仅次于 IPC 任务(IPC 任务⽤于双核 CPU 的进程间通信)。BLUEDROID(ESP-IDF 默认蓝⽛主机)共包含 4 个任务,分别运⾏ BTC、BTU、HCI UPWARD,及 HCI DOWNWARD。

控制器

ESP32 的控制器同时⽀持 Classic BT 和 BLE,⽀持的蓝⽛版本为 4.2。控制器中主要集成了 H4 协议、HCI、Link Manager、Link Controller、Device Manager、HW Interface 等功能。

Bluedroid

在 ESP-IDF 中,使⽤经过⼤量修改后的 BLUEDROID 作为蓝⽛主机 (Classic BT + BLE)。BLUEDROID 拥有较为完善的功能,⽀持常⽤的规范和架构设计,同时也较为复杂。经过⼤量修改后,BLUEDROID 保留了⼤多数 BTA 层以下的代码,⼏乎完全删去了 BTIF 层的代码,使⽤了较为精简的 BTC 层作为内置规范及 Misc 控制层。
BLUEDROID 内部⼤致分为 2 层:BTU 层和 BTC 层,每个层都有对应的任务来处理。

  • BTU 层:主要负责蓝⽛主机底层协议栈的处理,包括L2CAP、GATT/ATT、SMP、GAP 以及部分规范等,并向上提供以“bta”为前缀的接⼝;
  • BTC 层:主要负责向应⽤层提供接⼝⽀持、处理基于 GATT 的规范、处理杂项等,并向应⽤层提供以“esp”为前缀的接⼝。

所有的 API 都在 ESP_API 层,开发者应当使⽤“esp”为前缀的蓝⽛ API(特殊的除外)。
此框架的其中⼀条设计思路是尽量将蓝⽛相关的任务交给 BTC 来处理,从⽽避免和降低⽤户任务 (User Task) 的负载,也使结构上更加简洁。
由于历史原因和实际需求,经典蓝⽛的部分规范,如 RFCOMM、A2DP 等,中层次偏协议偏底层的部分运⾏在 BTU 层,偏控制流程的以及需要提供 ESP-API 的运⾏在 BTC 层。
蓝⽛低功耗的部分规范或偏底层的功能,如 6LowPan 或 Dynamic L2CAP Channel 的功能,将运⾏在 BTU 层,再通过 BTC 向应⽤层提供 ESP-API。

UUID

概念

UUID 是指(Universally Unique Identifier)通用唯一识别码,128位。
UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突的 UUID,就不需考虑数据库创建时的名称重复问题。其作用视场景而定。

定义

UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符”-“组成,格式为8-4-4-4-12;(一个16进制只代表4个bit,所以是(8+4+4+4+12)*4=128位)

1
2
3
4
5
格式:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

示例:
6d25a684-9558-11e9-aa94-efccd7a0659b

数字 M 的四位表示 UUID 版本,当前规范有5个版本,M可选值为1, 2, 3, 4, 5;
数字 N 的一至四个最高有效位表示 UUID 变体.
在线UUID生成