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

使用flutter_reactive_ble扫描BLE信标时,如何获取UUID及唯一识别设备?

解析iBeacon UUID及替代识别方案

你看到的manufacturerData是iBeacon的标准广播帧数据,前两个字节76, 0对应苹果厂商ID(0x004C),说明这是标准iBeacon格式,完全可以从中解析出UUID、majorID和minorID。

一、解析UUID的具体方法

iBeacon的厂商数据结构是固定的:

  • 前2字节:厂商ID(苹果为0x004C,对应数组中的[76,0])
  • 第3字节:Beacon类型(固定为0x02)
  • 第4字节:后续数据长度(固定为0x15,对应数组中的21)
  • 第5-20字节:16字节的UUID原始数据
  • 第21-22字节:majorID(大端字节序)
  • 第23-24字节:minorID(大端字节序)
  • 第25字节:发射功率值

针对你提供的manufacturerData,可以用以下Dart代码解析出目标格式的UUID:

// 从DiscoveredDevice的manufacturerData中提取iBeacon信息
void parseIBeaconData(List<int> manufacturerData) {
  // 先验证是否为标准iBeacon帧
  if (manufacturerData.length >= 25 && 
      manufacturerData[0] == 76 && manufacturerData[1] == 0 &&
      manufacturerData[2] == 2 && manufacturerData[3] == 21) {
    
    // 提取UUID对应的16字节数据
    final uuidBytes = manufacturerData.sublist(4, 20);
    // 转成十六进制字符串并添加分隔符
    final uuidHex = uuidBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
    final formattedUuid = '${uuidHex.substring(0,8)}-${uuidHex.substring(8,12)}-${uuidHex.substring(12,16)}-${uuidHex.substring(16,20)}-${uuidHex.substring(20,32)}';
    
    // 顺便解析major和minor(可选)
    final major = (manufacturerData[20] << 8) | manufacturerData[21];
    final minor = (manufacturerData[22] << 8) | manufacturerData[23];
    
    print('格式化UUID: $formattedUuid');
    print('MajorID: $major');
    print('MinorID: $minor');
  } else {
    print('当前数据不是标准iBeacon帧');
  }
}

运行这段代码后,就能得到你需要的类似0546b93b-f113-438d-8bab-b9e766d01177的UUID格式,和你在Beacon Simulator中设置的值一致。

二、更可靠的设备识别方案

蓝牙地址(id字段)在Android 10及以上系统会随机轮换,不能作为稳定的唯一标识。最可靠的方式是使用iBeacon的UUID+majorID+minorID组合:

  • UUID:区分不同的信标分组
  • majorID:区分组内的不同区域或设备类型
  • minorID:区分同一类型下的单个设备
    这三个值都是你在Beacon Simulator中手动设置的固定值,不会随蓝牙地址变化,完全可以作为设备的唯一识别标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:25:28