uniapp 蓝牙开发如何使用
在uniapp中进行蓝牙开发时,如何实现设备的搜索、连接和数据传输功能?需要调用哪些API?在安卓和iOS平台上是否有兼容性问题?有没有完整的示例代码可以参考?
2 回复
使用uni-app开发蓝牙功能,需调用uni对象中的蓝牙API。主要步骤:初始化蓝牙适配器、搜索设备、连接设备、获取服务与特征值、读写数据。注意在manifest.json中配置蓝牙权限,并处理安卓和iOS的兼容性问题。
在 UniApp 中进行蓝牙开发,主要使用 uni-app 提供的蓝牙 API。以下是核心步骤和代码示例:
1. 初始化蓝牙
首先检查设备蓝牙状态并初始化:
uni.openBluetoothAdapter({
success: (res) => {
console.log('蓝牙初始化成功');
this.startBluetoothDevicesDiscovery();
},
fail: (err) => {
console.error('蓝牙初始化失败', err);
}
});
2. 搜索设备
开始搜索周边蓝牙设备:
startBluetoothDevicesDiscovery() {
uni.startBluetoothDevicesDiscovery({
services: [], // 指定服务UUID,空数组表示搜索所有设备
success: (res) => {
console.log('开始搜索设备');
this.onBluetoothDeviceFound();
},
fail: (err) => {
console.error('搜索失败', err);
}
});
}
3. 监听发现设备
onBluetoothDeviceFound() {
uni.onBluetoothDeviceFound((res) => {
res.devices.forEach(device => {
if (!device.name && !device.localName) return;
console.log('发现设备:', device.name, device.deviceId);
// 这里可以保存设备信息到列表
});
});
}
4. 连接设备
选择设备后建立连接:
uni.createBLEConnection({
deviceId: '选择的设备ID',
success: (res) => {
console.log('连接成功');
this.getBLEDeviceServices();
},
fail: (err) => {
console.error('连接失败', err);
}
});
5. 获取服务
getBLEDeviceServices() {
uni.getBLEDeviceServices({
deviceId: '设备ID',
success: (res) => {
res.services.forEach(service => {
if (service.isPrimary) {
this.getBLEDeviceCharacteristics(service.uuid);
}
});
}
});
}
6. 获取特征值
getBLEDeviceCharacteristics(serviceId) {
uni.getBLEDeviceCharacteristics({
deviceId: '设备ID',
serviceId: serviceId,
success: (res) => {
res.characteristics.forEach(char => {
// 根据properties判断特征值类型
if (char.properties.read) {
// 可读特征
}
if (char.properties.write) {
// 可写特征
}
if (char.properties.notify || char.properties.indicate) {
// 启用通知
this.notifyBLECharacteristicValueChange(char.characteristicId);
}
});
}
});
}
7. 启用通知
notifyBLECharacteristicValueChange(characteristicId) {
uni.notifyBLECharacteristicValueChange({
deviceId: '设备ID',
serviceId: '服务UUID',
characteristicId: characteristicId,
state: true,
success: (res) => {
console.log('通知启用成功');
}
});
}
8. 监听数据接收
uni.onBLECharacteristicValueChange((res) => {
const value = res.value;
// 处理接收到的数据(ArrayBuffer类型)
console.log('收到数据:', this.ab2hex(value));
});
// ArrayBuffer转16进制字符串
ab2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
9. 发送数据
writeBLECharacteristicValue(data) {
const buffer = new ArrayBuffer(data.length);
const dataView = new DataView(buffer);
// 写入数据...
uni.writeBLECharacteristicValue({
deviceId: '设备ID',
serviceId: '服务UUID',
characteristicId: '特征UUID',
value: buffer,
success: (res) => {
console.log('写入成功');
}
});
}
注意事项:
- 真机调试:需要在手机设置中开启蓝牙
- 权限配置:在 manifest.json 中配置蓝牙权限
- 设备兼容性:不同设备蓝牙特性可能不同
- 错误处理:务必添加完整的错误处理逻辑
- 及时清理:页面卸载时停止搜索和断开连接
完整开发流程:初始化 → 搜索 → 连接 → 发现服务 → 发现特征 → 数据通信。建议参考 uni-app 官方文档获取最新 API 说明。

