uni-app中uni.onBluetoothDeviceFound捕捉不到ManufacturerData

uni-app中uni.onBluetoothDeviceFound捕捉不到ManufacturerData

开发环境 版本号 项目创建方式
Windows 22H2 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:22H2

HBuilderX类型:正式

HBuilderX版本号:4.07

手机系统:Android

手机系统版本号:Android 14

手机厂商:小米

手机机型:小米14

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

示例代码:

```onLoad() {  
    uni.openBluetoothAdapter({  
        success(res) {  
            console.log('蓝牙开启:' + JSON.stringify(res))  
            uni.startBluetoothDevicesDiscovery({  
                success(res) {  
                    console.log(res)  
                }  
            })  
        }  
    })  
    uni.onBluetoothDeviceFound(function(devices) {  

        console.log(JSON.stringify(devices))  
        console.log(this.ab2hex(devices[0].advertisData))  
    })  
}

操作步骤:

使用代码即可复现

预期结果:

能完全检测到蓝牙的广播数据

实际结果:

蓝牙全部广播数据

bug描述:

使用蓝牙接口无法捕捉到ManufacturerData

{"devices":[{"deviceId":"C0:4E:30:F1:16:72","name":"知无科技","RSSI":-47,"localName":"知无科技","advertisServiceUUIDs":[],"advertisData":{}}]}

但是用其他蓝牙调试工具是可以找到的


更多关于uni-app中uni.onBluetoothDeviceFound捕捉不到ManufacturerData的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

解决了吗铁子

更多关于uni-app中uni.onBluetoothDeviceFound捕捉不到ManufacturerData的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中使用 uni.onBluetoothDeviceFound 监听蓝牙设备时,如果无法捕获到 ManufacturerData,可能是因为以下几个原因:

1. 设备未广播 ManufacturerData

蓝牙设备在广播数据时,并不一定会包含 ManufacturerData。只有当设备在广播数据中包含 ManufacturerData 时,才能在 uni.onBluetoothDeviceFound 回调中获取到该信息。

2. 平台兼容性问题

uni-app 的蓝牙 API 底层依赖于各平台的原生实现(如微信小程序、H5、App等),不同平台对蓝牙广播数据的解析方式可能有所不同,导致 ManufacturerData 在某些平台上无法获取。

3. 数据格式问题

ManufacturerData 是一个字节数组,可能需要按照特定的格式解析。如果解析方式不正确,可能会导致获取失败。

4. 权限问题

在某些平台上,获取蓝牙设备的详细数据可能需要额外的权限。请确保已经正确配置了权限。

解决方法

1. 检查设备广播数据

确保蓝牙设备在广播数据中包含 ManufacturerData。可以使用其他蓝牙调试工具(如 nRF Connect)来检查设备的广播数据。

2. 检查平台兼容性

在不同平台上测试代码,确认是否是平台兼容性问题。如果某些平台无法获取 ManufacturerData,可以尝试使用平台特定的 API 来获取数据。

3. 解析 ManufacturerData

如果能够获取到 ManufacturerData,但无法正确解析,可以尝试以下方式:

uni.onBluetoothDeviceFound(function(devices) {
    devices.forEach(device => {
        if (device.advertisData) {
            // advertisData 是一个 ArrayBuffer,需要转换为字节数组
            const advertisData = new Uint8Array(device.advertisData);
            console.log('ManufacturerData:', advertisData);
        }
    });
});

4. 检查权限

App 端,确保已经获取了蓝牙相关的权限。在 manifest.json 中配置:

{
    "app-plus": {
        "permissions": [
            "android.permission.BLUETOOTH",
            "android.permission.BLUETOOTH_ADMIN",
            "android.permission.ACCESS_FINE_LOCATION"
        ]
    }
}

在微信小程序中,确保已经获取了 scope.bluetooth 权限。

示例代码

uni.startBluetoothDevicesDiscovery({
    success: function(res) {
        console.log('开始发现设备');
        uni.onBluetoothDeviceFound(function(devices) {
            devices.forEach(device => {
                if (device.advertisData) {
                    const advertisData = new Uint8Array(device.advertisData);
                    console.log('设备名称:', device.name);
                    console.log('设备信号强度:', device.rssi);
                    console.log('ManufacturerData:', advertisData);
                }
            });
        });
    },
    fail: function(err) {
        console.log('发现设备失败', err);
    }
});
回到顶部