uni-app 捕捉不到ManufacturerData 数据段总是为空
uni-app 捕捉不到ManufacturerData 数据段总是为空
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:3.1.7
手机系统:Android
手机系统版本号:Android 10
手机厂商:小米
手机机型:mi8
页面类型:vue
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```javascript
uni.openBluetoothAdapter({
success(res) {
uni.startBluetoothDevicesDiscovery({
success(res) {
uni.onBluetoothDeviceFound(function(res){
console.log('device:' + JSON.stringify(res.devices))
})
},
fail(res) {
console.log("faile res=", res)
}
})
}
})
操作步骤:
使用uni.startBluetoothDevicesDiscovery搜索蓝牙设备,在uni.onBluetoothDeviceFound里打印出蓝牙设备信息,设备信息里ManufacturerData 数据段总是为空。
预期结果:
根据onBluetoothDeviceFound API介绍,期待设备信息包含ManufacturerData 信息。 devices 的结构 advertisData ArrayBuffer 当前蓝牙设备的广播数据段中的 ManufacturerData 数据段。
实际结果:
如附件中的两个图,wireshark抓到的报文里有manufacturer字段,hxbuilder log却显示advertisData字段为空。
bug描述:
问题:
-
使用uni.startBluetoothDevicesDiscovery搜索蓝牙设备,在uni.onBluetoothDeviceFound里打印出蓝牙设备信息,设备信息里ManufacturerData 数据段总是为空。 uni.onBluetoothDeviceFound不能返回ManufacturerData 数据段。
-
设备A,设备B B关闭了蓝牙的notify功能,A主动去read的时候,拿不到B蓝牙返回的数据,原生里面是可以有方法获取到的
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId:characteristicId,
success(res) {
console.log('========设置通知监听成功:' + res.errMsg);
console.log(JSON.stringify(res));
}
更多关于uni-app 捕捉不到ManufacturerData 数据段总是为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html
advertisData 官方文档都写着转换方法了,不转换看不到的。
更多关于uni-app 捕捉不到ManufacturerData 数据段总是为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html
advertisData 是ArrayBuffer,要转换。Android好像能取得到,但ios有时能取到有时没有
这BUG无解吗?
在uni-app中,ManufacturerData
字段为空的问题通常与Android系统权限和uni-app底层实现有关。根据你的开发环境和代码分析:
-
Android系统限制:从Android 6.0开始,系统对蓝牙扫描结果进行了限制,默认不会返回
advertisData
中的制造商数据。需要应用具有ACCESS_FINE_LOCATION
权限,并在代码中动态申请。 -
权限配置:确保在manifest.json中正确配置了蓝牙权限:
{
"permissions": {
"bluetooth": {
"description": "蓝牙权限"
}
}
}
- 代码实现:你的扫描代码基本正确,但建议添加完整的错误处理和权限检查:
uni.authorize({
scope: 'scope.bluetooth',
success() {
uni.openBluetoothAdapter({
success(res) {
uni.startBluetoothDevicesDiscovery({
services: [], // 可指定服务UUID过滤
success(res) {
uni.onBluetoothDeviceFound((res) => {
console.log('device:', res.devices)
})
}
})
}
})
}
})