Android 慢速蓝牙 RFCOMM 传输速率与 RN4678

问题描述 投票:0回答:3

我们正在尝试一系列新平板电脑,我们尝试的每一款平板电脑都存在 RN4678 板传输速率慢的问题。我们目前使用的是联想 M10 FHD Plus。我们尝试了一些,例如台电 M40S、诺基亚 T20 和三星 Galaxy Tab A8。前两者的传输率很糟糕,而后者还可以,但并不理想。我们无法使用 Lenovo M10 Plus 第三代,因为按钮太靠近角落,无法与我们的平板电脑支架一起使用。

这是我的代码:

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

有什么方法可以在不改变固件的情况下提高传输速率?似乎其他人也面临着类似的问题,但没有一个答案有真正的解决方案。你能帮我一下吗?谢谢。

我担心这可能无法通过软件解决,并且可能是 BT 硬件或固件的问题。我该如何与老板沟通这件事?

android bluetooth android-bluetooth rfcomm spp
3个回答
0
投票

我担心这可能无法通过软件解决,并且可能是 BT 硬件或固件的问题。我该如何与老板沟通此事?

区别在于信号过滤的质量,更好的过滤器,更窄的带宽,意味着更低的信噪比。较低的信噪比意味着更快的传输。

更好的模拟滤波器,意味着更多的组件以及稍微更高的成本和损耗,但是,由于蓝牙的宽带特性,大多数模拟滤波器只能过滤带外信号(AM/FM/电视广播公司附近)。

除了模拟滤波器之外,还对信号应用数字滤波器来缩小频带内的带宽,这种技术损失很小,但需要芯片中包含更多的处理能力,更多的晶体管,更高的成本。

滤波器的阶数和类型FIR或IIR决定了滤波器的特性。

大多数设计师会最大限度地降低成本以满足最低规格,有些设计师会平衡成本与性能并走得更远,你永远不知道。

你告诉你的老板,更好的平台执行的数字过滤远远超出了蓝牙规范的要求。


0
投票

我刚刚测试了台电M40 Plus,没有这个问题。

有些事情让我相信这是紫光展锐蓝牙堆栈的问题。台电M40 Plus有联发科,没有这个问题。

编辑:还在搭载 MediaTek Helio G80 的 Lenovo M10 Plus 第三代上进行了测试,没有问题。如果我们必须使用它,我们可能需要一个新的平板电脑支架。


0
投票

作为更新,我将我们的应用程序更新为针对 Android 13,看来延迟问题已经消失。我使用配备 Unisoc Tiger T606 处理器的台电 T40HD 平板电脑对其进行了测试,它似乎运行完美。我与之前针对 Android 12 的软件版本进行了比较,旧版本中存在延迟,但新版本中没有。显然,Android 13 中的新蓝牙堆栈对 Unisoc 处理器有更好的支持。

© www.soinside.com 2019 - 2024. All rights reserved.