gpt4 book ai didi

Android 4.0 和 4.1 蓝牙问题。检测损坏的通信和掉线配对

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:11 25 4
gpt4 key购买 nike

大家好

我知道 Android 的蓝牙堆栈 (bluez) 在 4.2 上被替换了。尽管他们可能已经修复了很多以前的问题,但由于需要支持旧版本,我仍然需要与他们战斗。

如果有人以前处理过这个问题并且可以阐明一些问题,我将非常感激

问题 #1 - 无法检测损坏的comms(4.0 和 4.1 Android,Bluez 蓝牙堆栈)

蓝牙应用连接到我们自己的自定义 SPP 设备(我们使用标准的UUID)。它使用在自己的进程上运行的蓝牙服务。此应用需要运行几个小时才能进行蓝牙工作。

省电/屏幕锁定期间,当数据通过蓝牙 radio 传入时,该应用程序保持 Activity ,我还检查定期设置警报,我请求 CPU 时间重新连接并继续工作(如有必要)

现在;系统大部分时间都运行良好,但在极少数情况下,当屏幕锁定并处于省电模式时,对于我不明白的原因是,在 writingoutput-stream (蓝牙套接字)时,一切似乎都在进行,而没有检测到断开的连接。 spp 设备仍然声明连接和配对有效,但什么也没收到。

在 Android 端,日志显示对 BluetoothSocket.cpp::writeNative 的本地调用(假设它与 bluez 蓝牙堆栈直接相关)似乎将字节正确写入蓝牙 radio 而不报告任何类型的错误。

写入输出流的代码 fragment :

public void write(byte[] bytes) {
try {
Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes to write : "+bytes);
mmOutStream.write(bytes);
mmOutStream.flush();
Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes written : "+bytes);
} catch (IOException e) {
e.printStackTrace();
}
}

日志:

D/com.our.app.bluetooth( 8711): bytes sending : [B@41e0bcf8

D/com.our.app.bluetooth( 8711): bluetooth bytes to write :[B@41e0bcf8

V/BluetoothSocket.cpp( 8711): writeNative

D/com.our.app.bluetooth( 8711): bluetooth bytes written :[B@41e0bcf8

问题 - 除了应用程序级检查和心跳之外,是否应该像本例中那样在套接字 I/O 操作中检测到​​损坏的通信?或者蓝牙 radio 可以在省电期间关闭吗?

问题 #2 - 突然从配对列表中删除。

在 Android 4.0 和 4.1 中,设备在某些情况下会莫名其妙地从配对列表中掉落。即使这种情况很少见,而且仅在某些特定设备中存在……这种情况会阻止手机轻松重新配对和连接。

我确实注意到 SPP 设备配对正确,但有时,android 设备会显示消息“无法与设备 X 配对,PIN 或密码不正确”。

注意:对于 Android 版本 < 4.2,我们确实使用不安全的通信(createInsecureRfcommSocket,由于此版本的其他 Android 连接问题)。

问题 - 在 session 期间应多久刷新一次此 PIN/密码?

这很可能是我们 SPP 设备中的错误,但如果不是,有什么想法吗?

万分感谢

最佳答案

这是在 nexus 7 上运行 android 4.4.2

private boolean refreshDeviceCache(BluetoothGatt gatt){
try {
BluetoothGatt localBluetoothGatt = gatt;
Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
if (localMethod != null) {
boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
return bool;
}
}
catch (Exception localException) {
Log.e(TAG, "An exception occured while refreshing device");
}
return false;}


public boolean connect(final String address) {
if (mBluetoothAdapter == null || address == null) {
Log.w(TAG,"BluetoothAdapter not initialized or unspecified address.");
return false;
}
// Previously connected device. Try to reconnect.
if (mBluetoothGatt != null) {
Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection.");
if (mBluetoothGatt.connect()) {
return true;
} else {
return false;
}
}

final BluetoothDevice device = mBluetoothAdapter
.getRemoteDevice(address);
if (device == null) {
Log.w(TAG, "Device not found. Unable to connect.");
return false;
}

// We want to directly connect to the device, so we are setting the
// autoConnect
// parameter to false.
mBluetoothGatt = device.connectGatt(MyApp.getContext(), false, mGattCallback));
refreshDeviceCache(mBluetoothGatt);
Log.d(TAG, "Trying to create a new connection.");
return true;

关于Android 4.0 和 4.1 蓝牙问题。检测损坏的通信和掉线配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26283678/

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