android - PAN1026 蓝牙套接字读取速度变慢

标签 android bluetooth

我正在开发一个 Android 应用程序,它通过蓝牙 SPP 连接到 PAN1026 芯片并且应该以 50 Hz 的速率接收数据(大约 80 字节)。

该芯片与在 mac 上运行的 python 脚本一起工作正常。它与另一个跨平台模块(linux、mac、windows)一起工作也很好。

我编写了另一个 Android 应用程序,其功能与芯片相同:以 50 Hz 的速率发送数据(约 80 字节)。我的应用程序与第二个 Android 应用程序配合良好。我的应用程序在 mac 上运行的 python 脚本也能正常工作。

但是:当我的应用程序连接到芯片时,它仅以 2 Hz 的速率接收数据,导致无法接受的延迟。当我使用 Play 商店中的蓝牙调试应用程序(BlueSPP 或蓝牙 SPP pro)时也会发生这种情况。

所以基本上问题只发生在 Android 和 PAN1026 之间。我使用 Android 4.4。

我尝试: - 将我的 InputStream 包装在 BufferedInputStream 中,以防我阅读速度不够快,但它实际上是值得的。也许是因为 InputStream 实际上是一个 BluetoothInputStream。 - 配置文件内存使用情况,但我没有发现任何可疑的泄漏。 - 使用反射方法连接(它甚至没有连接)。 - 使用不安全的方法连接:同样的滞后问题。

我没有尝试: - 使用其他版本的 Android,因为最终该应用程序也将使用 BLE,因此不需要更早的版本。

我将尝试: - 检查芯片的侧面,看它是否真的以 50 Hz 的速率发送数据。但无论如何都不能解决问题。

我做错了什么吗?还是 Android 和 PAN1026 之间存在错误?遇到这种情况怎么办?

如果您能就此主题提供任何帮助,我将不胜感激。

这里是ConnectThread,类似于蓝牙聊天的例子:

private class ConnectThread extends Thread{
        public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        private final BluetoothSocket mmSocket;

        public ConnectThread(BluetoothDevice device) {
            BluetoothSocket tmp = null;
            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                Log.e(TAG, e.toString());
            }
            mmSocket = tmp;
        }

        public void run() {
            mAdapter.cancelDiscovery();

            try {
                mmSocket.connect();
            } catch (IOException connectException) {
                try {
                    mmSocket.close();
                } catch (IOException closeException) { Log.e(TAG, closeException.toString());}
                return;
            }
            synchronized (this) {
                resetConnectThread();//properly deallocate memory
            }
            connected(mmSocket);//start the following thread
        }
    }

这是我的连接线程: 我简化了代码,使其易于理解并仅限于问题。实际上,当以下线程仅从套接字读取时也会出现问题。所以如果瓶颈不在芯片一侧,那么瓶颈就在读取方法上。

private class ConnectedThread extends Thread{

        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            this.mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                BluetoothService.this.stop();
            }

            this.mmInStream = tmpIn;
            this.mmOutStream = tmpOut;
        }

        public void run() {
            byte[] buffer = new byte[80];
            int bytes;

            while (true) {
                try {
                    bytes = mmInStream.read(buffer, 0, 80);
                } catch (IOException e) {
                    BluetoothService.this.stop();
                    break;
                }
            }
        }
}

最佳答案

你的问题看起来像this one .我敢打赌您的设备将进入嗅探模式,因为它不会向 PAN1026 发送任何信息。您可以通过在设备中获取 HCI 日志来检查这一点。

Android 仅监控 tx channel (传输)而不监控 rx channel (接收)。从我在你的代码中看到的,你没有向设备发送任何数据,因此你没有使用 tx channel 。如上文所述,您应该尝试每 ~500 毫秒发送一次数据,以避免您的设备进入嗅探模式。

关于android - PAN1026 蓝牙套接字读取速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26012875/

相关文章:

Android – 监听传入的 SMS 消息

c# - 我们是否必须在应用程序级别处理蓝牙 LE 通信中的 MTU?

cordova - 如何根据 tx、rssi 和精度计算到信标的距离

java - 使用 android-beacon-library 检测蓝牙设备

android - Kivy 中的 build.py 脚本编译错误

android - 使用 ImageButton android 分享到 Whatsapp

android - 如何在 Android 中选择一个文件并计算其哈希值 (SHA-256)

Android 相机 setOrientation 不受影响

java - 使用蓝牙适配器将字符串从 PC 发送到 Android 应用程序

ios - pjsip ios : Bluetooth not working