gpt4 book ai didi

android - rxandroidble:ble 设备长时间断开连接:应用程序进入休眠状态

转载 作者:行者123 更新时间:2023-11-29 01:14:11 25 4
gpt4 key购买 nike

我正在使用 rxandroidble 使用 autoconnect = true 来持续监控来自传感器的数据。该应用会持续扫描它之前连接过的传感器。

即使手机未连接电源,传感器的数据监控和扫描也应持续整夜。

如果传感器在晚上连接,应用程序将整晚保持连接状态,即使它暂时断开连接也是如此。

但是,如果传感器在夜间断开连接 6 小时(因为我拔掉了传感器的电池),然后在早上重新连接传感器电池,手机似乎不会重新连接到传感器。

我每 8 秒不断扫描一次 Android 服务中的新传感器,但它不是 WakefulService,也不是由 WakefulIntent 启动的。应该吗?

知道会发生什么吗? rxandroidble 是否设计为在这种情况下继续扫描传感器(ble 设备连接,超出范围 8 小时,然后返回范围内)?或者我需要在断开连接后手动尝试重新连接,然后 rxandroid 会不断尝试重新连接。

这是我的扫码:

    public boolean scanForDevices(boolean on){


if(on){
if (!mBluetoothAdapter.isEnabled()) {
Log.e(TAG, "scanForDevices: bluetooth not enabled, scan failed" );
return false; // bluetooth disabled
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (TheApplication.getInstance().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "scanForDevices: ACCESS_COARSE_LOCATION permission not granted, scan failed" );
return false; // App doesn't have permission granted
}
}

if (isScanning()) {
scanSubscription.unsubscribe();
} else {

scanSubscription = RxBleClientSingleton.getInstance().getRxBleClient().scanBleDevices()
.observeOn(AndroidSchedulers.mainThread())
.doOnError(this::onScanFailure)
.doOnUnsubscribe(this::clearSubscription)
.subscribe(this::onScanResult, this::onScanFailure);


//Ensure we won't Scan forever (save battery)
if (EnablePeriodicScan == true) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isScanning())
scanForDevices(false);
}
}, 4000);
}

}
}else{
//Turn scanning off
if(isScanning()){
scanSubscription.unsubscribe();
}
}
return true;
}

这是我的连接代码:

public void RxBleConnect() {



autoConnectSetting = true;



if (false == sensorConnectionState.equals(SensorConnectionState.Disconnected)) {
Log.d(TAG, "RxBleConnect: cannot connect, #" + allowReconnect + " : " + macAddress + " isn't disconnected, currently in " + sensorConnectionState.toString() );

if ((sensorConnectionState.equals(SensorConnectionState.Connected)) && (allowReconnect > 15)) { /// reached our limit even though we are connected?
allowReconnect = 0; // reset count
Disconnect(); // disconnect sensor.
Log.d(TAG, "RxBleConnect: someone keeps knocking, appears that " + macAddress + " isn't as connected as we thought.");
}
allowReconnect ++;

return; // dont reattempt connection if already attempting to connect
}

Log.d(TAG, "RxBleConnect: connecting to sensor....");

SystemClock.sleep(400);


connectionObservable =
bleDevice.establishConnection(TheApplication.getInstance(), autoConnectSetting)

.compose(new ConnectionSharingAdapter())
.observeOn(AndroidSchedulers.mainThread())


.doOnUnsubscribe(this::RxBleDisconnect)
.takeUntil(disconnectTriggerSubject)
.doOnError(throwable -> {
Log.d(TAG, "rxBleConnection doOnError: " + throwable);
Disconnect(); // triggerDisconnect();
});



connectionSubscription = connectionObservable
.flatMap(RxBleConnection::discoverServices)
.subscribe(this::RxBleOnConnectionReceived, this::RxBleOnConnectionFailure);



}

如果连接状态变为断开连接,我不会尝试手动重新连接;扫描或自动连接应该解决这个问题吧?

我已经在 Android 电池设置中为应用程序关闭了“应用程序优化”又名打瞌睡模式,但我不知道这是否有任何作用。

EDIT 1: Here are my logs.... we connect ok the first time, then we attempt connecting, then we immediately disconnect:

>>> FIRST CONNECTION <<<
12-09 21:23:46.904 8992-8992/appName D/PeripheralManager: RxBleConnect: connecting to sensor...., auto connect = false
onConnectionStateChange newState=2 status=0
12-09 21:23:09.298 8992-8992/appName D/PeripheralManager: onConnectionStateChange: new state RxBleConnectionState{CONNECTED}
12-09 21:23:46.831 8992-9004/appName D/BluetoothGatt: onClientConnectionState() - status=8 clientIf=5 device=E0:CF:8D:98:69:6A
12-09 21:23:46.832 8992-9004/appName D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=8
12-09 21:23:46.897 8992-8992/appName D/PeripheralManager: onConnectionStateChange: new state RxBleConnectionState{DISCONNECTED}
12-09 21:23:46.897 8992-8992/appName D/Peripheral Manager: setConnectionState: Set e0:cf:8d:98:69:6a connection state to Disconnected
12-09 21:23:46.898 8992-8992/appName E/PeripheralManager: ### sendDisconnectNotification: mid = 2698601

>>> ATTEMPT RECONNECT HERE <<<<
12-09 21:23:46.904 8992-8992/appName D/PeripheralManager: RxBleConnect: connecting to sensor...., auto connect = true
12-09 21:23:46.915 8992-9004/appName D/RxBle#Radio: QUEUED RxBleRadioOperationDisconnect(250971465)
12-09 21:23:46.916 8992-9070/appName D/RxBle#Radio: STARTED RxBleRadioOperationDisconnect(250971465)
12-09 21:23:46.922 8992-9004/appName D/BluetoothGatt: setCharacteristicNotification() - uuid: f8c00003-159f-11e6-92f5-0002a5d5c51b enable: false
12-09 21:23:46.928 8992-9004/appName D/RxBle#Radio: QUEUED RxBleRadioOperationDescriptorWrite(49261423)
12-09 21:23:47.306 8992-8992/appName D/RxBle#Radio: QUEUED RxBleRadioOperationConnect(200794900)
12-09 21:23:47.316 8992-8992/appName D/PeripheralManager: onConnectionStateChange: new state RxBleConnectionState{CONNECTING}
12-09 21:23:47.316 8992-8992/appName D/Peripheral Manager: setConnectionState: Set e0:cf:8d:98:69:6a connection state to Connecting…
12-09 21:23:47.340 8992-8992/appName D/BluetoothManager: getConnectionState()
12-09 21:23:47.340 8992-8992/appName D/BluetoothManager: getConnectedDevices
12-09 21:23:47.347 8992-9070/appName D/RxBle#Radio: FINISHED RxBleRadioOperationDisconnect(250971465)
12-09 21:23:47.348 8992-9070/appName D/RxBle#Radio: STARTED RxBleRadioOperationDescriptorWrite(49261423)
12-09 21:23:47.348 8992-8992/appName D/PeripheralManager: rxBleConnection doOnError: BleGattException{status=8, bleGattOperation=BleGattOperation{description='CONNECTION_STATE'}}
12-09 21:23:47.355 8992-8992/appName D/PeripheralManager: observeConnectionStateChanges FINISHED
12-09 21:23:47.355 8992-8992/appName D/PeripheralManager: rxBleConnection doOnError: BleGattException{status=8, bleGattOperation=BleGattOperation{description='CONNECTION_STATE'}}

谢谢!

2nd EDIT:

消费代码

私有(private)无效 RxBleOnConnectionReceived(RxBleDeviceServices 服务){ //发现服务

    connectionsCount ++;

Log.d(TAG, "RxBleOnConnectionReceived: Discovered services");


setConnectionState(SensorConnectionState.Connected);

try {



connectionSubscription = connectionObservable
.flatMap(rxBleConnection -> rxBleConnection.setupNotification(BluetoothLeUart.RX_UUID))
.doOnError(throwable -> {
Log.d(TAG, "RxBleOnConnectionReceived setupNotification doOnError: " + throwable);
Disconnect();
})
.doOnNext(notificationObservable -> {
// Notification has been set up
})
.flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> {
Log.d(TAG, "RxBleOnConnectionReceived doOnError: " + throwable);
})
.subscribe(
bytes -> {
// Given characteristic has been changes, here is the value.
processReceivedMessage(bytes);

},
throwable -> {
/*handle throwable*/

Log.e(TAG, "RxBleOnConnectionReceived: processReceivedMessage: " + throwable );
}
);

最佳答案

你问了几个问题:

  • 手机进入休眠模式时使用什么服务?

这是一个关于 stackoverflow 的好问题。例如这里:How does doze mode affect background/foreground services, with/without partial/full wakelocks? Cordova 插件 github 页面中还有一个关于在打瞌睡期间使用 BLE 的问题:https://github.com/thaliproject/Thali_CordovaPlugin/issues/413

  • RxAndroidBle 是否应该在设备断开连接时自动重新连接?

没有。连接结束后(无论它是使用 autoconnect = true 还是 false 启动的)都必须通过再次调用 RxBleDevice.establishConnection 重新建立连接。来自图书馆的描述:

Auto connect

(...)

Auto connect concept may be misleading at first glance. With the autoconnect flag set to false the connection will end up with an error if a BLE device is not advertising when the RxBleDevice#establishConnection method is called. From platform to platform timeout after which the error is emitted differs, but in general it is rather tens of seconds than single seconds.

Setting the auto connect flag to true allows you to wait until the BLE device becomes discoverable. The RxBleConnection instance won't be emitted until the connection is fully set up. From experience it also handles acquiring wake locks, so it's safe to assume that your Android device will be woken up after the connection has been established - but it is not a documented feature and may change in the future system releases.

  • 扫描或连接 autoconnect = true 是否会负责重新连接?

很难推断是什么触发了 scanForDevices() 函数,但看起来它会在 4 秒后自动完成。如果扫描打开并且用户将调用 scanForDevices(true),则无论如何都会停止扫描。

关于android - rxandroidble:ble 设备长时间断开连接:应用程序进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903276/

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