微信小程序蓝牙通信实战避坑指南:从UUID解析到数据稳定传输
第一次在小程序里调通蓝牙模块的那个深夜,我盯着手机屏幕上终于跳出来的传感器数据,差点把咖啡打翻在键盘上。这已经是连续第三天的凌晨两点,期间我经历了无数次连接断开、数据乱码、通知不触发的问题。如果你正在经历类似的折磨,这篇文章或许能帮你省下几十个小时的调试时间。
1. UUID的迷宫:如何正确识别蓝牙服务与特征
很多开发者拿到蓝牙模块后的第一反应就是直接开始写连接代码,这往往会导致后续一系列问题。就像我当初一样,直到踩了坑才明白:理解蓝牙服务的层级结构比急着写代码更重要。
典型的蓝牙模块通常包含这样的层级关系:
- 设备层:蓝牙模块本身,通过MAC地址标识
- 服务层(Service):一个设备可能提供多个服务,比如电池服务、设备信息服务等
- 特征层(Characteristic):每个服务包含多个特征,比如电池服务可能有电量读取、充电状态等特征
- 属性层(Property):每个特征具有不同属性,如read/write/notify
最容易出问题的是特征值的UUID识别。我遇到过三种典型情况:
- 标准UUID:像
0000ffe1-0000-1000-8000-00805f9b34fb这样的标准UUID,文档通常会有明确说明 - 短UUID:有些模块文档只提供
FFE1这样的短格式,需要转换为完整格式 - 自定义UUID:完全由厂商自定义的长串UUID,必须严格匹配
javascript复制// 短UUID转换示例
function shortToLongUUID(shortUUID) {
return '0000' + shortUUID.toLowerCase() + '-0000-1000-8000-00805f9b34fb';
}
// 使用示例
const serviceUUID = shortToLongUUID('FFE0');
const characteristicUUID = shortToLongUUID('FFE1');
提示:遇到连接成功但获取不到服务的情况,首先检查UUID格式是否正确。我曾因为少了一个横线调试了整整一天。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据收发陷阱:ArrayBuffer的七十二变
蓝牙通信中最让人头疼的莫过于数据格式转换。小程序蓝牙API只接受ArrayBuffer格式,但实际业务中我们往往需要处理字符串、JSON、十六进制等多种格式。
2.1 发送数据时的常见坑点
案例1:发送简单的控制指令
javascript复制// 错误做法:直接发送字符串
wx.writeBLECharacteristicValue({
value: 'ON' // 这会导致报错
})
// 正确做法:转换为ArrayBuffer
function stringToArrayBuffer(str) {
const buffer = new ArrayBuffer(str.length)
const da
