uni-app 在部分安卓设备上使用低功耗蓝牙通讯不能正常接收处理分包数据

uni-app 在部分安卓设备上使用低功耗蓝牙通讯不能正常接收处理分包数据

| 开发环境 | 版本号       | 项目创建方式 |
|----------|--------------|--------------|
| Windows  | Windows 11   | HBuilderX    |
|          | 专业版 23H2  |              |

产品分类:  
uniapp/App  

PC开发环境操作系统:  
Windows  

HBuilderX类型:  
正式  

HBuilderX版本号:  
4.75  

手机系统:  
Android  

手机系统版本号:  
Android 15  

手机厂商:  
小米  

手机机型:  
xiaomi15Pro  

页面类型:  
vue  

vue版本:  
vue3  

打包方式:  
云端  

bug描述:  
在小米15Pro使用ble通讯,不能正常监听下位机的分包数据,下位机分了两个包,uniapp只触发了最后一个包的回调,只接收到最后一包数据。在另外一台android12版本的工业平板上运行能正常处理这个数据,正常触发两次回调,能够正常多数据进行拼接。

操作步骤:  
/

预期结果:  
/  

实际结果:  
/

更多关于uni-app 在部分安卓设备上使用低功耗蓝牙通讯不能正常接收处理分包数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 在部分安卓设备上使用低功耗蓝牙通讯不能正常接收处理分包数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的安卓蓝牙分包处理兼容性问题。在不同安卓版本和设备上,蓝牙数据接收机制存在差异。

可能原因:

  1. 安卓15系统对BLE数据传输做了优化,可能合并了快速连续的数据包
  2. 小米设备的蓝牙芯片或驱动处理分包逻辑与其他设备不同
  3. 系统级的蓝牙数据缓冲机制导致分包被合并

解决方案:

// 在接收数据时增加超时处理机制
let receiveBuffer = [];
let lastReceiveTime = 0;
const PACKET_TIMEOUT = 50; // 50ms超时

function onBLECharacteristicValueChange(res) {
    const currentTime = Date.now();
    
    // 如果超过超时时间,认为是新数据包开始
    if (currentTime - lastReceiveTime > PACKET_TIMEOUT) {
        receiveBuffer = [];
    }
    
    receiveBuffer.push(res.value);
    lastReceiveTime = currentTime;
    
    // 延迟处理,等待可能的分包
    clearTimeout(processTimer);
    processTimer = setTimeout(() => {
        processCompleteData(receiveBuffer);
        receiveBuffer = [];
    }, PACKET_TIMEOUT + 10);
}
回到顶部