uniapp接收蓝牙设备信息
时间: 2025-04-29 11:55:18 浏览: 24
### 如何在 UniApp 中实现接收蓝牙设备数据
为了实现在 UniApp 应用程序中接收来自蓝牙设备的数据,开发者需遵循特定流程来初始化蓝牙模块并设置相应的监听器。当应用程序与蓝牙外设建立连接之后,可以通过监听 `onBLECharacteristicValueChange` 事件获取由远程设备发出的信息流。
#### 设置蓝牙权限和初始化蓝牙适配器
确保已声明必要的权限,并调用 `uni.openBluetoothAdapter()` 方法启动本地蓝牙服务[^1]:
```javascript
// 在 app.json 或页面配置文件里添加如下权限声明 (仅限 Android)
{
"permissions": {
"android.permission.BLUETOOTH_ADMIN": {},
"android.permission.ACCESS_FINE_LOCATION": {}
}
}
// JavaScript 代码片段用于开启蓝牙适配器
uni.openBluetoothAdapter({
success() {
console.log('蓝牙模块已经成功打开');
},
fail(error) {
console.error(`未能打开蓝牙模块: ${error.errMsg}`);
}
});
```
#### 开始扫描附近的蓝牙设备并与之配对
一旦蓝牙被激活,则可执行搜索操作以发现周围可用的 BLE 设备列表;对于每一个感兴趣的外围装置而言,在尝试与其创建链路之前应当先停止当前正在进行中的任何探测活动[^3]:
```javascript
let foundDevices = [];
function startScanning() {
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
interval: 0,
success() {
console.log('开始扫描...');
// 定期查询新发现的设备
const timerId = setInterval(() => {
uni.getBluetoothDevices({
success(res) {
res.devices.forEach((device) => {
if (!foundDevices.some(d => d.deviceId === device.deviceId)) {
foundDevices.push(device);
console.info(`发现了新的设备:${JSON.stringify(device)}`);
// 如果找到了目标设备则立即终止扫描过程
clearInterval(timerId);
stopScanning();
connectToDevice(device.deviceId);
}
});
}
});
}, 500); // 每隔半秒检查一次是否有新增加的设备
}
});
}
```
#### 建立连接及准备接收数据
完成上述步骤后便能着手于构建实际链接了——即利用 `uni.createBLEConnection()` 函数指定要关联的目标 ID 来达成此目的。与此同时还需要注册一个处理函数用来响应特性值变化的通知机制,这正是捕获远端传输来的有效载荷的关键所在[^2]:
```javascript
async function connectToDevice(targetDeviceId){
try {
await new Promise(resolve => setTimeout(resolve, 100)); // 短暂延时等待上一步骤结束
let connectionResult = await uni.createBLEConnection({deviceId: targetDeviceId});
if(connectionResult.statusCode !== 0){
throw Error("无法建立连接");
}
console.log(`${targetDeviceId} 已经建立了连接`);
// 获取所有服务和服务对应的特征值
let services = await uni.getBLEDeviceServices({deviceId: targetDeviceId});
for(let svc of services.services){
let characteristics = await uni.getBLEDeviceCharacteristics({
deviceId: targetDeviceId,
serviceId:svc.uuid
});
for(let chara of characteristics.characteristics){
if(chara.properties.notify || chara.properties.indicate){
// 启动通知/指示功能以便后续可以接收到更新后的属性值
await uni.notifyBLECharacteristicValueChange({
state:true,
deviceId:targetDeviceId,
serviceId:svc.uuid,
characteristicId:chara.uuid
});
// 添加监听器捕捉到来自该特性的最新数值变动
uni.onBLECharacteristicValueChange(function(eventData){
if(eventData.deviceId===targetDeviceId && eventData.serviceId===svc.uuid && eventData.characteristicId===chara.uuid){
console.debug(`Received data from ${eventData.deviceId}:`, Buffer.from(eventData.value));
// 处理接收到的数据...
}
});
break; // 只启用第一个具有 notify 属性的服务即可满足大多数应用场景需求
}
}
break;
}
} catch(e){
console.warn(`Error during connecting to or configuring notifications on ${targetDeviceId}`, e.message);
}
}
```
通过以上介绍的方式可以在 UniApp 平台上顺利地搭建起一套完整的蓝牙通信框架,不仅涵盖了基本的硬件交互逻辑而且还包含了具体实践当中不可或缺的各种细节考量。
阅读全文
相关推荐

















