我正在开发一个通过蓝牙SPP连接到PAN1026芯片上的Android应用程序,它应该以50 Hz的速度接收数据(大约80字节)。
在mac上运行python脚本时,该芯片可以正常工作。它与另一个跨平台模块(linux、mac、windows)的工作也很好。
我编写了另一个Android应用程序,它与芯片的功能相同:以50 Hz的速度发送数据(约80字节)。我的应用程序和第二个Android应用程序运行得很好。我的应用程序在mac上运行的python脚本也很好。
但是:当我的应用程序连接到芯片上时,它只接收2Hz的数据,造成不可接受的滞后。当我使用来自Play Store的蓝牙调试应用程序(BlueSPP或蓝牙SPP )时,也会发生这种情况。
所以基本上这个问题只发生在安卓和PAN1026之间。我使用Android4.4.
,我试着:-把InputStream包在BufferedInputStream里,以防我读得不够快,但它实际上是值得的。也许是因为InputStream实际上是一个BluetoothInputStream。-配置文件内存使用情况,但我没有发现任何可疑的泄漏。-使用反射方法连接(它甚至没有连接)。-使用不安全的方法连接:相同的滞后问题。
我没有尝试:-使用另一个版本的安卓,因为最终应用程序也将使用BLE,所以不需要更早的版本。
,我将尝试:-检查芯片的一侧,看看它是否真的以50 Hz的速度发送数据。但无论如何也解决不了这个问题。
我做错了什么吗?还是安卓和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;
}
}
}
}发布于 2014-09-26 07:20:18
你的问题看起来像这一个。我打赌你的设备会进入嗅探模式,因为它不会向can 1026发送任何信息,你可以通过在你的设备中获得你的HCI日志来检查这个。
Android只监视tx通道(传输),而不监视rx通道(接收)。从您的代码中可以看到,您没有向设备发送任何数据,因此您没有使用tx通道。如前所述,您应该尝试每500 As发送一次数据,以避免设备进入嗅探模式。
https://stackoverflow.com/questions/26012875
复制相似问题