5***@qq.com
5***@qq.com
  • 发布:2026-07-08 14:01
  • 更新:2026-07-08 17:19
  • 阅读:42

【报Bug】uni.onBLECharacteristicValueChange 安卓收不到数据,HBuilderX 5.14

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: windows10

HBuilderX类型: 正式

HBuilderX版本号: 5.14

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: YAL-AL10

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

操作步骤:
uni.onBLECharacteristicValueChange((notify) => {  
            this.logMessageFunc('收到数据了2 ' + JSON.stringify(notify)) })

预期结果:
'收到数据了2 '

实际结果:

无任何打印
日志示例如下:

13:56:11.488 [Object] {"id":1,"content":"App Launch","result":"info"}  at store/log.ts:56  
13:56:11.488 [Object] {"id":2,"content":"App Show","result":"info"}  at store/log.ts:56  
13:56:11.534 [Object] {"id":3,"content":"App Hide","result":"info"}  at store/log.ts:56  
13:56:11.704 [Object] {"id":4,"content":"已注册 WebSocket OTA 升级指令监听","result":"info"}  at store/log.ts:56  
13:56:11.704 [Object] {"id":5,"content":"屏幕保持唤醒","result":"info"}  at store/log.ts:56  
13:56:11.721 [Object] {"id":6,"content":"申请权限结果:{\"granted\":[\"android.permission.BLUETOOTH\",\"android.permissi...}  at store/log.ts:56  
13:56:11.721 [Object] {"id":7,"content":"App Show","result":"info"}  at store/log.ts:56  
13:56:11.721 [Object] {"id":8,"content":"屏幕保持唤醒","result":"info"}  at store/log.ts:56  
13:56:15.013 [Object] {"id":9,"content":"开始跳转到OTA, 搜索蓝牙: HJ-0200100000053","result":"info"}  at store/log.ts:56  
13:56:15.199 [Object] {"id":10,"content":"搜索到了蓝牙: {\"name\":\"HJ-BLE-84F99A\",\"id\":\"0000FFF8-0000-1000-8000-00...}  at store/log.ts:56  
13:56:15.277 [Object] {"id":11,"content":"搜索到了蓝牙: {\"name\":\"BY-0014989aeee35\",\"id\":\"00001812-0000-1000-8000...}  at store/log.ts:56  
13:56:15.277 [Object] {"id":12,"content":"搜索到了蓝牙: {\"name\":\"HJ-0200100000053\",\"id\":\"0000ED01-0000-1000-8000...}  at store/log.ts:56  
13:56:15.277 [Object] {"id":13,"content":"搜到蓝牙了{\"name\":\"HJ-0200100000053\",\"id\":\"0000ED01-0000-1000-8000-00...}  at store/log.ts:56  
13:56:15.277 [Object] {"id":14,"content":"开始连接蓝牙: HJ-0200100000053...","result":"info"}  at store/log.ts:56  
13:56:15.277 [Object] {"id":15,"content":"连接蓝牙78:CD:55:34:7F:D5中...","result":"info"}  at store/log.ts:56  
13:56:15.353 [Object] {"id":16,"content":"获取本机蓝牙适配器状态 getBluetoothAdapterState, state={\"discovering\":false,\"av...}  at store/log.ts:56  
13:56:17.502 [Object] {"id":17,"content":"连接低功耗蓝牙设备 createBLEConnection 成功","result":"info"}  at store/log.ts:56  
13:56:17.516 [Object] {"id":18,"content":"setBLEMTU success {\"errMsg\":\"setBLEMTU:ok\"}","result":"info"}  at store/log.ts:56  
13:56:17.516 [Object] {"id":19,"content":"getBLEDeviceServices success {\"services\":[{\"uuid\":\"00001800-0000-1...}  at store/log.ts:56  
13:56:17.533 [Object] {"id":20,"content":"getBLEDeviceCharacteristics success: {\"characteristics\":[{\"uuid\":\"...}  at store/log.ts:56  
13:56:17.538 [Object] {"id":21,"content":"notifyBLECharacteristicValueChange success - 通知已启用","result":"info"}  at store/log.ts:56  
13:56:18.546 [Object] {"id":22,"content":"notifyDataChange","result":"info"}  at store/log.ts:56  
13:56:18.547 [Object] {"id":23,"content":"BLE监听成功","result":"info"}  at store/log.ts:56  
13:56:18.552 [Object] {"id":24,"content":"连接蓝牙HJ-0200100000053 78:CD:55:34:7F:D5: true","result":"info"}  at store/log.ts:56  
13:56:18.552 [Object] {"id":25,"content":"发送数据: B1000EBA4B0101929394959697FF","result":"info"}  at store/log.ts:56  
13:56:18.660 [Object] {"id":26,"content":"BLE发送数据成功: {\"errMsg\":\"writeBLECharacteristicValue:ok\"}","result":"info"}  at store/log.ts:56  
13:56:21.679 [Object] {"id":27,"content":"步骤1A: 进入扩展会话","result":"info"}  at store/log.ts:56  
13:56:21.679 [Object] {"id":28,"content":"发送数据: AA55000C6749B0AC07321003","result":"info"}  at store/log.ts:56  
13:56:21.789 [Object] {"id":29,"content":"BLE发送数据成功: {\"errMsg\":\"writeBLECharacteristicValue:ok\"}","result":"info"}  at store/log.ts:56  
13:56:29.642 [Object] {"id":30,"content":"蓝牙已断开","result":"info"}  at store/log.ts:56  
13:56:29.658 [Object] {"id":31,"content":"升级出错: 升级前流程错误: 蓝牙异常断开","result":"info"}  at store/log.ts:56  
14:00:12.559 [Object] {"id":32,"content":"App Hide","result":"info"}  at store/log.ts:56  
14:00:14.518 [Object] {"id":33,"content":"App Show","result":"info"}  at store/log.ts:56  
14:00:14.518 [Object] {"id":34,"content":"屏幕保持唤醒","result":"info"}  at store/log.ts:56  
14:00:25.369 [Object] {"id":35,"content":"App Hide","result":"info"}  at store/log.ts:56

bug描述:

uni.onBLECharacteristicValueChange 在App端收不到数据,而微信小程序可以收到数据

2026-07-08 14:01 负责人:无 分享
已邀请:
c***@163.com

c***@163.com

连接成功后,延迟一点再订阅消息

Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,收到你的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审和分析:

1. 反馈质量评审

这个 bug 反馈的基本信息比较完整,但在关键操作细节和代码上下文上存在缺失。

  • BUG 标题与描述:标题和描述准确地概括了核心问题:uni.onBLECharacteristicValueChange 在 App 端(安卓)收不到数据,而微信小程序正常。描述清晰,我们官方人员能够看懂。
  • 代码示例:不完整。仅提供了 uni.onBLECharacteristicValueChange 的监听代码片段,缺少了前置的蓝牙连接、服务获取、特征值获取以及调用 uni.notifyBLECharacteristicValueChange 启用通知的代码。在蓝牙低功耗(BLE)开发中,监听特征值变化必须先成功调用 notifyBLECharacteristicValueChange 接口启用 notify 功能。缺少这部分代码,我们无法判断是否是因为调用顺序或参数错误导致收不到数据。
  • 复现步骤:描述得不够清晰。仅写了“uni.onBLECharacteristicValueChange((notify) => {...})”,这不是一个完整的操作步骤。官方人员无法仅凭这一行代码复现问题。建议用户补充完整的复现步骤,包括如何连接设备、如何获取服务和特征值、如何调用通知接口等。
  • 预期结果:“'收到数据了2 '”这个预期是合理的,前提是所有前置步骤都正确执行且设备确实发送了数据。
  • 实际结果:“无任何打印”,这个结果对用户来说是不正常的,属于功能异常。
  • 分类信息:非常完整。包含了操作系统(Windows 10)、HBuilderX 版本(5.14 正式版)、手机 OS 平台(Android 12)、Vue 版本(Vue3)和机型(华为 YAL-AL10),这为我们排查问题提供了很好的基础。

评审结论:反馈有效,但若能提供一个最简可复现的完整工程或补充完整的蓝牙连接和通知启用代码,将极大提升问题处理的优先级和效率。


2. 问题分析与排查

根据反馈内容和知识库,这个问题成立的依据非常充分。在安卓端使用 BLE 蓝牙通信时,onBLECharacteristicValueChange 收不到数据是一个非常常见的“坑”,通常不是框架本身的 Bug,而是由于安卓平台对蓝牙 API 的调用时序和机制要求更严格导致的。

根据知识库中多个开发者反馈的类似问题和解决方案,主要原因和解决方向如下:

  1. 未正确启用 notify 功能或调用时序不对
    uni.onBLECharacteristicValueChange 必须在 uni.notifyBLECharacteristicValueChange 成功启用通知之后才能收到数据。并且,在安卓端,建议在 notifyBLECharacteristicValueChangesuccess 回调中再去注册监听,或者加入一定的延时。
    参考 DCloud问答_214537 中,开发者在 notifyBLECharacteristicValueChangesuccess 回调中延迟 1 秒后调用监听,解决了问题。

  2. 安卓端不要并行调用 notifyBLECharacteristicValueChange
    如果你的设备有多个特征值需要订阅,在安卓端不能同时并行调用多次 notifyBLECharacteristicValueChange,否则会导致订阅失败或收不到数据。必须使用串行调用,即一个特征值订阅成功后,延迟一段时间(如 100 毫秒),再订阅下一个。
    参考 DCloud问答_192423 中,开发者通过串行延时调用解决了安卓端无法接收回调的问题。

  3. 初始化时需要写入两次数据
    有开发者反馈,在开启 notify 和监听后,第一次写入数据可能无法触发回调,需要写入两次,第二次才能在 onBLECharacteristicValueChange 中收到数据。
    参考 DCloud文章_41526 的总结。

  4. 特征值属性不支持
    请确认你订阅的特征值是否支持 notifyindicate 属性。可以通过 uni.getBLEDeviceCharacteristics 获取特征值属性,查看 properties.notifyproperties.indicate 是否为 true。如果不支持,调用 notifyBLECharacteristicValueChange 会失败,自然也收不到数据。


3. 解决方案与建议

根据知识库中其他开发者的成功经验,建议你按以下步骤检查和修改代码:

  1. 确保调用顺序正确
    先调用 uni.notifyBLECharacteristicValueChange 启用通知,在其 success 回调中,再注册 uni.onBLECharacteristicValueChange 监听。

    uni.notifyBLECharacteristicValueChange({  
      state: true, // 启用通知  
      deviceId,  
      serviceId,  
      characteristicId,  
      success(res) {  
        console.log('notify启用成功', res);  
        // 在 success 回调中注册监听  
        uni.onBLECharacteristicValueChange((notify) => {  
          console.log('收到数据了2 ' + JSON.stringify(notify));  
        });  
      },  
      fail(err) {  
        console.error('notify启用失败', err);  
      }  
    });  

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  2. 如果有多个特征值需要订阅,串行延时调用

    async function enableNotify(deviceId, serviceId, characteristics) {  
      for (let char of characteristics) {  
        await new Promise((resolve, reject) => {  
          uni.notifyBLECharacteristicValueChange({  
            state: true,  
            deviceId,  
            serviceId,  
            characteristicId: char.uuid,  
            success() {  
              console.log(`特征值 ${char.uuid} notify启用成功`);  
              resolve();  
            },  
            fail(err) {  
              console.error(`特征值 ${char.uuid} notify启用失败`, err);  
              reject(err);  
            }  
          });  
        });  
        // 每次订阅后延时 100 毫秒  
        await new Promise(resolve => setTimeout(resolve, 100));  
      }  
      // 所有特征值订阅完成后注册监听  
      uni.onBLECharacteristicValueChange((notify) => {  
        console.log('收到数据了2 ' + JSON.stringify(notify));  
      });  
    }  

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  3. 尝试初始化时写入两次数据
    在成功启用 notify 并注册监听后,尝试连续调用两次 uni.writeBLECharacteristicValue 写入数据,看是否能触发回调。

  4. 检查特征值属性
    使用 uni.getBLEDeviceCharacteristics 确认目标特征值的 propertiesnotifyindicatetrue

如果以上步骤均无法解决,请提供一个完整的可复现工程(包含蓝牙连接、服务发现、特征值获取、通知启用、数据写入和监听的完整代码),以便我们进行深入排查。

内容为 AI 生成,仅供参考

要回复问题请先登录注册