uniapp蓝牙开发实例详解:从入门到实战
在uniapp中进行蓝牙开发时,如何实现设备扫描、连接和数据传输功能?能否提供一个完整的实例代码,包括权限配置、API调用和常见错误处理?
2 回复
UniApp蓝牙开发:
- 初始化蓝牙模块:
uni.openBluetoothAdapter() - 搜索设备:
uni.startBluetoothDevicesDiscovery() - 连接设备:
uni.createBLEConnection() - 读写特征值:通过
uni.writeBLECharacteristicValue()和uni.readBLECharacteristicValue() - 注意:需在
manifest.json配置蓝牙权限,真机调试。
实战可结合具体设备协议,如心率仪、智能硬件等。
Uniapp蓝牙开发实例详解
蓝牙开发基础
1. 初始化蓝牙模块
// 初始化蓝牙模块
uni.openBluetoothAdapter({
success: (res) => {
console.log('蓝牙模块初始化成功')
this.startBluetoothDevicesDiscovery()
},
fail: (err) => {
console.log('蓝牙模块初始化失败', err)
}
})
2. 搜索蓝牙设备
// 开始搜索蓝牙设备
startBluetoothDevicesDiscovery() {
uni.startBluetoothDevicesDiscovery({
services: [], // 指定要搜索的服务UUID
allowDuplicatesKey: false, // 是否允许重复上报设备
interval: 0, // 上报设备的间隔
success: (res) => {
console.log('开始搜索设备')
this.listenDevices()
},
fail: (err) => {
console.log('搜索设备失败', err)
}
})
}
3. 监听发现设备
// 监听发现新设备事件
listenDevices() {
uni.onBluetoothDeviceFound((devices) => {
console.log('发现新设备', devices.devices)
// 将设备添加到列表
this.deviceList = this.deviceList.concat(devices.devices)
})
}
完整实战示例
连接蓝牙设备
// 连接蓝牙设备
connectDevice(deviceId) {
uni.createBLEConnection({
deviceId: deviceId,
success: (res) => {
console.log('连接成功', res)
this.getBLEDeviceServices(deviceId)
},
fail: (err) => {
console.log('连接失败', err)
}
})
}
获取设备服务
// 获取蓝牙设备所有服务
getBLEDeviceServices(deviceId) {
uni.getBLEDeviceServices({
deviceId: deviceId,
success: (res) => {
console.log('获取服务成功', res.services)
// 通常第一个服务是主要服务
if (res.services.length > 0) {
this.getBLEDeviceCharacteristics(deviceId, res.services[0].uuid)
}
}
})
}
获取特征值
// 获取特征值
getBLEDeviceCharacteristics(deviceId, serviceId) {
uni.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId,
success: (res) => {
console.log('获取特征值成功', res.characteristics)
// 找到可读写的特征值
const characteristic = res.characteristics.find(char =>
char.properties.read && char.properties.write
)
if (characteristic) {
this.notifyBLECharacteristicValueChange(deviceId, serviceId, characteristic.uuid)
}
}
})
}
启用特征值变化通知
// 启用特征值变化通知
notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId) {
uni.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
state: true,
success: (res) => {
console.log('启用通知成功')
this.listenValueChange()
}
})
}
监听数据接收
// 监听特征值变化
listenValueChange() {
uni.onBLECharacteristicValueChange((res) => {
console.log('接收到数据', res.value)
// 将ArrayBuffer转换为字符串
const data = this.ab2hex(res.value)
console.log('接收数据:', data)
})
}
// ArrayBuffer转16进制字符串
ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
bit => ('00' + bit.toString(16)).slice(-2)
)
return hexArr.join('')
}
发送数据
// 向设备发送数据
sendData(data) {
uni.writeBLECharacteristicValue({
deviceId: this.deviceId,
serviceId: this.serviceId,
characteristicId: this.characteristicId,
value: this.str2ab(data),
success: (res) => {
console.log('发送成功')
},
fail: (err) => {
console.log('发送失败', err)
}
})
}
// 字符串转ArrayBuffer
str2ab(str) {
const buffer = new ArrayBuffer(str.length)
const dataView = new DataView(buffer)
for (let i = 0; i < str.length; i++) {
dataView.setUint8(i, str.charCodeAt(i))
}
return buffer
}
注意事项
- 权限配置:在manifest.json中配置蓝牙权限
- 设备兼容性:不同设备可能有不同的蓝牙实现
- 错误处理:做好各种异常情况的处理
- 连接管理:及时关闭不需要的连接
这个实例涵盖了Uniapp蓝牙开发的主要流程,包括初始化、搜索、连接、数据收发等关键步骤。

