登录
主页
蓝牙协议中的通用唯一识别码( UUID)
2025-07-28
  
1076
深数据
在蓝牙协议中,UUID(通用唯一识别码,Universally Unique Identifier) 是一种标准化的 128 位数字标识符,用于唯一标识蓝牙设备中的服务、特征、描述符等核心组件,确保不同设备之间能准确识别和通信。它相当于蓝牙通信中的“身份证”,让设备明确“要连接什么服务”“如何交互数据”。蓝牙 UUID 是设备服务和特征的“数字身份证”,通过标准化和自定义两种形式,确保蓝牙设备间能准确识别、通信和交互。在开发中,需根据功能需求选择标准 UUID(简化开发)或自定义 UUID(实现私有功能),并注意其 128 位格式的正确使用。
一、UUID 的核心作用
蓝牙协议(尤其是低功耗蓝牙 BLE)通过 UUID 实现设备间的标准化通信。例如,当一个蓝牙设备(如智能手环)向外界广播服务时,会携带对应的 UUID,其他设备(如手机)通过识别这些 UUID,就能知道该设备提供哪些功能(如心率监测、数据传输等),并建立针对性的连接。
二、UUID 的格式与分类
蓝牙 UUID 通常以 128 位二进制数表示,为了便于人类阅读,会转换为 8-4-4-4-12 的十六进制字符串格式(共 36 个字符),例如:`0000180D-0000-1000-8000-00805F9B34FB`。
根据蓝牙技术联盟(Bluetooth SIG)的规范,UUID 分为两类:
1.标准 UUID(SIG 定义 UUID)
蓝牙 SIG 预定义了一系列常用服务的 UUID,用于标准化功能(如心率、电池电量、设备信息等)。为简化使用,标准 UUID 可通过一个 16 位或 32 位的短 UUID 表示,实际使用时会自动扩展为 128 位完整格式。
例如:
心率服务的 16 位 UUID 是 `0x180D`,扩展为 128 位后为 `0000180D-0000-1000-8000-00805F9B34FB`;
电池服务的 16 位 UUID 是 `0x180F`。
2.自定义 UUID(厂商/开发者定义)
对于非标准化的私有服务(如厂商自定义的设备控制功能),开发者需要自行生成 128 位 UUID,确保其唯一性(可通过 UUID 生成工具创建)。自定义 UUID 没有短格式,必须完整使用 128 位格式。
三、UUID 在蓝牙通信中的具体应用
1.服务识别:设备广播时通过 UUID 声明自身提供的服务(如 `0x180D` 表示支持心率服务),扫描设备据此判断是否需要连接。
2.特征交互:每个服务包含多个“特征”(Characteristic),特征也有独立 UUID,用于标识具体的数据类型(如心率测量值的特征 UUID 为 `0x2A37`)。手机等设备通过读写特征 UUID 对应的数据,实现与设备的通信(如读取实时心率)。
3.唯一性保障:UUID 的全球唯一性确保不同厂商的设备服务不会冲突,例如 A 厂商的“灯光控制服务”和 B 厂商的同名服务可通过不同 UUID 区分。
四、查看和使用UUID的方法
1.查看UUID
通过开发工具查看
Android平台:可以使用Android提供的BluetoothGatt类来获取蓝牙设备的UUID。通过该类连接到BLE设备后,调用`getServices()`方法获取服务列表,再通过`service.getUuid().toString()`获取每个服务的UUID。
iOS平台:在iOS开发中,使用Core Bluetooth框架来操作蓝牙。通过`CBPeripheral`对象的`services`属性可以获取到服务列表,每个`CBService`对象都有一个`UUID`属性,通过该属性可以获取到服务的UUID。
使用蓝牙调试工具查看
nRF Connect:这是一款常用的蓝牙调试工具,可在Android和iOS设备上使用。安装后,扫描附近的BLE设备,连接设备后即可查看设备提供的服务和相应的UUID。
Bluetooth Explorer:这是macOS系统下的一款工具,可以查看蓝牙设备的服务和UUID。
通过命令行工具查看:在Linux或macOS系统中,可以使用`bluetoothctl`命令来查看设备的UUID。打开终端并输入`bluetoothctl`进入蓝牙控制台,输入`devices`命令列出已配对的设备,选择要查看UUID的设备,输入`info <设备MAC地址>`,在设备信息中可以找到`UUIDs`字段,它列出了设备支持的所有服务的UUID。
2.使用UUID
连接设备:在进行蓝牙通信时,需要使用UUID来连接蓝牙设备并进行数据交互。首先要获取设备的UUID,可以通过蓝牙设备的广播信息或者连接后读取设备的UUID列表来获取。然后在代码中设置正确的UUID来与蓝牙设备进行通信。
读写数据:连接成功后,可以根据设备的服务和特征的UUID来操作对应的属性,进行数据的读取或写入。例如在Android中,通过`BluetoothGattService service = gatt.getService(SERVICE_UUID);`获取服务,再通过服务获取特征,进而进行读写操作。
服务发现与匹配:当扫描到多个蓝牙设备时,可以根据UUID来识别特定的服务,判断该设备是否提供了所需的功能。例如,心率监测服务的UUID是`0x180D`,如果设备广播的服务中包含该UUID,就说明它支持心率监测功能。
五、查看蓝牙设备UUID的工具
nRF Connect:这是一款常用的蓝牙调试工具,支持Android和iOS设备。安装后,可扫描附近的BLE设备,连接设备后即可查看设备提供的服务和相应的UUID。
Bluetooth Explorer:这是macOS系统下的工具,能够查看蓝牙设备的服务和UUID。
蓝牙调试宝:是为蓝牙相关开发人员量身定制的APP,支持循环搜索设置,可自动确认UUID,实时显示搜索到的设备信息,包括信号强度、MAC地址、配对等。
BLE调试工具:一款专为蓝牙低功耗(BLE)设备调试而设计的工具,可方便地查看UUID、特征值、属性等信息。
BLECommonTool:支持过滤已连接BLE设备和广播中的BLE设备,连接成功后,会自动显示所有的服务及特征UUID,点击官方UUID,还会显示当前ID的名称及类型。
命令行工具:在Linux或macOS系统中,可以使用`hcitool`和`gatttool`命令来扫描和查看BLE设备的服务UUID。
六、微信小程序使用
在微信小程序的蓝牙接口中,`wx.onBluetoothDeviceFound` 回调返回的同一设备的 `deviceId` 通常不会随刷新或重连而变化,但存在特殊情况,具体取决于设备和蓝牙协议实现:
1.正常情况下:`deviceId` 保持稳定
`deviceId` 是微信小程序对蓝牙设备的唯一标识,通常基于设备的 MAC地址 或蓝牙协议中的 UUID(通用唯一识别码) 生成。对于大多数标准蓝牙设备(如蓝牙音箱、智能硬件等),其硬件标识(MAC/UUID)是固定的,因此微信生成的 `deviceId` 也会保持一致。
即使断开连接后重新扫描,或小程序重启后再次发现设备,`deviceId` 通常会重复出现,可用于识别同一设备。
2.特殊情况下:`deviceId` 可能变化
设备使用动态MAC地址:部分蓝牙设备(尤其是低功耗蓝牙 BLE 设备)支持 动态MAC地址 功能(出于隐私保护),会在每次连接或重启时随机生成新的MAC地址。此时微信基于动态MAC生成的 `deviceId` 会随之变化。
蓝牙协议兼容性问题:少数设备的蓝牙协议实现不规范,可能导致微信无法稳定获取其唯一标识,从而每次扫描生成不同的 `deviceId`。
小程序蓝牙模块缓存问题:极个别情况下,小程序蓝牙模块的缓存异常可能导致 `deviceId` 临时错乱,但重启小程序或手机蓝牙后通常可恢复正常。
3.开发建议
若需长期识别同一设备,建议结合设备的 `name`(设备名称)或广播数据中的 `manufacturerData`(厂商自定义数据)辅助判断,避免仅依赖 `deviceId`。
对于动态MAC设备,可通过设备广播中的固定特征(如厂商ID、设备型号信息)进行二次校验,确保设备识别准确性。
点赞数:2
© 2021 - 现在 杭州极深数据有限公司 版权所有 联系我们 
浙公网安备 33018302001059号  浙ICP备18026513号-1号