首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通知有时在RxAndroidBle可观察的通知/写入中不被调用

通知有时在RxAndroidBle可观察的通知/写入中不被调用
EN

Stack Overflow用户
提问于 2017-02-23 08:10:39
回答 1查看 578关注 0票数 1

我目前正在使用RxAndroidBle编写一个固件到蓝牙设备。按照它的工作方式,我必须将数据块(每块580字节)发送到一个WRITE_CHARACTERISTIC_UUID上的蓝牙设备,然后在LISTEN_CHARACTERISTIC_UUID上侦听结果,以检查蓝牙设备是否成功地确认了该块。

理想情况下,我希望这个写和通知链是一个操作,所以我使用来自类似堆栈溢出问题(https://stackoverflow.com/a/41140523/734385)的代码:

代码语言:javascript
复制
private byte[] writeData(byte[] _payload) {
    return mBleConnection
            .flatMap( // when the connection is available...
                    rxBleConnection -> rxBleConnection.setupNotification(LISTEN_UUID), // ... setup the notification...
                    (rxBleConnection, apScanDataNotificationObservable) -> Observable.combineLatest( // ... when the notification is setup...
                            rxBleConnection.createNewLongWriteBuilder().setBytes(_payload).setCharacteristicUuid(WRITE_UUID).setMaxBatchSize(20).build(),
                            apScanDataNotificationObservable.first(), // ... and observe for the first notification on the AP_SCAN_DATA
                            (writtenBytes, responseBytes) -> responseBytes // ... when both will appear return just the response bytes...
                    )
            )
            .flatMap(observable -> observable) // ... flatMap the result as it is Observable<byte[]>...
            .toBlocking()
            .first(); // ... and finish after first response is received to cleanup notifications
}

问题是,这只工作了前几次,然后写操作成功,但我从来没有得到通知。这是在停止之前的最后几块日志:

代码语言:javascript
复制
02-23 08:46:33.765 2864-5256/com.company.android.ble I/BLE_FW_WRITE: [FW_CHUNK_24] starting
02-23 08:46:33.772 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(182789785)
02-23 08:46:33.772 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(182789785)
02-23 08:46:33.773 2864-5256/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: true
02-23 08:46:33.777 2864-5256/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(22527736)
02-23 08:46:33.910 2864-2888/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:33.912 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(182789785)
02-23 08:46:33.912 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(22527736)
02-23 08:46:34.055 2864-3032/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:34.059 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationCharacteristicLongWrite(71420405)
02-23 08:46:34.063 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(22527736)
02-23 08:46:34.063 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationCharacteristicLongWrite(71420405)
02-23 08:46:34.067 2864-3093/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
<more onCharacteristicWrites here, but omitted due to max post length>
02-23 08:46:34.204 2864-3032/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
02-23 08:46:34.207 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicLongWrite(71420405)
02-23 08:46:35.041 2864-3093/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicChanged characteristic=69af0004-f994-3a57-749b-0e0aad3fca18
02-23 08:46:35.044 2864-5256/com.company.android.ble I/BLE_FW_WRITE: [FW_CHUNK_25] starting
02-23 08:46:35.044 2864-4250/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: false
02-23 08:46:35.048 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(183984640)
02-23 08:46:35.049 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(183984640)
02-23 08:46:35.053 2864-5256/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: true
02-23 08:46:35.060 2864-5256/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(71847163)
02-23 08:46:35.185 2864-3073/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:35.188 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(183984640)
02-23 08:46:35.189 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(71847163)
02-23 08:46:35.276 2864-2887/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:35.281 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationCharacteristicLongWrite(66222734)
02-23 08:46:35.283 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(71847163)
02-23 08:46:35.283 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationCharacteristicLongWrite(66222734)
02-23 08:46:35.287 2864-3032/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
<more onCharacteristicWrites here, but omitted due to max post length>
02-23 08:46:35.441 2864-3032/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
02-23 08:46:35.447 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicLongWrite(66222734)
02-23 08:46:36.298 2864-2975/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicChanged characteristic=69af0004-f994-3a57-749b-0e0aad3fca18
02-23 08:46:36.301 2864-4250/com.company.android.ble I/BLE_FW_WRITE: combine data for FW_CHUNK_25
02-23 08:46:36.303 2864-4250/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: false
02-23 08:46:36.303 2864-5256/com.company.android.ble D/SFlashRawWrite: msg length (total): 20, payload length: 3
02-23 08:46:36.303 2864-5256/com.company.android.ble D/SFlashRawWrite: msgId: -128
02-23 08:46:36.304 2864-5256/com.company.android.ble D/SFlashRawWrite: acked msg: 17 result: 1
02-23 08:46:36.304 2864-5256/com.company.android.ble I/BLE_TIMING: chunk 25 took 1260 ms
02-23 08:46:36.304 2864-5256/com.company.android.ble I/BLE_FW_WRITE: [FW_CHUNK_26] starting
02-23 08:46:36.313 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(248228237)
02-23 08:46:36.317 2864-5256/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: true
02-23 08:46:36.319 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(248228237)
02-23 08:46:36.321 2864-5256/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(164719036)
02-23 08:46:36.452 2864-2888/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:36.455 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(248228237)
02-23 08:46:36.456 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(164719036)
02-23 08:46:36.602 2864-3032/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:36.616 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationCharacteristicLongWrite(227542569)
02-23 08:46:36.623 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(164719036)
02-23 08:46:36.624 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationCharacteristicLongWrite(227542569)
02-23 08:46:36.632 2864-2975/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
<more onCharacteristicWrites here, but omitted due to max post length>
02-23 08:46:36.897 2864-2975/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
02-23 08:46:36.902 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicLongWrite(227542569)
02-23 08:46:37.563 2864-3093/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicChanged characteristic=69af0004-f994-3a57-749b-0e0aad3fca18
02-23 08:46:37.566 2864-5256/com.company.android.ble I/BLE_FW_WRITE: [FW_CHUNK_27] starting
02-23 08:46:37.567 2864-4250/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: false
02-23 08:46:37.569 2864-5256/com.company.android.ble D/BluetoothGatt: setCharacteristicNotification() - uuid: 69af0004-f994-3a57-749b-0e0aad3fca18 enable: true
02-23 08:46:37.572 2864-5256/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(150502697)
02-23 08:46:37.573 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(150502697)
02-23 08:46:37.574 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(128172508)
02-23 08:46:37.711 2864-2888/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:37.715 2864-4250/com.company.android.ble D/RxBle#Radio:   QUEUED RxBleRadioOperationCharacteristicLongWrite(58981097)
02-23 08:46:37.730 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(150502697)
02-23 08:46:37.730 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(128172508)
02-23 08:46:37.871 2864-3093/com.company.android.ble D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
02-23 08:46:37.876 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(128172508)
02-23 08:46:37.879 2864-3150/com.company.android.ble D/RxBle#Radio:  STARTED RxBleRadioOperationCharacteristicLongWrite(58981097)
02-23 08:46:37.891 2864-3073/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
<more onCharacteristicWrites here, but omitted due to max post length>
02-23 08:46:38.126 2864-3073/com.company.android.ble D/RxBle#BluetoothGatt: onCharacteristicWrite characteristic=69af0003-f994-3a57-749b-0e0aad3fca18 status=0
02-23 08:46:38.128 2864-3150/com.company.android.ble D/RxBle#Radio: FINISHED RxBleRadioOperationCharacteristicLongWrite(58981097)

正如你所看到的,在最后我没有得到

代码语言:javascript
复制
onCharacteristicChanged characteristic=69af0004-f994-3a57-749b-0e0aad3fca18

在最后。

注意: writeData在Scheduler.io()线程中运行,I正在使用库中的最新主提交(https://github.com/Polidea/RxAndroidBle/commit/37ecef5c270c792bcb9193f6dd76b8711642e0ff) (因为我需要新的LongWriteBuilder)

有趣的是,如果我启动了一个额外的“虚拟”通知,可以观察到它什么也不做:

代码语言:javascript
复制
mBleConnection
            .flatMap(rxBleConnection -> rxBleConnection.setupNotification(LISTEN_UUID))
            .flatMap(notificationObservable -> notificationObservable)
            .subscribe(Actions.empty(), Actions.empty())

以上可观察到的作品,我收到每一个通知。

我怀疑我在设置通知时做错了什么,或者我在某个地方错过了一个延迟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-23 09:59:43

有两件事:

  • 不能保证收到通知-指示是
  • 从没有调用BluetoothGattCallback.onCharacteristicChanged()的日志上判断,安卓操作系统似乎无法反复设置通知。

潜在的解决方案是在第一个writeData(byte[] _payload)开始之前设置通知,并同时传递_payloadObservable<byte[]>,这样看起来就像writeData(byte[] _payload, Observable<byte[]> listenCharacteristicNotifications)。然后,您可以在LISTEN_CHARACTERISTIC_UUID上设置一次通知,并将其用于每次写入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42410228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档