Android应用阅读蓝牙插座无法跟上数据速率

时间:2014-01-23 17:03:47

标签: android sockets bluetooth throughput

我有一个蓝牙GPS,以大约2000字节/秒的速度输出数据。当我第一次启动我的应用程序时,它能够跟上这个速度,但在大约5-10秒内,速率一直下降到500bytes / sec。它从那里上升和下降(通常在300bytes / sec到700bytes / sec之间,但是当它试图赶上时我看到高达6000bytes / sec的快速尖峰)。流只是越来越落后,数据最终被丢弃(GPS每秒输出10个样本,它到达我将错过几秒数据的点)。

当我从笔记本电脑通过蓝牙连接到同一台设备时,无论运行多长时间,都能获得所有数据。所以我知道设备本身能够以这个速率传输。但是在Android(HTC Droid DNA)上,它立即落后。我试图提高线程优先级,但没有帮助。应用程序在屏幕打开的整个时间内保持在前台。我也试过没有将手机插入调试器,以防万一因为速度慢下来而且问题仍然存在。我不知道这是蓝牙堆栈速度问题,还是线程优先级问题或者是什么。有什么想法吗?

更新:我刚刚在Galaxy Tab 10.1上测试了相同的代码, 能够无限期地保持大约2000字节/秒。然后,我在一台旧的摩托罗拉Photon 4G上进行了测试, 能够保持数据速率。在Droid DNA上,我测试了WiFi禁用以及是否这会损害蓝牙性能,但它没有任何区别。而且因为DNA可以在5-6秒内完成更高的速率,我认为硬件具有这种能力。出于某种原因,它在那之后才会下降......

OutputStream mmOutputStream;
InputStream mmInputStream;

UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);        
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();

dataReader();   


...
...


void dataReader()
{
    worker = new Thread(new Runnable()
    {
        public void run()
        {                
            int priority = Process.getThreadPriority(Process.myTid());
            Log.d("testApp", String.format("data thread priority %d", priority));
            Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY);
            priority = Process.getThreadPriority(Process.myTid());
            Log.d("testApp", String.format("data thread priority %d", priority));

            int bufferSize = 1024;
            byte[] readBuffer = new byte[bufferSize];

            long time1 = System.currentTimeMillis();
            long time2 = 0;
            long datacount = 0;

            while(!Thread.currentThread().isInterrupted() && !stopWorker)
            {
                try 
                {                       
                    // read what we can
                    int bytesRead = mmInputStream.read(readBuffer);

                    datacount += bytesRead;
                    time2 = System.currentTimeMillis();

                    // every second output the data rate
                    if (time2 - time1 > 1000)
                    {
                        final float rate = ((float)datacount * 1000.0F) / (float)(time2 - time1);

                        handler.post(new Runnable() {
                            public void run()
                            {
                                String text = String.format("%.1f bytes/sec", rate);
                                myLabel.setText(text);

                            }                               
                        });

                        time1 = time2;
                        datacount = 0;
                    }
                }
                catch (IOException ex) 
                {
                    stopWorker = true;
                }
            }
        }
    }
}

0 个答案:

没有答案