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
相关产品推荐
相关产品推荐

