gpt4 book ai didi

android - PAN1026 蓝牙套接字读取速度变慢

转载 作者:太空狗 更新时间:2023-10-29 12:40:57 25 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,它通过蓝牙 SPP 连接到 PAN1026 芯片并且应该以 50 Hz 的速率接收数据(大约 80 字节)。

该芯片与在 mac 上运行的 python 脚本一起工作正常。它与另一个跨平台模块(linux、mac、windows)一起工作也很好。

我编写了另一个 Android 应用程序,其功能与芯片相同:以 50 Hz 的速率发送数据(约 80 字节)。我的应用程序与第二个 Android 应用程序配合良好。我的应用程序在 mac 上运行的 python 脚本也能正常工作。

但是:当我的应用程序连接到芯片时,它仅以 2 Hz 的速率接收数据,导致无法接受的延迟。当我使用 Play 商店中的蓝牙调试应用程序(BlueSPP 或蓝牙 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
}
}

这是我的连接线程:我简化了代码,使其易于理解并仅限于问题。实际上,当以下线程仅从套接字读取时也会出现问题。所以如果瓶颈不在芯片一侧,那么瓶颈就在读取方法上。

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;
}
}
}
}

最佳答案

你的问题看起来像this one .我敢打赌您的设备将进入嗅探模式,因为它不会向 PAN1026 发送任何信息。您可以通过在设备中获取 HCI 日志来检查这一点。

Android 仅监控 tx channel (传输)而不监控 rx channel (接收)。从我在你的代码中看到的,你没有向设备发送任何数据,因此你没有使用 tx channel 。如上文所述,您应该尝试每 ~500 毫秒发送一次数据,以避免您的设备进入嗅探模式。

关于android - PAN1026 蓝牙套接字读取速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26012875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com