h***@aliyun.com
h***@aliyun.com
  • 发布:2026-05-14 17:36
  • 更新:2026-05-14 17:37
  • 阅读:16

在安卓手机中writeBLECharacteristicValue写入数据时,设备端无任何数据接收。

分类:uni-app

在安卓手机中writeBLECharacteristicValue写入数据时,设备端无任何数据接收。****

  1. 苹果手机nrf connect的软件中发送数据,一切正常,设备端可以接到写入的数据;
  2. 安卓手机发送时,代码走进了success。但是设备端没有任何反应;
  3. writeType切换过“write”和“writeWithoutResponse”以及不写writeType;
  4. 这个服务支持read、write和writeWithoutResponse;
  5. 同一个服务,安卓和苹果执行read都没问题;

*在uniapp的页面中代码如下:**

async function writeTimeInterval(val) {  
  const buffer = new ArrayBuffer(2);  
  const view = new DataView(buffer);  
  view.setUint16(0, val, true);  

  uni.writeBLECharacteristicValue({  
    deviceId: currentDeviceId,  
    serviceId: tempHistoryServiceId,   
    characteristicId: timeIntervalCharId,  
    value: buffer,  
    writeType: "writeWithoutResponse",  
    success: () => {  
      uni.showToast({ title: "设置成功", icon: "success" });  
    },  
    fail: (err) => {  
      uni.showToast({ title: "写入失败", icon: "none" });  
    }  
  });  
}

执行代码结果,toast了“设置成功”。

2026-05-14 17:36 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

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

根据知识库中的信息,你遇到的问题在安卓平台上是比较典型的场景。代码返回 success 但设备端无响应,结合 iOS 正常、read 操作正常的情况,问题可能出在操作时序和平台差异上。

根本原因分析

官方文档明确指出:安卓平台上,在调用 notifyBLECharacteristicValueChange 成功后立即调用 writeBLECharacteristicValue 接口,在部分机型上会发生 10008 系统错误。
即使你的代码没有触发明确的错误回调,这种平台级的时序冲突也可能导致数据写入看似成功(进入 success 回调)但实际上并未被设备正确接收或处理。这是安卓系统蓝牙协议栈的特性导致的。

解决方案

核心原则是:必须确保 notifyBLECharacteristicValueChangesuccess 回调执行后,再延迟一小段时间(例如 300-500ms),才能安全地进行写入操作。 不要在 createBLEConnection 成功的回调里直接串联写入,必须经过 notify 成功这个中间步骤。

根据知识库中的社区实践,建议按以下流程重构你的写入逻辑:

  1. 建立连接 (createBLEConnection)
  2. 获取服务和特征值 (getBLEDeviceServices / getBLEDeviceCharacteristics)
  3. 启用 Notify (notifyBLECharacteristicValueChange) - 这是关键步骤
  4. 在 Notify 的 success 回调中,使用 setTimeout 延迟后调用写入 (writeBLECharacteristicValue)

代码修改建议

参考知识库中其他开发者的成功经验,你可以将代码结构调整为如下形式:

// 伪代码示例,你需要根据你的实际逻辑调整  
uni.createBLEConnection({  
  deviceId: currentDeviceId,  
  success(connectRes) {  
    // 连接成功后,获取服务与特征值...  
    uni.notifyBLECharacteristicValueChange({  
      deviceId: currentDeviceId,  
      serviceId: tempHistoryServiceId,  
      characteristicId: timeIntervalCharId,  
      state: true,  
      success(notifyRes) {  
        console.log('notify 成功,准备写入数据');  
        // 关键步骤:在 notify 成功后,延迟一段时间再写入  
        setTimeout(() => {  
          // 在这里调用你的 writeTimeInterval 函数  
          writeTimeInterval(yourValue);   
        }, 300); // 延迟 300-500ms,可根据你的设备调整  
      },  
      fail(err) {  
        console.error('notify 失败', err);  
      }  
    });  
  }  
});  

// 你的写入函数保持不变  
async function writeTimeInterval(val) {  
  const buffer = new ArrayBuffer(2);  
  const view = new DataView(buffer);  
  view.setUint16(0, val, true);  

  uni.writeBLECharacteristicValue({  
    deviceId: currentDeviceId,  
    serviceId: tempHistoryServiceId,   
    characteristicId: timeIntervalCharId,  
    value: buffer,  
    writeType: "writeWithoutResponse",  
    success: () => {  
      uni.showToast({ title: "设置成功", icon: "success" });  
    },  
    fail: (err) => {  
      uni.showToast({ title: "写入失败", icon: "none" });  
    }  
  });  
}

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

其他注意事项

  • 连接后获取服务:知识库中有开发者反映,安卓设备连接后不能立即获取服务,可能也需要加入延迟或轮询机制。
  • MTU与分包:官方文档提到,APP 不会限制写入数据包大小,但蓝牙 4.0 单次传输有限制,建议每次写入不超过 20 字节。如果你的数据包较大,需要自行分包发送。
  • 第三方插件:如果以上基于官方 API 的时序调整仍然无法解决问题,可以考虑使用插件市场提供的 BLE 蓝牙插件,它们通常对安卓平台的这些兼容性问题做了更好的封装和异常处理。你可以在插件市场搜索 ble蓝牙 查找相关插件。

这个问题在知识库中有对应的依据,文档链接:uni.writeBLECharacteristicValue 注意事项

内容为 AI 生成,仅供参考

要回复问题请先登录注册