Android下无用蓝牙广播问题求助:Cordova蓝牙插件扫描异常
关于BLE设备扫描名称和广播数据的问题解答
我来帮你拆解这两个困扰你的问题:
问题1:设备名称为空或出现乱码的原因
其实不是所有蓝牙设备都会在广播里提供友好的可识别名称,这里分两种情况说:
- 名称为空:BLE广播包的最大长度只有31字节,很多设备(尤其是低功耗传感器、IoT设备)会优先把有限的空间用来传输业务数据(比如温湿度、设备状态)或者厂商自定义信息,而选择不在广播中携带设备名称。这类设备的名称通常需要你连接后通过GATT服务的「设备名称特征值」来获取,这是完全符合BLE规范的。
- 出现
\u0010这类乱码:\u0010是ASCII中的控制字符(数据链路转义符),属于不可打印字符。可能的原因包括:- 设备固件配置错误,把名称设置成了这类无效字符;
- 设备广播的名称使用了非UTF-8编码(比如GBK),而cordova-plugin-bluetoothle默认按UTF-8解析,导致转码错误;
- 广播包中的名称字段被截断或传输损坏,插件解析后输出了无效的转义序列。
问题2:广播数据的正确解析方式
BLE广播数据绝对是有用的,只是你没按规范来解析!它是严格遵循BLE AD(广告数据)结构的二进制数据,步骤如下:
- 解码base64到字节数组:先把你拿到的base64字符串转成二进制字节数组,不要直接转成文本(大部分字段不是文本格式)。
- 拆分AD单元:每个广播包由多个AD单元组成,每个单元的格式是:
[1字节:单元长度] + [1字节:AD类型] + [(长度-1)字节:单元数据] - 根据AD类型解析数据:常见的AD类型对应的含义:
0x08:短设备名称;0x09:完整设备名称;0xFF:厂商自定义数据(这是大部分设备用来传输核心业务信息的字段,比如设备ID、状态码等,需要结合对应厂商的协议文档解析);0x0A:发射功率等级;0x16:服务数据;
- 针对你的示例:比如第一个设备的广播数据解码后,你可以遍历字节数组,逐个拆分AD单元,就能找到对应的有效信息。比如如果有
0xFF类型的单元,里面就是厂商自定义的二进制数据,需要按照设备的协议来解码(比如某几位代表设备类型,某几位代表电量等)。
如果用cordova-plugin-bluetoothle的话,你可以自己写一个简单的解析函数,或者看看插件有没有内置的解析工具——不过通常这类插件只会返回原始的广播数据,需要你自己按BLE规范处理。
内容的提问来源于stack exchange,提问作者ishahak
相关产品推荐
相关产品推荐

