uniapp开发应用中使用蓝牙设备时,正确的蓝牙设备初始化、搜索、连接和数据交互过程
1. 初始化蓝牙模块
在使用蓝牙功能之前,首先需要初始化蓝牙模块。以下是初始化蓝牙模块的代码示例:
uni.openBluetoothAdapter({
success(res) {
console.log('初始化蓝牙成功', res);
},
fail(err) {
console.error('初始化蓝牙失败', err);
if (err.errCode === 10001) {
uni.onBluetoothAdapterStateChange((state) => {
if (state.available) {
// 重新初始化蓝牙模块
uni.openBluetoothAdapter();
}
});
}
}
});
补充说明:
- 如果初始化蓝牙失败(错误码为10001),可以监听蓝牙适配器状态变化,并在蓝牙可用时重新初始化。
2. 搜索附近可连接的蓝牙设备
一旦蓝牙模块初始化成功,可以开始搜索附近的蓝牙设备。以下是搜索蓝牙设备的示例代码:
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
interval: 0,
success: (res) => {
console.log("执行搜索成功的回调", res);
},
fail: (error) => {
console.log("搜索失败", error);
}
});
// 定时停止搜索,避免长时间搜索占用系统资源
setTimeout(() => {
uni.stopBluetoothDevicesDiscovery({
success: (res) => {
console.log("停止搜索成功", res);
},
fail: (error) => {
console.log("停止搜索失败", error);
}
});
}, 10000); // 10秒后停止搜索
补充说明:
- 通过定时器,在一定时间后停止搜索,以免长时间搜索消耗系统资源。
3. 连接低功耗蓝牙设备
一旦发现目标蓝牙设备,可以尝试连接。以下是连接低功耗蓝牙设备的示例代码:
uni.createBLEConnection({
deviceId: this.deviceId, // 替换为实际的设备 ID
success: (res) => {
console.log("连接成功", res);
// 连接成功后可以获取设备的服务和特征值
setTimeout(() => this.getBLEDeviceServices(), 1000); // 延迟1秒获取服务
},
fail: (error) => {
console.log("连接失败", error);
if (error.errCode === 10012) {
console.log('连接超时');
} else if (error.errCode === 10013) {
console.log('连接设备不匹配');
}
}
});
补充说明:
- 在连接失败时,根据错误码提供更详细的错误信息和处理策略。
4. 获取蓝牙设备的服务和特征值
成功连接后,需要获取设备的服务和特征值,以便后续的数据交互。以下是获取服务和特征值的示例代码:
uni.getBLEDeviceServices({
deviceId: this.deviceId,
success: (res) => {
console.log('成功获取蓝牙设备的所有服务', res);
this.serviceId = res.services.find(service => service.isPrimary).uuid; // 获取主要服务
this.getBLEDeviceCharacteristics();
},
fail: (error) => {
console.log('获取蓝牙设备的服务失败', error);
}
});
补充说明:
- 确保选择正确的主要服务进行后续操作。
5. 启动 notify 功能监听蓝牙设备回传信息
获取特征值后,根据需要启用 notify 功能以监听蓝牙设备的回传信息。以下是启用 notify 功能的示例代码:
uni.getBLEDeviceCharacteristics({
deviceId: this.deviceId,
serviceId: this.serviceId,
success: (res) => {
console.log('获取 characteristic 成功', res);
const characteristics = res.characteristics;
this.readCharacteristic = characteristics.find(c => c.properties.read).uuid; // 找到读特征值
this.writeCharacteristicId = characteristics.find(c => c.properties.write).uuid; // 找到写特征值
this.startNotify();
},
fail: (error) => {
console.log('获取 characteristic 失败', error);
}
});
// 启动 notify 监听
startNotify() {
uni.notifyBLECharacteristicValueChange({
state: true,
deviceId: this.deviceId,
serviceId: this.serviceId,
characteristicId: this.readCharacteristic,
success: (res) => {
console.log("开启 notify 功能成功", res);
uni.onBLECharacteristicValueChange((res) => {
let resHex = ab2hex(res.value);
console.log("接收到回传内容:", resHex);
this.handleResponse(resHex);
});
},
fail: (error) => {
console.log("监听失败", error);
}
});
}
补充说明:
- 确保特征值支持 notify 或 indicate 功能才能成功调用。
6. 向蓝牙设备发送指令
在连接并启用 notify 功能后,可以向蓝牙设备发送指令。以下是发送指令的示例代码:
let buffer = generateCommand(0xSA, 0x01);
uni.writeBLECharacteristicValue({
deviceId: this.deviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
success(res) {
console.log('指令下发成功', res);
},
fail(error) {
console.log('指令发送失败', error);
}
});
/**
* 生成 ArrayBuffer 格式的数据,可以直接用于给蓝牙设备发送数据
* @param {Number} startCode 起始码
* @param {Number} dataType 数据类型
* @param {Array} sentData 发送给蓝牙的数据数组,例如:[0x12,0x01]
*/
function generateCommand(startCode, dataType, sentData = []) {
let buffer = new ArrayBuffer(20);
let dataView = new DataView(buffer);
dataView.setUint8(0, startCode);
dataView.setUint8(1, dataType);
sentData.forEach((data, index) => {
dataView.setUint8(2 + index, data);
});
return buffer;
}
补充说明:
- 确保生成的指令符合蓝牙设备的协议规范。
7. 解析蓝牙设备的响应数据包
接收到蓝牙设备的响应数据后,需要解析数据以获取实际信息。以下是解析响应数据的示例代码:
function handleResponse(responseData) {
const parsedData = parseBlueResponse(responseData);
console.log('解析后的响应数据:', parsedData);
}
function parseBlueResponse(responseData) {
const dataList = responseData.match(/.{1,2}/g);
const [resCode, resType, resResult] = dataList.splice(0, 3);
return {
resCode,
resType,
resResult,
dataList
};
}
补充说明:
- 确保解析逻辑与蓝牙设备的响应数据格式一致。
8. 结束使用:停止搜索、断开连接和关闭蓝牙模块
最后,当不再需要使用蓝牙功能时,应当停止搜索和断开连接,释放系统资源。
// 停止搜索蓝牙设备
uni.stopBluetoothDevicesDiscovery({
success: (res) => {
console.log("停止搜索成功", res);
},
fail: (error) => {
console.log("停止搜索失败", error);
}
});
// 断开与蓝牙设备的连接
uni.closeBLEConnection({
deviceId: this.deviceId,
success: (res) => {
console.log("断开连接成功", res);
},
fail: (error) => {
console.log("断开连接失败", error);
}
});
// 关闭蓝牙模块
uni.closeBluetoothAdapter({
success: (res) => {
console.log("关闭蓝牙模块成功", res);
},
fail: (error) => {
console.log("关闭蓝牙模块失败", error);
}
});
补充说明:
- 确保在每一步都检查操作是否成功,并处理失败情况。
- 停止搜索和断开连接应尽量在不再需要使用蓝牙功能时及时执行,以优化设备的电池和性能。
通过以上步骤,可以在uniapp中成功地初始化、搜索、连接和与蓝牙设备进行数据交互。