我正在开发一个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;
}
}
}
}