使用PAN1026,蓝牙插座读取速度变慢

时间:2014-09-24 09:08:17

标签: android bluetooth

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

芯片可以在mac上运行python脚本。它与另一个跨平台模块(linux,mac,windows)一起工作正常。

我写了另一个Android应用程序与芯片做同样的事情:以50赫兹的速率发送数据(大约80个字节)。我的应用程序适用于第二个Android应用程序。使用在mac上运行的python脚本,我的应用程序也能正常工作。

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

所以基本上问题只发生在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
        }
    }

这是我的ConnectedThread: 我简化了代码,因此它易于理解并且仅限于问题。实际上,当以下线程仅从套接字读取时,也会发生此问题。因此,如果它不在芯片的一侧,那么瓶颈就在读取方法中。

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

1 个答案:

答案 0 :(得分:3)

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

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