uni-app 获取蓝牙name都为空(尝试多个设备)
uni-app 获取蓝牙name都为空(尝试多个设备)
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Mac | 14.0 | HBuilderX |
操作步骤:
openBluetoothAdapter startBluetoothDevicesDiscovery getBluetoothDevices 打印返回结果
### 预期结果:
name或者localName有值
实际结果:
name和localName都没有值
### bug描述:
标准基座运行,使用蓝牙设备,获取到的列表name和localName都是空,
{
"deviceId": "67:6F:2C:83:8A:C6",
"name": "",
"RSSI": -65,
"localName": "",
"advertisServiceUUIDs": [],
"advertisData": {}
},
在使用 uni-app 开发蓝牙功能时,如果获取到的蓝牙设备名称(name
)为空,可能是由于以下原因导致的。以下是一些可能的原因和解决方案:
1. 蓝牙设备本身未广播名称
有些蓝牙设备在广播时可能不会包含设备名称(name
),或者设备名称可能被设置为空。你可以尝试使用其他设备进行测试,或者检查蓝牙设备的广播数据。
2. 获取设备信息的时机问题
在 uni-app 中,uni.getBluetoothDevices
或 uni.onBluetoothDeviceFound
获取到的设备信息可能不完整。你可以尝试在 onBluetoothDeviceFound
回调中获取设备名称,或者在 uni.getBluetoothDevices
之后再次检查设备信息。
uni.onBluetoothDeviceFound(function(devices) {
devices.forEach(device => {
console.log('Found device:', device.name, device.deviceId);
});
});
uni.startBluetoothDevicesDiscovery({
success(res) {
console.log('Start discovery success:', res);
}
});
3. 权限问题
确保你的应用已经获取了蓝牙相关的权限。在 Android 上,你需要在 manifest.json
中添加以下权限:
{
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于蓝牙设备扫描"
}
}
}
在 iOS 上,你需要在 Info.plist
中添加 NSBluetoothAlwaysUsageDescription
和 NSBluetoothPeripheralUsageDescription
的描述。
4. 平台差异
不同平台(iOS 和 Android)对蓝牙设备的处理方式可能不同。你可以尝试在不同的平台上进行测试,看看是否在某个平台上可以正常获取到设备名称。
5. 设备未正确连接
如果你在设备未连接的情况下尝试获取设备名称,可能会导致获取到的名称为空。你可以尝试先连接设备,然后再获取设备信息。
uni.createBLEConnection({
deviceId: deviceId,
success(res) {
console.log('Connection success:', res);
uni.getBLEDeviceServices({
deviceId: deviceId,
success(res) {
console.log('Get services success:', res);
}
});
}
});
6. 使用 localName
替代 name
有些蓝牙设备可能使用 localName
而不是 name
来广播设备名称。你可以尝试获取 localName
来替代 name
。
uni.onBluetoothDeviceFound(function(devices) {
devices.forEach(device => {
console.log('Found device:', device.localName, device.deviceId);
});
});
7. 检查蓝牙设备的广播数据
你可以使用一些蓝牙调试工具(如 nRF Connect)来检查蓝牙设备的广播数据,看看是否包含设备名称。
8. 更新 uni-app 版本
确保你使用的是最新版本的 uni-app,因为旧版本可能存在一些蓝牙相关的 bug。
9. 检查设备是否支持
确保你使用的设备支持蓝牙功能,并且蓝牙功能已经开启。
10. 调试和日志
在开发过程中,建议多使用 console.log
来输出调试信息,帮助你定位问题。
uni.onBluetoothDeviceFound(function(devices) {
console.log('Found devices:', devices);
devices.forEach(device => {
console.log('Device info:', device);
});
});