我正在開發一個Android應用程序,它通過藍牙SPP連接到PAN1026芯片,應該以50赫茲的速率接收數據(約80字節)。藍牙插座讀取速度減慢PAN1026
該芯片可以正常運行在mac上的python腳本。它與另一個跨平臺模塊(linux,mac,windows)一起工作良好。
我寫了另一個與芯片完全相同的Android應用程序:以50 Hz的速率發送數據(大約80字節)。而且我的應用可以與第二款Android應用一起使用。我的應用程序工作正常,以及在Mac上運行的python腳本。
但是:當我的應用程序連接到芯片時,它僅以2 Hz的速率接收數據,造成不可接受的滯後。當我使用Play商店的藍牙調試應用程序(BlueSPP或Bluetooth 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
}
}
這裏是我的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;
}
}
}
}