Java 为什么Android蓝牙在某些设备上接收延迟

Java 为什么Android蓝牙在某些设备上接收延迟,java,android,bluetooth,android-bluetooth,Java,Android,Bluetooth,Android Bluetooth,最近,当使用最新的三星Tab A 8.0(SM-T290)和联想M7(TB-7305F)(均运行Android v9)进行测试时,在连接到某些设备时,接收到的蓝牙数据滞后。在旧版平板电脑和连接到相同设备的手机上运行相同的应用程序没有问题。在一些较新的手机上运行相同的应用程序也没有问题 这些有问题的设备上的InputStream似乎缓冲了更多的数据,而不是立即更新套接字读取。并且趋向于阻塞几乎全部的缓冲区大小。在没有问题的设备上,新数据几乎可以立即返回 大致接收代码如下: private stat

最近,当使用最新的三星Tab A 8.0(SM-T290)和联想M7(TB-7305F)(均运行Android v9)进行测试时,在连接到某些设备时,接收到的蓝牙数据滞后。在旧版平板电脑和连接到相同设备的手机上运行相同的应用程序没有问题。在一些较新的手机上运行相同的应用程序也没有问题

这些有问题的设备上的InputStream似乎缓冲了更多的数据,而不是立即更新套接字读取。并且趋向于阻塞几乎全部的缓冲区大小。在没有问题的设备上,新数据几乎可以立即返回

大致接收代码如下:

private static final int BUFFER_SIZE = 1024;
private OutputStream tx;
private InputStream rx;
private BluetoothSocket bt_socket;

public void run() {

    BluetoothDevice device = getDevice();
    if (device != null) {
        // create socket
        try {
            bt_socket = device.createInsecureRfcommSocketToServiceRecord(UUID_BLUETOOTH_SERIAL);

            bt_socket.connect();

            tx = bt_socket.getOutputStream();
            rx = bt_socket.getInputStream();

            nativeBluetoothStatusNotify(deviceName, FLAG_CONNECTED);
        } catch (IOException e) {

            try {
                bt_socket.close();
            } catch (IOException closeException) {
            }
            nativeBluetoothStatusNotify(deviceName, FLAG_CONNECTION_FAILED);
        }

        try {
            while (true) {
                int bytesRead = rx.read(buffer, 0, BUFFER_SIZE);
                String cOut = new String(buffer, 0, bytesRead, "ISO-8859-1");
                nativeBluetoothRxNotify(deviceName, buffer, cOut.length());
            }
        } catch (IOException e) {
            nativeBluetoothStatusNotify(deviceName, FLAG_RECEIVE_FAILED);
        } catch (NullPointerException e) {
            nativeBluetoothStatusNotify(deviceName, FLAG_BLUETOOTH_FAILURE);
        }
    }
}
减小缓冲区大小确实有很大帮助,但数据仍然是不稳定的和延迟的


有人能提供一些关于这方面或任何解决办法的见解吗?这是安卓本身、我的实现还是底层蓝牙固件中的问题?

我最终解决了这个问题,只是确保偶尔向这些设备发送数据,而不是在启动时进行配置,然后坐在那里接收数据。每500毫秒一次心跳字符(linefeed)似乎是解决该问题的最基本的解决方法

我怀疑那些有问题的平板电脑必须进入蓝牙扫描/广告模式,或者在一段时间内不发送时可能会出现低功耗;这会减慢接收速度