uni-app 安卓APP低功耗蓝牙写入数据经常失败 报10007错误

发布于 1周前 作者 yibo5220 来自 Uni-App

产品分类

uniapp/App

开发环境信息

详情
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 10
HBuilderX类型 正式
HBuilderX版本号 3.99
手机系统 Android
手机系统版本号 Android 13
手机厂商 OPPO
手机机型 oppo reno 7
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码

setTimeout(() => {  
  console.log(that.characteristics)  
  console.log(that.connectedDeviceId)  
  console.log(that.services[getApp().globalData.services_code].uuid)  
  console.log(that.characteristics[getApp().globalData.Tcharacter_code].uuid)  
  uni.writeBLECharacteristicValue({            
    deviceId: that.connectedDeviceId,  
    serviceId: that.services[getApp().globalData.services_code].uuid,  
    characteristicId: that.characteristics[getApp().globalData.Tcharacter_code].uuid,  
    value: buffer,  
    success: function (res) {  
      setTimeout(() => {  
        console.log(res)  
        console.log('助手发送成功home信息')  
      }, 10)  
    },  
    fail: function (res) {  
      console.log(res)  
      console.log(that.connectedDeviceId)  
      console.log(that.services[getApp().globalData.services_code].uuid)  
      console.log(that.characteristics[getApp().globalData.Tcharacter_code].uuid)  
      console.log('助手发送失败home信息')  
    }  
  })  
}, 1000)

操作步骤

连接蓝牙后,写入数据时有时报错10007有时正常。

预期结果

{"errMsg":"writeBLECharacteristicValue:ok"}

实际结果

{"errMsg":"writeBLECharacteristicValue:fail property not support","errCode":10007}

bug描述

使用uniapp开发低功耗蓝牙时,小程序端一切正常,但安卓APP端和安卓APP基座经常会写入数据失败提示10007错误:

{    
  "errMsg": "writeBLECharacteristicValue:fail property not support",    
  "errCode": 10007    
}

但此时读到的特征值是有write权限的,失败一段时间后会突然又可以正常收发数据。基座端如果不断开手机连接会一直可以成功发送数据,APP端有时可以有时候不行。


8 回复

你好,这个问题解决了吗


并行调用多次会存在写失败的可能性。 会不会是因为你放在异步中,然后在重复调用。

请问解决了吗?我也有出现这个问题

写入失败时,在失败的回调里面,尝试用失败的这次的数据再写一次。

回复 不如摸鱼去: 写数据太慢了 写完全部数据得10分钟

回复 1***@qq.com: 用经典蓝牙

搜了半天,也没找到解决办法,加延迟,失败重写都不行啊

针对你提到的uni-app在安卓平台上使用低功耗蓝牙(BLE)写入数据时遇到的10007错误问题,这通常指示了一个通用的蓝牙操作失败,可能由多种原因引起,如设备连接状态不稳定、服务或特征值未正确识别、写入的数据格式不符合要求等。以下是一个简化的代码示例,展示了如何在uni-app中通过蓝牙API进行BLE设备的连接和数据写入,同时附带了一些调试和错误处理的思路。

1. 初始化蓝牙适配器并扫描设备

uni.openBluetoothAdapter({
  success: function (res) {
    console.log('蓝牙适配器初始化成功', res);
    uni.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
      success: function (discoverRes) {
        console.log('开始扫描设备', discoverRes);
        // 假设设备已被发现并连接
        // 连接设备逻辑省略...
      }
    });
  },
  fail: function (err) {
    console.error('蓝牙适配器初始化失败', err);
  }
});

2. 连接设备并获取服务

uni.createBLEConnection({
  deviceId: 'your_device_id', // 替换为实际设备ID
  success: function (connRes) {
    console.log('设备连接成功', connRes);
    uni.getBLEDeviceServices({
      deviceId: 'your_device_id',
      success: function (serviceRes) {
        console.log('获取服务成功', serviceRes);
        // 假设服务ID已知
        const serviceId = 'your_service_id';
        // 获取特征值
        uni.getBLEDeviceCharacteristics({
          deviceId: 'your_device_id',
          serviceId: serviceId,
          success: function (charRes) {
            console.log('获取特征值成功', charRes);
            // 假设特征值ID已知
            const characteristicId = 'your_characteristic_id';
            // 准备写入数据
            writeValue(deviceId, serviceId, characteristicId);
          }
        });
      }
    });
  },
  fail: function (err) {
    console.error('设备连接失败', err);
  }
});

3. 写入数据

function writeValue(deviceId, serviceId, characteristicId) {
  const value = new ArrayBuffer(4); // 示例数据,根据实际情况调整
  const dataView = new DataView(value);
  dataView.setUint32(0, 123456, true); // 示例写入值

  uni.writeBLECharacteristicValue({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    value: value,
    success: function (writeRes) {
      console.log('数据写入成功', writeRes);
    },
    fail: function (err) {
      if (err.errCode === 10007) {
        console.error('写入数据失败,错误码10007', err);
        // 可以尝试重新连接设备或重试写入操作
      } else {
        console.error('写入数据失败', err);
      }
    }
  });
}

注意事项

  • 确保设备ID、服务ID和特征值ID正确无误。
  • 检查写入的数据格式是否符合设备要求。
  • 对于错误码10007,可以考虑增加重试机制,或检查设备连接状态是否稳定。
  • 使用uni.onBLEConnectionStateChange监听设备连接状态变化,以便及时处理连接断开的情况。
回到顶部