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描述:

问题:

  1. 使用uni.startBluetoothDevicesDiscovery搜索蓝牙设备,在uni.onBluetoothDeviceFound里打印出蓝牙设备信息,设备信息里ManufacturerData 数据段总是为空。 uni.onBluetoothDeviceFound不能返回ManufacturerData 数据段。

  2. 设备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

4 回复

advertisData 官方文档都写着转换方法了,不转换看不到的。

更多关于uni-app 捕捉不到ManufacturerData 数据段总是为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html


advertisData 是ArrayBuffer,要转换。Android好像能取得到,但ios有时能取到有时没有

这BUG无解吗?

在uni-app中,ManufacturerData字段为空的问题通常与Android系统权限和uni-app底层实现有关。根据你的开发环境和代码分析:

  1. Android系统限制:从Android 6.0开始,系统对蓝牙扫描结果进行了限制,默认不会返回advertisData中的制造商数据。需要应用具有ACCESS_FINE_LOCATION权限,并在代码中动态申请。

  2. 权限配置:确保在manifest.json中正确配置了蓝牙权限:

{
    "permissions": {
        "bluetooth": {
            "description": "蓝牙权限"
        }
    }
}
  1. 代码实现:你的扫描代码基本正确,但建议添加完整的错误处理和权限检查:
uni.authorize({
    scope: 'scope.bluetooth',
    success() {
        uni.openBluetoothAdapter({
            success(res) {
                uni.startBluetoothDevicesDiscovery({
                    services: [], // 可指定服务UUID过滤
                    success(res) {
                        uni.onBluetoothDeviceFound((res) => {
                            console.log('device:', res.devices)
                        })
                    }
                })
            }
        })
    }
})
回到顶部