在 UniApp 中实现蓝牙开发,主要通过调用 UniApp 提供的蓝牙 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('开始扫描设备');
// 监听寻找到新设备事件
uni.onBluetoothDeviceFound(this.onDeviceFound);
}
});
}
3. 发现设备回调
onDeviceFound(devices) {
devices.devices.forEach(device => {
if (device.name && !this.deviceList.some(d => d.deviceId === device.deviceId)) {
this.deviceList.push(device); // 将设备添加到列表
}
});
}
4. 连接设备
uni.createBLEConnection({
deviceId: deviceId, // 目标设备ID
success: (res) => {
console.log('连接成功');
this.getBLEDeviceServices(deviceId); // 获取设备服务
}
});
5. 获取服务并发现特征值
getBLEDeviceServices(deviceId) {
uni.getBLEDeviceServices({
deviceId,
success: (res) => {
res.services.forEach(serviceId => {
this.getBLEDeviceCharacteristics(deviceId, serviceId);
});
}
});
}
getBLEDeviceCharacteristics(deviceId, serviceId) {
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success: (res) => {
res.characteristics.forEach(char => {
if (char.properties.read) {
// 读取特征值
uni.readBLECharacteristicValue({ deviceId, serviceId, characteristicId: char.characteristicId });
}
if (char.properties.notify || char.properties.indicate) {
// 启用通知
uni.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: char.characteristicId, state: true });
}
});
}
});
}
6. 监听数据接收
uni.onBLECharacteristicValueChange((res) => {
const value = ab2hex(res.value); // 将ArrayBuffer转十六进制
console.log('收到数据:', value);
});
// ArrayBuffer转十六进制工具函数
function ab2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
7. 发送数据
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: hex2ab("数据十六进制字符串"), // 需要转换为ArrayBuffer
success: (res) => console.log('写入成功')
});
// 十六进制转ArrayBuffer
function hex2ab(hex) {
let typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(h => parseInt(h, 16)));
return typedArray.buffer;
}
8. 断开连接和清理
uni.closeBLEConnection({ deviceId });
uni.closeBluetoothAdapter();
注意事项:
- 真机调试:蓝牙功能需在真机运行,模拟器不支持
- 权限配置:在 manifest.json 中申请蓝牙权限
- 设备过滤:通过 serviceId 或设备名称过滤目标设备
- 错误处理:所有操作都需要添加 fail 回调处理异常情况
按照以上步骤即可在 UniApp 中实现完整的蓝牙通信功能。实际开发时请根据具体设备的蓝牙协议调整特征值读写逻辑。