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

Android下无用蓝牙广播问题求助:Cordova蓝牙插件扫描异常

关于BLE设备扫描名称和广播数据的问题解答

我来帮你拆解这两个困扰你的问题:

问题1:设备名称为空或出现乱码的原因

其实不是所有蓝牙设备都会在广播里提供友好的可识别名称,这里分两种情况说:

  • 名称为空:BLE广播包的最大长度只有31字节,很多设备(尤其是低功耗传感器、IoT设备)会优先把有限的空间用来传输业务数据(比如温湿度、设备状态)或者厂商自定义信息,而选择不在广播中携带设备名称。这类设备的名称通常需要你连接后通过GATT服务的「设备名称特征值」来获取,这是完全符合BLE规范的。
  • 出现\u0010这类乱码:\u0010是ASCII中的控制字符(数据链路转义符),属于不可打印字符。可能的原因包括:
    • 设备固件配置错误,把名称设置成了这类无效字符;
    • 设备广播的名称使用了非UTF-8编码(比如GBK),而cordova-plugin-bluetoothle默认按UTF-8解析,导致转码错误;
    • 广播包中的名称字段被截断或传输损坏,插件解析后输出了无效的转义序列。

问题2:广播数据的正确解析方式

BLE广播数据绝对是有用的,只是你没按规范来解析!它是严格遵循BLE AD(广告数据)结构的二进制数据,步骤如下:

  1. 解码base64到字节数组:先把你拿到的base64字符串转成二进制字节数组,不要直接转成文本(大部分字段不是文本格式)。
  2. 拆分AD单元:每个广播包由多个AD单元组成,每个单元的格式是:
    [1字节:单元长度] + [1字节:AD类型] + [(长度-1)字节:单元数据]
    
  3. 根据AD类型解析数据:常见的AD类型对应的含义:
    • 0x08:短设备名称;0x09:完整设备名称;
    • 0xFF:厂商自定义数据(这是大部分设备用来传输核心业务信息的字段,比如设备ID、状态码等,需要结合对应厂商的协议文档解析);
    • 0x0A:发射功率等级;0x16:服务数据;
  4. 针对你的示例:比如第一个设备的广播数据解码后,你可以遍历字节数组,逐个拆分AD单元,就能找到对应的有效信息。比如如果有0xFF类型的单元,里面就是厂商自定义的二进制数据,需要按照设备的协议来解码(比如某几位代表设备类型,某几位代表电量等)。

如果用cordova-plugin-bluetoothle的话,你可以自己写一个简单的解析函数,或者看看插件有没有内置的解析工具——不过通常这类插件只会返回原始的广播数据,需要你自己按BLE规范处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:56