1. UniApp蓝牙开发入门:从零搭建通信基础
第一次接触UniApp蓝牙开发时,我完全被各种专业术语搞懵了。deviceId、serviceId、characteristic这些概念就像天书一样,直到真正动手做了几个项目才明白其中的门道。现在回头看,其实只要掌握几个关键点,就能快速搭建起蓝牙通信的基础框架。
最核心的准备工作是确认设备支持BLE(低功耗蓝牙)协议。市面上很多老式蓝牙设备使用的是经典蓝牙协议,这和我们要用的BLE完全不同。判断方法很简单:如果设备说明书上写着"Bluetooth 4.0"或更高版本,通常就支持BLE。我遇到过不少开发者在这个基础问题上栽跟头,花几小时调试才发现协议不兼容。
初始化蓝牙模块是整个流程的第一步,也是容易出问题的环节。很多新手会忽略用户可能没开启手机蓝牙的情况,直接导致应用崩溃。正确的做法应该像这样:
javascript复制uni.openBluetoothAdapter({
success(res) {
console.log('蓝牙模块初始化成功')
this.startDiscovery()
},
fail(err) {
console.error('初始化失败:', err)
if (err.errCode === 10001) {
uni.showToast({ title: '请开启手机蓝牙', icon: 'none' })
}
}
})
这里有个实用技巧:在fail回调中根据errCode给出具体提示。比如代码10001表示蓝牙适配器不可用,可能是用户没开蓝牙;10002表示当前设备不支持蓝牙。这些细节处理能让用户体验提升好几个档次。
设备搜索环节要注意性能优化。很多开发者会忘记停止搜索,导致手机电量快速消耗。我建议设置超时自动停止,比如搜索10秒后无论是否找到设备都调用uni.stopBluetoothDevicesDiscovery()。实测发现,持续搜索会使iOS设备发热明显,Android耗电也会加快。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 建立稳定连接的工程实践
连接蓝牙设备看似简单,实则暗藏玄机。我做过压力测试,在50次连续连接中,有3-5次会莫名其妙失败。后来发现这是蓝牙协议栈的固有特性,必须通过重试机制来解决。
最可靠的连接方案应该包含三个关键要素:超时控制、自动重连和异常处理。下面这段代码是我在多个项目中验证过的稳定版本:
javascript复制let retryCount = 0
const connectDevice = (deviceId) => {
uni.createBLEConnection({
deviceId,
success: () => {
retryCount = 0
this.getServices(deviceId)
},
fail: () => {
if (retryCount++ < 3) {
setTimeout(() => connectDevice(deviceId), 1000)
} else {
uni.showToast({ title: '连接失败', icon: 'none' })
}
}
})
}
这段代码实现了:1) 失败后自动重试3次;2) 每次间隔1秒;3) 最终仍失败则提示用户。实际项目中,我还添加了连接超时计时器,防止某些机型上的"僵尸连接"状态。
获取服务(service)和特征值(characteristic)时,有个容易踩的坑:不同厂商对UUID的处理方式不同。有些设备使用标准的16位UUID(如0x180D),有些则用128位自定义UUID。我建议在代码中统一处理:
javascript复制function normalizeUUID(uuid) {
return uuid.t
