Android与RN4678蓝牙RFCOMM传输速率过慢问题求助及汇报建议
问题:蓝牙RFCOMM传输速率过慢及汇报建议
测试背景
我们正在测试多款新平板,发现所有可测试机型与RN4678板卡连接时均存在蓝牙RFCOMM传输速率过慢的问题,各机型表现如下:
- 当前主力测试:Lenovo M10 FHD Plus
- 已测其他机型:
- Teclast M40S、Nokia T20:传输速率极差
- Samsung Galaxy Tab A8:表现尚可但未达理想状态
- Lenovo M10 Plus 3rd Gen:因按键位置与平板支架不兼容无法使用
相关代码
public void SendMessage(BluetoothSocket socket, String msg) { OutputStream outStream; try { outStream = BluetoothConnectionService.outputStream; outStream.write("S".getBytes()); Thread.sleep(4000); processThread = true; mApp.running = true; BluetoothSocketListener bsl = new BluetoothSocketListener(socket, CollectingDetail.this); Thread messageListener = new Thread(bsl); messageListener.start(); timer = new CounterClass(remaingTime, 1000); timer.start(); bt_stop.setText("Stop"); IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); registerReceiver(bluetoothReceiver, filter); bluetoothReceiver.setRegistered(true); } catch (IOException | InterruptedException e) { Log.e("BLUETOOTH_COMMS", e.getMessage()); connectSocket(); } } public static class BluetoothSocketListener implements Runnable { private final WeakReference<CollectingDetail> wrActivity; private BluetoothSocket socket; public BluetoothSocketListener(BluetoothSocket socket, CollectingDetail collectingDetail) { this.socket = socket; wrActivity = new WeakReference<CollectingDetail>(collectingDetail); } @Override public void run() { final CollectingDetail activity = wrActivity.get(); if (activity != null) { activity.inStream = null; if (!Thread.currentThread().isInterrupted()) { int bufferSize = 512; byte[] buffer = new byte[bufferSize]; Log.i("Bluetooth bytes", new String(buffer)); activity.inStream = BluetoothConnectionService.inputStream; int availableBytes; int bytesRead = -1; String message = ""; while (activity.processThread) { message = ""; try { availableBytes = activity.inStream.available(); if (availableBytes > 0) { bytesRead = activity.inStream.read(buffer); if (bytesRead != -1 && bytesRead < bufferSize) { message = new String(buffer, 0, bytesRead); if (activity.mainHandler != null) { activity.mainHandler.post(new MessagePoster(message, activity)); } } } } catch (IOException e) { Log.e("BLUETOOTH_COMMS", "Error reading bytes"); try { socket.close(); } catch (IOException e1) { Log.e("BLUETOOTH_COMMS", "Could not close socket"); } activity.processThread = false; } } } } } } public void seprateData(String message) { try { message = message.replaceAll("(\\r\\n|\\n|\\r)", ","); String[] a = message.split(","); boolean goodData = false; for (int i = 0; i < a.length; i++) { final String data = a[i]; if (data.length() > 0 && !data.equals(" ")) { if (data.length() >= 10 && data.startsWith("5A")) { al_sepratedMessageList.add(data); goodData = true; } } } if (goodData) { calculation(); if (ConnectThrough.equalsIgnoreCase("usb")) { UsbConnectionSerivce.sendMessage("K"); } else { BluetoothConnectionService.sendMessage(socket, "K"); } } } catch (Exception e) { Log.e("BiSym", "Error Parsing BiSym Data"); } }
核心疑问
- 是否存在无需修改固件即可提升传输速率的方案?目前了解到其他开发者也遇到过类似问题,但未找到有效解决方案。
- 若问题根源在于蓝牙硬件/固件(无法通过软件解决),该如何向老板汇报此情况?
解答
一、无需修改固件的速率优化方案
针对现有代码和RFCOMM协议特性,可尝试以下优化点:
- 增大读取缓冲区:当前代码缓冲区设为512字节,可尝试提升至1024或2048字节,减少IO调用次数,提升单次数据读取量
- 移除不必要的延迟:
SendMessage中的Thread.sleep(4000)无业务必要性,直接移除可消除传输启动阶段的阻塞延迟 - 优化数据读取逻辑:取消
available()判断,直接调用read(buffer)让系统自动等待数据,避免空轮询浪费资源,提升读取效率 - 调整MTU参数:部分Android设备支持通过反射调用
BluetoothSocket.setMtu()设置更大的传输单元,可尝试设置为最大支持值(如1024) - 批量处理数据:修改
seprateData逻辑,积累一定数量的有效数据后再触发计算和应答,减少双向交互的频次 - 隔离UI线程:将数据解析、计算逻辑移至子线程执行,避免通过
mainHandler.post频繁切换线程导致的性能损耗
二、向老板汇报的建议
- 开门见山讲结论:直接说明测试核心结果——多款平板与RN4678板卡的RFCOMM传输速率未达预期,部分机型表现极差,初步排查后软件优化空间有限,可能涉及硬件/固件层面的兼容性限制。
- 量化测试信息:整理各机型的速率对比数据(如每秒传输字节数),明确不同机型的差异,同时说明支架兼容问题的影响。
- 说明已做的排查:提及已梳理代码层面的优化点,且了解到其他开发者也遇到同类问题,暂未找到有效软件解决方案。
- 提供备选方案:
- 过渡方案:选用表现较好的Samsung Galaxy Tab A8作为临时适配机型,推进项目进度
- 长期方案:联系RN4678板卡厂商咨询固件升级或适配指导
- 替代方案:评估切换BLE高速模式或有线连接的可行性
- 明确决策需求:提出需要老板批准的事项,比如是否采购更多测试机型、是否启动厂商沟通、是否调整项目时间节点等。
内容的提问来源于stack exchange,提问作者Pink Jazz
相关产品推荐
相关产品推荐

