- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 RxAndroidBle 库:
此代码按预期正常工作,单击 UI 上的“连接”按钮后,它建立了连接。
当我想要在设备返回范围内时自动连接到设备时出现问题。我不想再次点击“连接”按钮。
是否存在这样的功能? “真”标志在这里对我有帮助吗?如果是,如何实现?请提出建议。 rxBleDevice.establishConnection(true);
如果我使用 rxBleDevice.establishConnection(true)
,而不是“false”,我会遇到以下错误,请帮忙:
RxBleLog.setLogLevel(RxBleLog.VERBOSE);
scanSubscription = rxBleClient.scanBleDevices(
new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.build(),
new ScanFilter.Builder().setDeviceName("mydevice").build()
).take(1).subscribe(
scanResult -> {
final RxBleDevice rxBleDevice = scanResult.getBleDevice();
// connect to device
final Observable<RxBleConnection> connection = rxBleDevice.establishConnection(false);
connection
.subscribe(rxBleConnection -> {
DeviceInformation deviceInformation = new DeviceInformation();
deviceInformation.setName(rxBleDevice.getName());
scanSubscription.unsubscribe();
},
throwable -> {
throwable.printStackTrace();
System.out.println(throwable);
}
);
}
);
false
------
D/RxBle#ClientOperationQueue: QUEUED ScanOperationApi21(226148850)
D/RxBle#ClientOperationQueue: STARTED ScanOperationApi21(226148850)
I/Choreographer: Skipped 240 frames! The application may be doing too much work on its main thread.
I/RxBle#QueueOperation: Scan operation is requested to start.
D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=6
D/RxBle#ClientOperationQueue: FINISHED ScanOperationApi21(226148850)
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=6F:AE:DE:3E:2E:C3, mScanRecord=ScanRecord [mAdvertiseFlags=26, mServiceUuids=[00001805], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=101-1], mRssi=-92, mTimestampNanos=1043849718860030}
D/RxBle#ClientOperationQueue: QUEUED ConnectOperation(890174706)
D/RxBle#ClientOperationQueue: STARTED ConnectOperation(890174706)
V/RxBle#BleConnectionCompat: Connecting without reflection
D/BluetoothGatt: connect() - device: 6F:AE:DE:3E:2E:C3, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=542bd417
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=7 device=6F:AE:DE:3E:2E:C3
D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0
D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(890174706)
I/RxBle#CancellableSubscription: Scan operation is requested to stop.
D/RxBle#ConnectionOperationQueue: QUEUED ServiceDiscoveryOperation(888759094)
D/RxBle#ConnectionOperationQueue: STARTED ServiceDiscoveryOperation(888759094)
D/BluetoothGatt: discoverServices() - device: 6F:AE:DE:3E:2E:C3
D/BluetoothGatt: onSearchComplete() = Device=6F:AE:DE:3E:2E:C3 Status=0
D/RxBle#BluetoothGatt: onServicesDiscovered status=0
D/BluetoothGatt: setCharacteristicNotification() - uuid: b31e89de enable: true
D/RxBle#ConnectionOperationQueue: FINISHED ServiceDiscoveryOperation(888759094)
true
------
D/RxBle#ClientOperationQueue: QUEUED ScanOperationApi21(226148850)
D/RxBle#ClientOperationQueue: STARTED ScanOperationApi21(226148850)
I/Choreographer: Skipped 207 frames! The application may be doing too much work on its main thread.
I/RxBle#QueueOperation: Scan operation is requested to start.
D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=6
D/RxBle#ClientOperationQueue: FINISHED ScanOperationApi21(226148850)
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=6F:AE:DE:3E:2E:C3, mScanRecord=ScanRecord [mAdvertiseFlags=26, mServiceUuids=[00001805], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=101-1], mRssi=-81, mTimestampNanos=1043935540628438}
D/RxBle#ClientOperationQueue: QUEUED ConnectOperation(890174706)
D/RxBle#ClientOperationQueue: STARTED ConnectOperation(890174706)
V/RxBle#ConnectOperation: Trying to connectGatt using reflection.
V/RxBle#BleConnectionCompat: Found constructor with args count = 4
V/RxBle#BleConnectionCompat: Connecting using reflection
D/BluetoothGatt: connect() - device: 6F:AE:DE:3E:2E:C3, auto: true
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=125a849aa38e
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
D/BluetoothGatt: onClientConnectionState() - status=6 clientIf=7 device=6F:AE:DE:3E:2E:C3
D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=6
W/System.err: BleDisconnectedException{bluetoothDeviceAddress='6F:AE:DE:3E:2E:C3'}
W/System.err: at com.polidea.rxandroidble.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:76)
W/System.err: at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:181)
W/System.err: at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
W/System.err: at android.os.Binder.execTransact(Binder.java:446)
I/System.out: BleDisconnectedException{bluetoothDeviceAddress='6F:AE:DE:3E:2E:C3'}
I/RxBle#ConnectionOperationQueue: Connection operations queue to be terminated (6F:AE:DE:3E:2E:C3)
D/RxBle#Executors$RunnableAdapter: Terminated.
D/RxBle#ClientOperationQueue: QUEUED DisconnectOperation(550952755)
D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(890174706)
D/RxBle#ClientOperationQueue: STARTED DisconnectOperation(550952755)
D/BluetoothManager: getConnectionState()
D/BluetoothManager: getConnectedDevices
D/BluetoothGatt: close()
D/BluetoothGatt: unregisterApp() - mClientIf=7
D/RxBle#ClientOperationQueue: FINISHED DisconnectOperation(550952755)-
最佳答案
有多种可能的解决方案可以实现预期的行为,因此操作将在第一次单击 Connect
按钮时开始,如果连接丢失,则无需用户交互即可重新连接。
你基本上想要的是:
有a bug in Android regarding connecting to a device after BluetoothAdapter
being switched on如果由于适配器关闭而发生断开连接,则需要先扫描设备来解决这个问题。在这种情况下,我们将只完成一部分流程并从头开始重复。
Observable<Boolean> canUseBleObservable = canUseBle();
subscription = scanSingleDevice() // first scan the device
.flatMapObservable(this::connectAndDoStuff) // when scanned connect and do your stuff
.takeUntil(canUseBleObservable.takeFirst(isReady -> !isReady)) // if the BLE will be not ready (off) then unsubscribe from scanning and connecting
.delaySubscription(canUseBleObservable.takeFirst(isReady -> isReady)) // delay subscription to scanning and connecting till BLE is ready (subscribing goes from bottom to top)
.retry() // if scan will emit an error (connection should not as it has `.retry()`) just resubscribe to the upstream
.repeatWhen(observable -> observable) // if the upstream will complete (due to `.takeUntil()` as `connectAndDoStuff` does not complete on it's own)—resubscribe to the upstream
.subscribe(
aVoid -> { /* consume */ } // `aVoid` should be changed to your model/events emitted by `.connectAndDoStuff`
// throwable -> { } => should not happen since there is `retry()` in the upstream
);
其他构建 block 可能如下所示:
private Observable<Boolean> canUseBle() {
return rxBleClient.observeStateChanges()
.share() // share observing state changes
.startWith(Observable.fromCallable(() -> rxBleClient.getState())) // on each subscription emit the current state
.map(state -> state == RxBleClient.State.READY); // map to `true` when ready
}
private Single<RxBleDevice> scanSingleDevice() {
return rxBleClient.scanBleDevices( // scan the device
new ScanSettings.Builder().build(),
new ScanFilter.Builder().setDeviceName("mydevice").build()
)
.map(ScanResult::getBleDevice)
.take(1) // after the first device being scanned stop the scan
.toSingle();
}
private Observable<Void> connectAndDoStuff(RxBleDevice rxBleDevice) {
return rxBleDevice.establishConnection(false)
.flatMap(rxBleConnection -> {
// do your stuff
return Observable.<Void>empty();
})
.repeat(); // if any error (going out of range) will happen then resubscribe from `.establishConnection()`
}
这是对您的用例的简单分解。如果需要,可以使流程进一步复杂化。
关于android - RxAndroidBle - 自动连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47670741/
我正在尝试使用在 Android 手机和使用 Android Things 的 Raspberry Pi 上运行的 rxBleAndroid 与 BLE 数据记录器/传感器进行通信。 但是,我目前遇到
我说英语有点抱歉。我需要你的帮助,因为我投入了很多时间,但我无法完成最后一个细节:_( 我必须将带有蓝牙 LE 的手机连接到继电器,才能打开或关闭门。提供原生蓝牙和 socket ,但没有办法做任何有
我是 RxJava 的新手。我现在尝试 RxAndroidBle 并将其与 BLE 的 Android API 实现进行比较。我的外围设备一次发送大量通知(512b block 中大约 30kB)。在
我正在使用 RxAndroidBle 库: 此代码按预期正常工作,单击 UI 上的“连接”按钮后,它建立了连接。 当我想要在设备返回范围内时自动连接到设备时出现问题。我不想再次点击“连接”按钮。 是否
我正在使用很棒的 rxandroidble 库进行 BLE 控制。 我保持 Activity 之间的联系。在开始扫描之前,我想先断开所有连接的设备。如果有很多连接,有时它不起作用。这是我正在使用的解决
我正在连接到一个已发现的设备并定期读取 RSSI。我需要确切知道连接何时丢失。有什么方法可以指定连接超时,之后我将收到 RxBleConnectionState.DISCONNECTED?现在,即使连
我正在使用 Polidea's RxAndroidBle library与我的 Android 应用程序中的设备通信。 我是响应式编程的新手,所以我无法弄清楚如何执行以下操作: 在一个特征(特征 A)
我需要帮助。当我使用 rxandroidble 时如何设置扫描超时,例如 10 秒。 scanDisposable = rxBleClient.scanBleDevices(
我目前正在尝试使用 rxandroidble 来替换我们其中一款应用的 Android 原生 BLE API。 如何禁用通知?我可以使用示例代码启用它,这个: device.establishConn
我是 Rx 编程的新手。我现在正在尝试使用 RxAndroidBle 来发现 BLE 设备的服务并从设备中读取一些特征。 我可以用 device.establishConnection(false)
我正在连接的 BLE 设备在其 GATT 特征之一上发出字节以响应对特征的写入。客户端应该启用该特征的通知,并解释该特征的更改字节。 (我正在控制的行为是打开附近无线网络的扫描服务,然后监听服务输出。
我在设置多个特征的通知时遇到问题。我查看了文档,发现许多示例仅涵盖非常细化的情况。 我的用例如下:1.扫描设备2. 用户选择要连接的设备(连接持续到应用程序关闭)3.订阅多种特性的通知4. 一次读/写
我正在尝试使用 RxAndroidBle 设置通知,但是当与外围设备的连接丢失时,我需要重新创建我设置的通知。我正在创建这样的通知: connectionObservable
我目前正在开发一个 xplattform Android/iOS 应用程序并评估使用 RxBluetoothKit 的 iOS 设备是否可以与运行 RxAndroidBle 的 Android 设备通
我目前正在使用 RxAndroidBle 将固件写入蓝牙设备。它的工作方式我必须将数据 block (每 block 580 字节)发送到一个 WRITE_CHARACTERISTIC_UUID 上的
我想知道 RxAndroidBle 库使用哪种策略来写确认:WRITE_TYPE_DEFAULT或 WRITE_TYPE_NO_RESPONSE ? 此外,如果我想设置(或查询)这个设置,在 RxAn
我正在尝试实现这个写入/通知处理示例 (Using RxAndroidBle, how do I subscribe to responses from writing to a characteri
在我的应用程序中,我使用的是 RxAndroidBLE 库。感谢很棒的图书馆。但我有一些问题。我正在尝试使用 连接到 BLE 设备 rxBleDevice.establishConnection(fa
当我未连接到我的设备时,我需要永久扫描ble广告以找到它并知道何时连接到它(特定产品)。此扫描是在前台服务中实现的,以匹配 8.0 的先决条件。 为了节省电量,我想定期扫描(同时遵守 Android
我正在使用 rxandroidble 使用 autoconnect = true 来持续监控来自传感器的数据。该应用会持续扫描它之前连接过的传感器。 即使手机未连接电源,传感器的数据监控和扫描也应持续
我是一名优秀的程序员,十分优秀!