uniapp 扫描蓝牙时无法获取广播里的 advertisdata 数据怎么办
在uniapp开发中,使用uni.startBluetoothDevicesDiscovery扫描蓝牙设备时,发现无法获取设备的advertisdata广播数据,只能获取到name等基础信息。请问该如何正确获取完整的广播数据包?部分安卓设备可以获取到,但iOS和其他安卓机型获取不到,是兼容性问题还是代码写法有误?需要特定API或配置吗?
2 回复
检查下是否已获取设备所有服务特征值,可能需要先连接设备再读取广播数据。另外确认下系统权限和蓝牙适配器状态,部分机型需要特殊处理。
在 UniApp 中,扫描蓝牙设备时无法直接获取 advertisData 数据,是因为 UniApp 的蓝牙 API 对部分平台(尤其是 iOS)的限制。以下是解决方案和步骤:
1. 检查平台差异
- Android:部分设备可能返回
advertisData,但数据格式为 16 进制字符串,需手动解析。 - iOS:系统限制,无法直接获取
advertisData,只能通过服务 UUID 过滤设备。
2. 使用 UniApp 蓝牙 API 的正确方式
确保调用 onBluetoothDeviceFound 监听设备发现,并检查返回数据:
uni.onBluetoothDeviceFound((devices) => {
console.log('发现设备:', devices);
// devices 数组中的 device 对象可能包含 advertisData(Android)
devices.forEach(device => {
if (device.advertisData) {
// 处理 advertisData(16 进制字符串)
console.log('广播数据:', device.advertisData);
}
});
});
3. 处理 advertisData(仅 Android)
如果 advertisData 存在,需解析 16 进制字符串:
function parseAdvertisData(hexString) {
let bytes = [];
for (let i = 0; i < hexString.length; i += 2) {
bytes.push(parseInt(hexString.substr(i, 2), 16));
}
// 根据蓝牙协议解析 bytes(例如:厂商数据在特定位置)
return bytes;
}
4. 替代方案:连接后读取服务数据
若广播数据无法获取,可尝试连接设备后读取其服务特征值:
- 使用
createBLEConnection连接设备。 - 调用
getBLEDeviceServices和getBLEDeviceCharacteristics获取服务与特征。 - 通过
readBLECharacteristicValue读取数据。
5. 注意事项
- iOS 限制:无法绕过,需依赖设备广播的服务 UUID 进行过滤。
- 兼容性:测试不同设备和系统版本,优先使用标准服务 UUID。
总结
优先检查平台并处理 Android 的 advertisData,iOS 需通过服务数据替代。若问题持续,确认设备广播数据是否符合标准协议。

