蓝牙设备的读写技术本质上是通过无线射频信号实现的数据交互过程,其核心基于蓝牙协议栈(Bluetooth Protocol Stack)的分层设计,不同版本的蓝牙(如经典蓝牙BR/EDR、低功耗蓝牙BLE)在读写机制上略有差异,但核心原理相通。
一、蓝牙通信的底层基础
蓝牙设备工作在2.4GHz ISM公用频段(全球免费开放,无需授权),通过跳频扩频(FHSS)技术减少同频段干扰(每秒跳变1600次,覆盖79个1MHz信道)。通信双方需遵循统一的协议栈规范,确保数据能被正确解析。
蓝牙协议栈从上到下分为多个层级,与“读写操作”最相关的核心层级包括:
GAP(Generic Access Profile):负责设备发现、连接管理(如广播、扫描、建立连接)。
GATT(Generic Attribute Profile):定义数据传输的结构和规则,是设备读写交互的“数据框架”。
ATT(Attribute Protocol):GATT的底层支撑,定义了数据单元(属性)的格式和操作指令(如读、写)。
L2CAP(Logical Link Control and Adaptation Protocol):负责数据分组和重传,确保链路可靠性。
物理层(PHY):处理无线射频信号的调制解调(如BLE的1Mbps/2Mbps速率)。
二、GATT:数据读写的“结构化框架”
蓝牙设备的读写操作本质是对GATT数据结构的访问。GATT采用“服务(Service)-特征(Characteristic)”的树形结构组织数据,类似“文件夹-文件”的关系:
1.服务(Service)
一组相关功能的集合,每个服务由唯一的UUID(通用唯一标识符)标识(如心率服务UUID为`0x180D`)。设备可包含多个服务(如一个智能手环可能有“心率服务”“运动服务”等)。
2.特征(Characteristic)
服务的最小数据单元,是实际存储可读写数据的载体,也由UUID标识(如心率测量特征UUID为`0x2A37`)。每个特征包含:
特征值(Value):实际的二进制数据(如心率值、温度值)。
属性(Properties):定义该特征的操作权限(如`read`(可读)、`write`(可写)、`notify`(可通知)等)。
描述符(Descriptor):对特征的补充说明(如数据格式、单位等)。
举例:当手机读取智能手表的电量时,实际是访问“电池服务(`0x180F`)”中的“电池电量特征(`0x2A19`)”,该特征的`Properties`包含`read`权限,因此手机可读取其`Value`(如`0x64`表示64%电量)。
三、读写操作的完整流程
蓝牙设备的读写交互需经过“发现-连接-访问”三个阶段,以低功耗蓝牙(BLE)为例:
1.设备发现与连接(GAP层)
广播与扫描:蓝牙从设备(如传感器)周期性发送广播包(含设备名称、UUID等信息);主设备(如手机)通过扫描发现广播中的从设备。
建立连接:主设备向从设备发送“连接请求”,协商连接参数(如连接间隔、超时时间),最终建立稳定的双向链路(主从角色可动态切换)。
2.服务与特征发现(GATT层)
连接建立后,主设备需先“探索”从设备的数据结构:
主设备发送`Discover Services`指令,获取从设备的所有服务UUID。
针对目标服务,发送`Discover Characteristics`指令,获取该服务下的所有特征(含UUID、Properties等)。
主设备根据特征的`Properties`判断是否可读写(如仅`read`权限的特征无法写入)。
3.读操作(Read)
当特征支持`read`权限时,主设备可主动读取数据:
主设备通过ATT协议发送`Read Request`指令,携带目标特征的UUID。
从设备收到请求后,查询该特征的`Value`,通过`Read Response`指令返回二进制数据(如`0x0A`表示10℃)。
主设备将二进制数据(`Uint8Array`/`ArrayBuffer`)按约定格式(如UTF-8、十六进制)解析为可读数据(如字符串、数字)。
4.写操作(Write)
当特征支持`write`权限时,主设备可向从设备发送数据:
主设备将待发送的数据转换为二进制(如字符串“ON”转为`[0x4F, 0x4E]`),通过ATT协议发送`Write Request`(带响应)或`Write Command`(不带响应)指令,携带目标特征UUID和二进制数据。
从设备收到数据后:
若为`Write Request`:处理数据后返回`Write Response`,确认接收成功。
若为`Write Command`:不返回响应(适用于对实时性要求高、允许偶尔丢包的场景)。
从设备根据写入的数据执行对应操作(如“ON”指令触发开灯)。
5.主动推送:通知(Notify)与指示(Indicate)
若特征支持`notify`或`indicate`权限,从设备可主动向主设备推送数据(无需主设备请求):
通知(Notify):从设备发送数据后不要求确认,效率高(如心率传感器实时推送心率)。
指示(Indicate):从设备发送数据后需主设备返回`Confirmation`确认,可靠性高(如重要报警信息)。
主设备需先通过“使能通知/指示”操作(写入特征的描述符),才能接收推送。
四、关键技术细节
1.数据格式:蓝牙传输的是二进制数据(`ArrayBuffer`),读写双方需约定编码格式(如UTF-8字符串、16进制数值、小端/大端字节序),否则会出现解析错误(例如同样的`0x31`,可表示数字“1”或字符“1”)。
2.安全性:敏感数据的读写可通过“配对(Pairing)”和“绑定(Bonding)”加密(如BLE的LE Secure Connections),防止数据被窃听或篡改。
3.低功耗优化:BLE通过缩短连接时间、延长休眠间隔减少功耗,因此读写操作需控制数据长度(单次最大20字节,长数据需分片),避免频繁交互。
总结
蓝牙设备的读写本质是主从设备通过GATT协议栈,对“服务-特征”结构中的二进制数据进行规范化交互:读操作是主设备主动请求特征值,写操作是主设备向特征写入指令,而通知/指示则是从设备主动推送数据。理解这一框架,是开发蓝牙应用(如微信小程序BLE读写、蓝牙传感器交互)的核心基础。