1

現在、RxAndroidBleを使用してファームウェアをBluetoothデバイスに書き込んでいます。それが動作する方法私は、1つのWRITE_CHARACTERISTIC_UUIDのBluetoothデバイスにチャンク(チャンクあたり580バイト)を送信してから、LISTEN_CHARACTERISTIC_UUIDの結果を聞いて、Bluetoothデバイスがチャンクを正常に確認したかどうかを確認する必要があります。RxAndroidBleで通知/書き込みオブザーバブルで通知されない場合があります

理想的には、私はので、私は、同様のスタックオーバーフローの質問(https://stackoverflow.com/a/41140523/734385)からこのコードを使用しています。この書き込みをしたいし、一回の操作であることをチェーンに通知:この問題は、これが唯一の最初の数回動作することである

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 
} 

その後、書き込み操作は成功しますが、通知されることはありません。 これが最後の数のチャンクのログで、それは停止する前に:あなたが最後に見ることができるように

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) 

は、私が最後に

onCharacteristicChanged characteristic=69af0004-f994-3a57-749b-0e0aad3fca18 

を得ることはありません。

注:書き込みデータはScheduler.io()スレッドで実行され、私は、最新のマスターを使用しています興味深いことに

(私は新しいLongWriteBuilderを必要として)私が開始した場合、ライブラリから(https://github.com/Polidea/RxAndroidBle/commit/37ecef5c270c792bcb9193f6dd76b8711642e0ff)をコミット他には何もしない「ダミー」通知があります。

上記の観察可能な作品と私はすべての通知を受け取ります。

私は通知の設定に何か間違っていると思っていますが、どこかに遅延がありません。

答えて

1

二つのものがあります。

  • の通知を受信することが保証されていません - 兆候が

  • あるAndroid OSを繰り返しオフとオン通知を設定することで失敗しているようだ - 判断ログからBluetoothGattCallback.onCharacteristicChanged()が呼び出されていないことを確認します。

潜在的な解決策は、最初のwriteData(byte[] _payload)の開始前に、セットアップに通知されるので、それがwriteData(byte[] _payload, Observable<byte[]> listenCharacteristicNotifications)ようになり_payloadObservable<byte[]>の両方を渡します。その後、通知をLISTEN_CHARACTERISTIC_UUIDに一度設定して、書き込みごとに使用することができます。

+1

毎回新しい通知を設定するのではなく、1つの通知のみを使用して通知しています。ありがとう – tiqz

関連する問題