我正在开发一款Android应用程序,它通过蓝牙SPP连接到PAN1026芯片,并且应该以50 Hz的速率接收数据(大约80个字节)。
芯片可以在mac上运行python脚本。它与另一个跨平台模块(linux,mac,windows)一起工作正常。
我写了另一个Android应用程序与芯片做同样的事情:以50赫兹的速率发送数据(大约80个字节)。我的应用程序适用于第二个Android应用程序。使用在mac上运行的python脚本,我的应用程序也能正常工作。
BUT:当我的应用程序连接到芯片时,它只以2 Hz的速率接收数据,导致无法接受的延迟。当我使用Play商店中的蓝牙调试应用程序(BlueSPP或蓝牙SPP专业版)时,也会发生这种情况。
所以基本上问题只发生在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;
}
}
}
}
答案 0 :(得分:3)
您的问题看起来像this one。我敢打赌你的设备会进入嗅探模式,因为它不会向PAN1026发送任何信息。你可以通过在你的设备中获取你的HCI日志来检查这一点。
Android仅监控tx频道(传输)而不监听rx频道(接收)。从我在你的代码中看到的你没有向设备发送任何数据,因此你没有使用tx频道。正如上面的帖子中所提到的,你应该尝试每隔500毫秒发送一次数据,以避免你的设备进入嗅探模式。