HarmonyOS 鸿蒙Next中低功耗蓝牙接口没有BEACON_UUID筛选接口

HarmonyOS 鸿蒙Next中低功耗蓝牙接口没有BEACON_UUID筛选接口 在官方看到BEACON_UUID必须得在AGC上申请近场通信权限,注册蓝牙信标设备的操作才可以扫描BEACON_UUID,这个应该是不合理的,因为蓝牙扫描的返回信息里其实是包含BEACON_UUID地址的,但是需要特定的筛选方法,目前没有找到筛选BEACON_UUID的配置参数,不筛选则无法精准获取对应的设备回调,这个有什么解决方法呢?

7 回复

开发者你好,beacon设备扫描过滤器配置可以参考以下:

【解决方案】

let manufactureId = 0x004C; // 16位id
let manufactureData: Uint8Array = new Uint8Array([0xFF, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
  0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF]);
let manufactureDataMask: Uint8Array = new Uint8Array([0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);

let filter1: ble.ScanFilter = {
    manufactureId: manufactureId,
    manufactureData: manufactureData.buffer,
    manufactureDataMask: manufactureDataMask.buffer
};
let filterArry: Array<ble.ScanFilter> = new Array();
filterArry.push(filter1);
let scanOption: ble.ScanOptions = {
    "dutyMode": 2,
    "interval": 0,
    "matchMode": 1
};
try {
    ble.startBLEScan(filterArry, scanOption);
} catch (err) {
    console.error("[bt_js] errCode:" + err.code + ",errMessage:" + err.message);
}

更多关于HarmonyOS 鸿蒙Next中低功耗蓝牙接口没有BEACON_UUID筛选接口的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


若想既不注册设备,又直接调用系统的 “按 UUID 过滤” 接口,截至目前 HarmonyOS NEXT 暂未提供该功能,解决方案是 “注册设备 + 开通近场服务”。

  1. 官方文档中 “需先注册信标方可获取 BEACON_UUID”,注册审核通过后才能通过扫描获取到UUID,扫描结果才能通过近场服务通道推送给对应 App;底层蓝牙栈已能从广播包中解析出 iBeacon 的 UUID(16 字节)、Major、Minor 等字段,只是 HarmonyOS 当前开放的 BLE 扫描接口未将 “按 UUID 过滤” 设为独立参数。
  2. 手动解析广播包:无需申请 AGC 近场权限,也不用注册设备,通过自行解析广播包数据,从中过滤出所需的 UUID

相关文档:【蓝牙信标设备】

当前BLE接口未直接提供BEACON_UUID的筛选参数,但广播数据包中实际包含该信息

// 在扫描回调中手动解析广播数据
onScanResult(scanResult: bluetoothManager.ScanResult) {
  const manufacturerData = scanResult.advertiseData.manufacturerData;
  if (manufacturerData && manufacturerData.length >= 25) {
    // iBeacon格式解析示例
    const uuidBytes = manufacturerData.slice(4, 20);
    const beaconUUID = this.bytesToUUID(uuidBytes);
    
    if (beaconUUID === TARGET_UUID) { // 自行实现UUID匹配逻辑
      // 处理目标设备
    }
  }
}

private bytesToUUID(bytes: number[]): string {
  // 实现字节数组转UUID字符串
}
// 通过制造商数据筛选(需已知BEACON厂商ID)
const filters: bluetoothManager.ScanFilter[] = [{
  manufacturerId: 0x004C, // 示例:苹果iBeacon厂商ID
  manufacturerData: new Uint8Array([...]) // 指定匹配数据段
}];

bluetoothManager.BLE.startBLEScan(filters, {
  interval: 5000,
  dutyMode: bluetoothManager.ScanDuty.SCAN_MODE_LOW_POWER
});

所得的结论

  1. 官方文档里“必须先注册信标才能拿到 BEACON_UUID”并不是指「扫描不到 UUID」,而是指

    • 只有注册后,系统才会把该 UUID 当成“可信信标”,进而把扫描结果通过 近场服务通道(P2P 消息、小艺建议、花瓣地图等)推送给你的 App;
    • 底层蓝牙栈实际已经能在广播包里解析出 iBeacon 的 UUID(16 B)、Major、Minor 等字段,只是 HarmonyOS 当前开放的 BLE 扫描接口没有把“按 UUID 过滤”暴露成独立参数,所以看起来“无法精准回调”。
  2. 因此你完全可以在 不申请 AGC 近场权限、不注册设备 的前提下,自己解析广播包并过滤出想要的 UUID;只是要多做一步「手动解包」。

  3. 如果既想免注册、又想直接调用系统“按 UUID 过滤”接口,目前 HarmonyOS 5 /6公开通道里没有提供,只能走「注册加近场服务」这一条官方捷径

目前就是手动赛选的方法,

HarmonyOS Next的低功耗蓝牙接口目前未提供BEACON_UUID筛选功能。开发者需通过扫描所有广播包,在回调中手动解析广播数据,检查Service UUID或Manufacturer Data字段来实现Beacon设备过滤。

在HarmonyOS Next中,低功耗蓝牙(BLE)扫描确实提供了基于服务UUID(包括Beacon UUID)的过滤能力,但需要正确配置。

当前BLE扫描接口(特别是ble.StartScan)的scanOptions参数支持通过serviceUuids字段指定要筛选的UUID列表。如果你需要扫描特定的Beacon设备,可以将目标Beacon的UUID(例如iBeacon的Proximity UUID)添加到该数组中。

示例代码结构如下:

import { ble } from '@kit.ConnectivityKit';

let scanOptions: ble.ScanOptions = {
  serviceUuids: ['你的目标Beacon UUID'], // 在此处填入需要筛选的UUID
  // ... 其他扫描参数
};

ble.startScan(scanOptions, (data: ble.ScanResult) => {
  // 处理扫描结果,此处回调的设备已通过UUID过滤
});

如果serviceUuids字段无法满足你的特定Beacon协议格式(例如需要处理Manufacturer Specific Data),你可以暂时不设置过滤,在startScan的回调函数中获取完整的广播数据包(scanResult.manufacturerData),然后自行解析其中的Beacon UUID进行逻辑判断。

这种设计允许更灵活地处理各种私有Beacon格式,同时官方接口已覆盖基于标准服务UUID的基础过滤场景。

回到顶部