You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
}

核心疑问

  1. 是否存在无需修改固件即可提升传输速率的方案?目前了解到其他开发者也遇到过类似问题,但未找到有效解决方案。
  2. 若问题根源在于蓝牙硬件/固件(无法通过软件解决),该如何向老板汇报此情况?

解答

一、无需修改固件的速率优化方案

针对现有代码和RFCOMM协议特性,可尝试以下优化点:

  • 增大读取缓冲区:当前代码缓冲区设为512字节,可尝试提升至1024或2048字节,减少IO调用次数,提升单次数据读取量
  • 移除不必要的延迟:SendMessage中的Thread.sleep(4000)无业务必要性,直接移除可消除传输启动阶段的阻塞延迟
  • 优化数据读取逻辑:取消available()判断,直接调用read(buffer)让系统自动等待数据,避免空轮询浪费资源,提升读取效率
  • 调整MTU参数:部分Android设备支持通过反射调用BluetoothSocket.setMtu()设置更大的传输单元,可尝试设置为最大支持值(如1024)
  • 批量处理数据:修改seprateData逻辑,积累一定数量的有效数据后再触发计算和应答,减少双向交互的频次
  • 隔离UI线程:将数据解析、计算逻辑移至子线程执行,避免通过mainHandler.post频繁切换线程导致的性能损耗

二、向老板汇报的建议

  1. 开门见山讲结论:直接说明测试核心结果——多款平板与RN4678板卡的RFCOMM传输速率未达预期,部分机型表现极差,初步排查后软件优化空间有限,可能涉及硬件/固件层面的兼容性限制。
  2. 量化测试信息:整理各机型的速率对比数据(如每秒传输字节数),明确不同机型的差异,同时说明支架兼容问题的影响。
  3. 说明已做的排查:提及已梳理代码层面的优化点,且了解到其他开发者也遇到同类问题,暂未找到有效软件解决方案。
  4. 提供备选方案:
    • 过渡方案:选用表现较好的Samsung Galaxy Tab A8作为临时适配机型,推进项目进度
    • 长期方案:联系RN4678板卡厂商咨询固件升级或适配指导
    • 替代方案:评估切换BLE高速模式或有线连接的可行性
  5. 明确决策需求:提出需要老板批准的事项,比如是否采购更多测试机型、是否启动厂商沟通、是否调整项目时间节点等。

内容的提问来源于stack exchange,提问作者Pink Jazz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:45:24