B站Miachael_ee——蓝牙教程笔记
B站Michael_ee蓝牙教程链接
一、蓝牙开篇介绍
1.蓝牙的最新资讯
- 蓝牙官网链接
(1)蓝牙概述
(2)蓝牙的分类及特点
(3)蓝牙的规范
(4)蓝牙学习资源
2.蓝牙的历史背景
- 维基百科蓝牙介绍链接—>需要科学上网
二、蓝牙协议栈
1.ESP32中蓝牙协议栈
(1)ESP-IDF蓝牙协议栈分类
(2)蓝牙协议栈的架构
(3)ESP-IDF 5.0中蓝牙的目录
- Controller
- host
(4)ESP-IDF 5.0中蓝牙的示例
三、GAP,Generic Access Profile,通用访问配置文件
1.官网文件规范下载
- Core Specification v5.0蓝奏云下载链接
2.GAP的介绍
(1)GAP作用
- 不同的蓝牙设备厂商遵守相同GAP规范,那么不同厂商的蓝牙设备之间就可以建立连接进行通信;
(2)BLE中设备的角色
四、GATT,Generic Attribute,通用属性规范
- GATT是ATT的上层协议(ATT, Attribute ,属性规范)
1.GATT中Client与Server
- Command(命令):通常由主机(客户端,如手机)发送给从设备(服务器,如运动手环),用于控制服务器执行特定操作,如开启或关闭某个服务,设置服务器的工作模式等。服务器收到命令后会立即执行相应操作,一般不需要返回响应;
- Request(请求):由客户端向服务器发送,用于获取服务器上的特定数据或请求执行某个操作,如读取某个特征值、写入数据到特定位置等,服务器在处理请求后会返回一个Response;
- Response(响应):服务器对客户端Request的回复,包含了请求操作的结果或请求的数据。如果请求是读数据,响应中会包含相应的特征值;如果是写操作,响应会告知操作是否成功;
- Notification(通知):服务器主动向客户端发送数据的一种方式,无需客户端确认,常用于实时性要求高但对数据可靠性要求相对较低的场景,如传感器数据的实时更新;
- Indication(指示):类似Notification,但需要客户端确认,服务器发送Indication后,会等待客户端的Confirmation,确保数据可靠传输,适用于对数据准确性要求极高的场景;
- Confirmation(确认):用于对Indication的回应,服务器发送Indication后,客户端需返回Confirmation,告知从设备数据已收到,以确保数据传输的可靠性;
总的来说,Command和Request是客户端发起的控制和获取数据的操作,Response是对Request的回应;Notification和Indication是服务器主动向客户端推送数据的方式,Confirmation是确保Indication数据传输可靠性的机制。
2.GATT中Server中数据的存储格式
- GATT Profile指定了用于交换配置文件数据的结构。此结构定义了在配置文件中使用的诸如服务和特征等基本元素。所有这些元素都包含在属性中。属性协议中使用的属性是承载此配置文件数据的容器。
- 层次结构的最顶层是配置文件。配置文件由一个或多个服务组成,这些服务是实现特定用例所必需的。每个服务由特征或对其他服务的引用构成。每个特征包含一个值,并可能包含关于该值的可选信息。服务、特征及其组成部分(即值和描述符)都包含在配置文件数据中,并存储在服务器的属性中。
(1)GATT中Attribute属性的数据结构
-
Attribute是GATT中最小的数据实体。每个Attribute由 属性句柄(Handle)、属性类型(UUID)、属性值(Value)和访问权限(如可读、可写、可通知)组成;
-
Handle(句柄):Attribute在GATT数据库中的唯一数字标识符(16位无符号整数),由服务器在启动时动态分配,类似“内存地址”;
- 作用:设备间交互时,通过Handle快速定位目标属性,而非通过UUID或Value查找,提升效率;
- 特点:同一连接中保持不变,断开连接后重新分配;
-
UUID(通用唯一标识符):用于标识属性的“功能用途”。格式为16位或128位;
- 分类:
- 标准UUID:蓝牙SIG官方定义,用16位表示;
- 自定义UUID:开发者自行定义,用于私有协议或特殊功能;
- 作用:客户端通过UUID判断属性的功能,决定如何处理Value;
- UUID文档下载链接
- 分类:
-
Value(值):属性的实际数据内容,格式和长度由UUID类型决定;
- 交互方式:
- 读操作:客户端通过Handle读取Value;(客户端通过SDP,服务发现协议,获取句柄值)
- 写操作:客户端通过Handle修改Value;
- 通知/指示:服务器主动向客户端推送Value变化;
- 交互方式:
-
Permissions(访问权限):控制属性Value的读写权限,由服务器在GATT数据库中预先配置
- 常见权限类型:
- 可读(Read):允许客户端读取Value;
- 可写(Write):允许客户端写入Value(可能需要认证);
- 可通知(Notify):允许服务器主动推送Value变化(无需确认);
- 可指示(Indication):允许服务器主动推送Value变化(需客户端确认);
- 常见权限类型:
-
(2)Service的数据结构
-
Service Declaration Attribute(服务声明属性)
- 作用:表示服务的存在和类型,是服务的“入口”;
- 属性类型,标识该属性是用来进行服务声明;
- 0x2800:主服务;独立存在,不依赖其他服务,可被设备端直接发现和访问;
- 0x2801: 次服务;依附于主服务的子功能模块,用于扩展主服务功能,不能独立被客户端发现。需通过主服务的包含属性(Included Service Attribute,UUID=0x2802)间接关联;
- 例如:主服务为“健康检测”(UUID 0x181B)包含此服务“血糖检测”(UUID 0x2A3C)和血氧检测(UUID 0x2A57);
- Value:
- 对于主服务:Value是服务功能的UUID(如0x180F表示电池服务);
- 对于次服务:Value包含服务的UUID和关联主服务的UUID(若有);
- Permissions(访问权限) :通常为只读,客户端通过读取该属性值识别服务类型;
-
Included Service Attribute(包含服务属性)
- 作用:在主服务中声明所包含的次服务,建立主服务与次服务的层级关系;
- 属性类型:标识该属性用于在主服务中引用和包含其他服务,固定为0x2802;
- Value:包含三个关键信息
- 被包含服务的起始句柄;
- 被包含服务的结束句柄;
- 被包含服务的UUID;
- 一个Service可以包含多个Included Service Attribute;
- Permissions(访问权限) :通常为只读;
(3)Characteristic特征值的数据结构
- 1.Characteristic Declaration Attribute(特征声明属性)
- 作用:特征的“入口”,用于描述特征的基本信息;
- 属性类型:固定为0x2803,标识该属性是特征声明;
- Value:
- 属性权限(Properties): 8位无符号整数,每一位代表一种权限或通信方式
- 特征值的句柄(Handle):指向特征值属性的句柄,客户端通过该句柄直接读写数据;
- 特征值的UUID:标识特征的业务类型(如心率测量0x2A37、电池电量0x2A19);
- 访问权限:只读;
- 属性权限(Properties): 8位无符号整数,每一位代表一种权限或通信方式
- 2.Characteristic Value Attribute,特征值属性
- 作用:
- 特征值属性是特征的数据载体,用于存储和传输具体业务信息;
- 客户端与服务器的数据交互(读、写、通知)最终都指向特征值属性;
- 特征属性:UUID,用于标识数据类型,与特征声明属性Value中的特征值UUID一致;
- 标准UUID :蓝牙SIG预定义;
- 自定义UUID:开发者自定义;
- 值:实际存储的数据内容,格式和长度取决于特征类型:
- 访问权限:由特征声明中的属性权限字段决定;
- 作用:
- 3.Characteristic Extended Properties Declartion 特征扩展属性声明
- 作用:特征的“增强补丁”,用于定义复杂的通信行为,如:
- 可靠写入(Reliable Write):确保多次写入的数据被原子性处理;
- 可靠辅助描述符(Reliable Auxiliaries):允许客户端修改特征的元数据(用户描述符);
- 特征属性:UUID,固定为0x2900;
- 属性值:一个字节的位域,每一位代表一种扩展功能;
- 权限:只读;
- 注意:特征声明属性中的Extended Properties(第7位)必须为1,才能启用特征扩展属性;
- 作用:特征的“增强补丁”,用于定义复杂的通信行为,如:
- 4.Characteristic User Description Attribute,用户描述属性
- 作用:用于为特征提供人类可读的文本描述,向客户端解释特征的用途和含义;
- 属性类型:UUID,固定为0x2901;
- 值:通常是简短的描述,例如:Temperature in Celsius;
- 权限:默认只读;
- 5.Client Characteristic Configuration Attribute 客户端配置属性
- 属性类型:UUID,固定为0x2902;
- 值:一个2字节的位域,每一位代表一种功能;
- 6.Server Configuration
- 作用:定义服务器处理通知或指示时的行为,例如:
- 是否允许客户端通过客户端特征配置描述符(UUID 0x2902)启用通知/指示;
- 服务端是否主动发送通知/指示;
- 属性类型:UUID,固定0x2903;
- 值:一个2字节的无符号整数;
- 作用:定义服务器处理通知或指示时的行为,例如:
- 7.Presentation Format显示属性
- 作用:特征的“数据说明书”,帮助客户端正确解析和显示数据;
- UUID固定为0x2904;
- 值:
-
- Aggregate Format 聚合格式属性
- 用于定义多个特征值如何聚合成一个聚合值;
- UUID,固定为0x2905;
- Aggregate Format 聚合格式属性