You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic BLE扫描无法获取设备名称问题咨询

解决Ionic BLE扫描无法获取设备名称的问题

问题分析

你的扫描结果中advertising为空对象,但nRF Connect能正常获取设备名称,说明目标BLE设备确实广播了名称,问题出在@ionic-native/ble模块的扫描数据解析或配置环节。

解决思路

1. 调整BLE模块版本

部分旧版本的@ionic-native/ble对广播数据的解析存在bug,优先尝试更新到最新稳定版:

npm install @ionic-native/ble@latest

若最新版仍有问题,可降级到v5.x的稳定版本(如v5.36.0)测试。

2. 用scanRaw()获取原始广播数据并手动解析

scan()方法可能未正确解析广播数据包,改用scanRaw()拿到原始字节数组后自行解析设备名称:

startScan() {
  this.scanList = [];
  this.loadingService.showLoading();

  const scanTime = 10;
  const subscription = this.ionicBle.scanRaw([], scanTime).subscribe((rawDevice) => {
    const deviceName = this.parseDeviceName(rawDevice.advertising);
    const parsedDevice = {
      id: rawDevice.id,
      name: deviceName || '未知设备',
      rssi: rawDevice.rssi,
      advertising: rawDevice.advertising
    };
    this.onDeviceDiscovered(parsedDevice);
  });

  setTimeout(() => {
    this.loadingService.hideLoading();
    subscription.unsubscribe();
  }, scanTime * 1000);
}

// 手动解析广播数据中的设备名称
private parseDeviceName(advertising: Uint8Array): string | null {
  let index = 0;
  while (index < advertising.length) {
    const fieldLength = advertising[index];
    if (fieldLength === 0) break;
    
    const adType = advertising[index + 1];
    // 0x08 = 短设备名称, 0x09 = 完整设备名称
    if (adType === 0x08 || adType === 0x09) {
      const nameBytes = advertising.slice(index + 2, index + 1 + fieldLength);
      return new TextDecoder().decode(nameBytes);
    }
    index += fieldLength + 1;
  }
  return null;
}

3. 完善平台权限配置

Android 12+对BLE权限有严格要求,确保AndroidManifest.xml中配置完整权限:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />

同时在APP运行时动态请求BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限。

4. 连接设备后获取名称

如果扫描阶段无法获取名称,可尝试扫描到设备后主动连接,再通过deviceName()方法获取:

onDeviceDiscovered(deviceScanned) {
  this.ionicBle.connect(deviceScanned.id).subscribe(
    () => {
      this.ionicBle.deviceName(deviceScanned.id).then(name => {
        deviceScanned.name = name;
        this.ngZone.run(() => {
          this.scanList.push(deviceScanned);
        });
        this.ionicBle.disconnect(deviceScanned.id);
      });
    },
    (error) => {
      console.error('连接失败:', error);
    }
  );
}

5. 开启扫描响应数据获取

部分设备的名称放在扫描响应包而非广播包中,可尝试在scan方法中添加参数开启扫描响应获取:

this.ionicBle.scan([], scanTime, { includeScanResponse: true }).subscribe(...);

内容的提问来源于stack exchange,提问作者sebba23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:30:53