在 UniApp 中实现蓝牙连接多个设备,可以通过微信小程序提供的蓝牙 API 实现。核心步骤包括初始化蓝牙、搜索设备、连接设备、管理多个连接以及数据通信。以下是具体实现方法及示例代码:
实现步骤
-
初始化蓝牙模块
使用 openBluetoothAdapter 开启蓝牙适配器。
-
搜索设备
通过 startBluetoothDevicesDiscovery 开始搜索,监听 onBluetoothDeviceFound 获取设备列表。
-
连接多个设备
对每个目标设备调用 createBLEConnection 建立连接,保存每个设备的 deviceId 用于区分。
-
管理连接状态
使用数组或对象存储多个设备的连接状态和数据。
-
数据通信
连接后通过 writeBLECharacteristicValue 发送数据,监听 onBLECharacteristicValueChange 接收数据。
-
断开连接
使用 closeBLEConnection 断开指定设备,最后关闭适配器。
示例代码
// 存储设备列表和连接状态
let devices = {}; // 以 deviceId 为键存储设备信息
// 1. 初始化蓝牙
uni.openBluetoothAdapter({
success: () => {
console.log('蓝牙适配器开启成功');
startDiscovery();
},
fail: (err) => {
console.error('初始化失败:', err);
}
});
// 2. 搜索设备
function startDiscovery() {
uni.startBluetoothDevicesDiscovery({
services: [], // 指定服务UUID,空数组表示搜索所有设备
success: () => {
console.log('开始搜索设备');
// 监听发现新设备
uni.onBluetoothDeviceFound((res) => {
res.devices.forEach(device => {
if (device.name && !devices[device.deviceId]) {
devices[device.deviceId] = device;
console.log('发现设备:', device.name, device.deviceId);
// 连接符合条件的设备(例如名称匹配)
if (device.name.includes('Target')) {
connectDevice(device.deviceId);
}
}
});
});
}
});
}
// 3. 连接指定设备
function connectDevice(deviceId) {
uni.createBLEConnection({
deviceId,
success: () => {
console.log(`设备 ${deviceId} 连接成功`);
// 获取服务(需根据实际设备替换 serviceId 和 characteristicId)
uni.getBLEDeviceServices({
deviceId,
success: (res) => {
res.services.forEach(service => {
if (service.isPrimary) {
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId: service.uuid,
success: (charRes) => {
charRes.characteristics.forEach(char => {
if (char.properties.notify) {
// 启用通知以接收数据
uni.notifyBLECharacteristicValueChange({
deviceId,
serviceId: service.uuid,
characteristicId: char.uuid,
state: true,
});
}
});
}
});
}
});
}
});
},
fail: (err) => {
console.error(`连接失败:`, err);
}
});
}
// 4. 监听数据接收
uni.onBLECharacteristicValueChange((res) => {
console.log(`设备 ${res.deviceId} 发送数据:`, res.value);
// 处理数据(例如转换为字符串)
let data = String.fromCharCode(...new Uint8Array(res.value));
});
// 5. 发送数据到指定设备
function writeData(deviceId, data) {
// 需要先确保已连接并获取 characteristic(示例中需替换实际UUID)
let serviceId = 'xxx'; // 实际服务UUID
let characteristicId = 'yyy'; // 实际特征值UUID
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: Array.from(data).map(char => char.charCodeAt()),
success: () => console.log('发送成功'),
});
}
// 6. 断开单个设备
function disconnectDevice(deviceId) {
uni.closeBLEConnection({ deviceId });
delete devices[deviceId];
}
// 7. 关闭蓝牙适配器(退出时调用)
function closeBluetooth() {
uni.closeBluetoothAdapter();
}
注意事项
- 设备限制:平台可能限制同时连接的设备数量(例如微信小程序最多同时连接5个)。
- 兼容性:确保蓝牙设备支持 BLE(低功耗蓝牙)。
- 超时处理:添加连接超时逻辑,避免长时间等待。
- 权限:在 manifest.json 中配置蓝牙权限(仅 App 端需要)。
通过以上方法,即可在 UniApp 中实现连接并管理多个蓝牙设备。根据实际设备调整服务 UUID 和特征值。