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

Flutter Blue Plus中BLE扫描数据解析:manufacturerData含义咨询

解析BLE设备的manufacturerData

结构拆解

你给出的manufacturerData是{89: [39, 66, 1, 16, 0, 0, 0, 0, 86, 100, 200, 20, 235, 119, 180, 100, 76, 229, 242, 217, 251, 227, 123, 138]},拆解来看:

  • 89是十进制的厂商ID,转十六进制为0x59,对应蓝牙SIG分配给Google的厂商代码,但不少小厂商会直接复用这类ID,不一定代表设备就是Google系的
  • 后面的数字数组是厂商自定义的二进制字节流,具体含义完全由设备制造商说了算,没有通用标准,必须参考设备的通信协议文档才能准确解读

是否是UTF8编码?

肯定不是。试转前几个字节就能看出来:39对应单引号',66对应字母B,但后面的1、16都是不可见的控制字符,完全不是连续可读的UTF8文本。厂商数据一般用二进制格式存储整数、状态位、自定义结构体这类信息,不会用UTF8传输设备核心信息。

有没有设备ID或序列号?

大概率有,但得结合设备情况验证:

  • 比如数组里[86,100,200,20,235,119,180,100]这8个字节,很可能是64位的设备UUID或序列号;后面[76,229,242,217,251,227,123,138]也可能是另一组标识数据
  • 验证方法:
    • 扫描同型号的其他设备,对比厂商数据的差异部分,差异大的字段基本就是唯一标识
    • 连接设备后,读取GATT服务里的设备信息特征(标准UUID是00002a25-0000-1000-8000-00805f9b34fb,对应序列号),直接获取官方提供的标识
    • 最靠谱的是找设备厂商索要通信协议文档,这是唯一能100%准确解读的方式

Flutter里的解析工具

你可以用Dart自带的库来处理字节流,示例代码:

import 'dart:typed_data';

void parseManufacturerData() {
  Uint8List data = Uint8List.fromList([39, 66, 1, 16, 0, 0, 0, 0, 86, 100, 200, 20, 235, 119, 180, 100, 76, 229, 242, 217, 251, 227, 123, 138]);
  
  // 解析前4字节为32位整数(可能是协议头或版本)
  int header = ByteData.sublistView(data, 0, 4).getUint32(0, Endian.little);
  print('协议头: $header');
  
  // 提取第8到16字节,转十六进制字符串(可能是序列号)
  Uint8List possibleSerial = data.sublist(8, 16);
  String serialHex = possibleSerial.map((b) => b.toRadixString(16).padLeft(2, '0')).join(':');
  print('疑似序列号(十六进制): $serialHex');
}

内容的提问来源于stack exchange,提问作者Yolo-cell-hash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:52:48