我有一个蓝牙 GPS,它以大约 2000 字节/秒的速度输出数据。当我第一次启动我的应用程序时,它能够跟上这个速率,但在大约 5-10 秒内,速率一直下降到 500 字节/秒。从那里它会上升和下降(通常在 300 字节/秒和 700 字节/秒之间,但当它试图赶上时,我已经看到高达 6000 字节/秒的快速峰值)。流越来越落后,数据最终被丢弃(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;
}
}
}
}
}