### 关于 UniApp 蓝牙特征值的读写
在 UniApp 开发中,蓝牙特征值(Characteristics)用于表示蓝牙设备的具体功能和服务。通过读取或写入特征值,可以实现与蓝牙设备之间的数据交互。以下是详细的代码示例以及相关说明。
#### 初始化蓝牙模块
在使用蓝牙功能之前,需要先初始化蓝牙适配器。以下是一个简单的初始化代码:
```javascript
// 【1】初始化蓝牙
function initBlue() {
uni.openBluetoothAdapter({
success(res) {
console.log('初始化蓝牙成功', res);
},
fail(err) {
console.error('初始化蓝牙失败', err);
}
});
}
```
此代码片段展示了如何打开蓝牙适配器并处理其状态变化[^4]。
---
#### 扫描并连接蓝牙设备
完成初始化后,需扫描附近的蓝牙设备并与目标设备建立连接。以下为基本流程:
```javascript
// 【2】开始扫描蓝牙设备
function startScan() {
uni.startBluetoothDevicesDiscovery({
success(res) {
console.log('开始扫描蓝牙设备');
}
});
// 定期监听发现的设备
uni.onBluetoothDeviceFound((devices) => {
devices.devices.forEach(device => {
console.log('找到设备:', device.name, device.deviceId);
});
});
}
// 【3】连接到指定设备
function connectToDevice(deviceId) {
uni.createBLEConnection({
deviceId,
success(res) {
console.log('连接设备成功', res);
},
fail(err) {
console.error('连接设备失败', err);
}
});
}
```
以上代码实现了启动蓝牙设备扫描,并尝试连接至特定设备的功能[^1]。
---
#### 获取服务与特征值
一旦建立了与目标设备的连接,则需要获取该设备的服务及其特征值列表。
```javascript
// 【4】获取所有服务
function getServices(deviceId) {
uni.getBLEDeviceServices({
deviceId,
success(res) {
const services = res.services;
console.log('获取到的服务列表:', services);
if (services.length > 0) {
getServiceCharacteristics(deviceId, services[0].uuid); // 假设只关注第一个服务
}
},
fail(err) {
console.error('获取服务失败', err);
}
});
}
// 【5】获取某个服务下的所有特征值
function getServiceCharacteristics(deviceId, serviceId) {
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success(res) {
const characteristics = res.characteristics.filter(char => char.properties.read || char.properties.write || char.properties.notify);
console.log('获取到的特征值列表:', characteristics);
if (characteristics.length > 0) {
readCharacteristicValue(deviceId, serviceId, characteristics[0].uuid); // 尝试读取第一个特征值
}
},
fail(err) {
console.error('获取特征值失败', err);
}
});
}
```
上述代码演示了如何检索蓝牙设备的服务和特性,并筛选出具有 `read`、`write` 或 `notify` 权限的特征值[^1]。
---
#### 特征值的读写操作
最后一步是对选定的特征值执行具体的读取或写入操作。
##### (1)读取特征值
```javascript
// 【6】读取特征值
function readCharacteristicValue(deviceId, serviceId, characteristicId) {
uni.readBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
success(res) {
console.log('读取特征值成功', res);
},
fail(err) {
console.error('读取特征值失败', err);
}
});
}
```
##### (2)写入特征值
```javascript
// 【7】写入特征值
function writeCharacteristicValue(deviceId, serviceId, characteristicId, value) {
const buffer = new ArrayBuffer(1); // 创建一个长度为1字节的缓冲区
const dataView = new DataView(buffer);
dataView.setUint8(0, value); // 设置要发送的数据
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buffer,
success(res) {
console.log('写入特征值成功', res);
},
fail(err) {
console.error('写入特征值失败', err);
}
});
}
```
这两个函数分别完成了对蓝牙设备特征值的读取和写入操作[^3]^。
---
#### 注意事项
- **权限声明**:确保已在项目的 `manifest.json` 文件中配置了蓝牙权限。
- **错误处理**:实际应用中应增加更多异常捕获逻辑以提升稳定性。
- **平台差异**:不同操作系统可能会存在细微的行为差别,请测试兼容性。
---