首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蓝牙套接字读取速度随PAN1026降低

蓝牙套接字读取速度随PAN1026降低
EN

Stack Overflow用户
提问于 2014-09-24 09:08:16
回答 1查看 759关注 0票数 3

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

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

我编写了另一个Android应用程序,它与芯片的功能相同:以50 Hz的速度发送数据(约80字节)。我的应用程序和第二个Android应用程序运行得很好。我的应用程序在mac上运行的python脚本也很好。

但是:当我的应用程序连接到芯片上时,它只接收2Hz的数据,造成不可接受的滞后。当我使用来自Play Store的蓝牙调试应用程序(BlueSPP或蓝牙SPP )时,也会发生这种情况。

所以基本上这个问题只发生在安卓和PAN1026之间。我使用Android4.4.

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

我没有尝试:-使用另一个版本的安卓,因为最终应用程序也将使用BLE,所以不需要更早的版本。

,我将尝试:-检查芯片的一侧,看看它是否真的以50 Hz的速度发送数据。但无论如何也解决不了这个问题。

我做错了什么吗?还是安卓和PAN1026之间有漏洞?在这种情况下该怎么办?

我非常感谢在这个问题上提供任何帮助。

下面是ConnectThread,类似于蓝牙聊天示例:

代码语言:javascript
复制
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:我简化了代码,所以它很容易理解,并且仅限于这个问题。实际上,当下面的线程只从套接字读取时也会发生问题。因此,如果读取方法不是在芯片的一侧,那么瓶颈就在读取方法中。

代码语言:javascript
复制
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;
                }
            }
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-26 07:20:18

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

Android只监视tx通道(传输),而不监视rx通道(接收)。从您的代码中可以看到,您没有向设备发送任何数据,因此您没有使用tx通道。如前所述,您应该尝试每500 As发送一次数据,以避免设备进入嗅探模式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26012875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档