RxAndroidBleを使用して予期せぬ動作を把握するのが難しいです。RxBleConnection.setupNotificationは、2つの特性のうちの最初のものに対してのみ機能します。
短い形式の問題は、特定のデバイスの2つの特性から順序どおりの通知を受け取る必要があることです。以下の私の例では、私はSERVICE_UUIDをスキャンし、CHARACTERISTIC_FOO_UUIDとCHARACTERISTIC_BAR_UUIDのために通知を(順番に)出します。私は両方の特性からの応答に基づいて何かをする必要があります---私の例では、私は単純にメンバ変数にbyte []を格納します。
私が持っている問題は、最初の特性が2番目ではないことを報告しているということです。私が注文を裏返すと、チェーンの最初の特徴はまだ残っています。以下のように、デバッグ出力を表示します。これは、低レベルのディスクリプタ書き込みを含む通知呼び出しが両方に対して発生することを示しますが、何らかの理由で2番目の記述が報告されません。 (Observableを購読していると仮定してください)
私はこれをRxAndroidBleなしで動作させることができました。私はまた、動作するRxAndroidBleを採用した1つのバージョンを持っていますが、ConnectionSharingAdapterといくつかのサブスクリプションを使用して別の方法でセットアップされています。以下の例は、よりクリーンなアプローチの試みですが、私が言ったように、動作していないようです。
rxBleClient.scanBleDevices(SERVICE_UUID)
.first()
.flatMap(rxBleScanResult -> {
return Observable.just(rxBleScanResult.getBleDevice());
})
.flatMap(rxBleDevice -> {
return rxBleDevice.establishConnection(context, IS_AUTO_CONNECT);
})
.flatMap(rxBleConnection ->
rxBleConnection.setupNotification(CHARACTERISTIC_FOO_UUID)
.flatMap(observable -> observable)
.flatMap(new Func1<byte[], Observable<RxBleConnection>>() {
@Override
public Observable<RxBleConnection> call(final byte[] notificationBytes) {
mFooBytes = notificationBytes;
return Observable.just(rxBleConnection);
}
})
)
.flatMap(rxBleConnection ->
rxBleConnection.setupNotification(CHARACTERISTIC_BAR_UUID)
.flatMap(observable -> observable)
.flatMap(new Func1<byte[], Observable<RxBleConnection>>() {
@Override
public Observable<RxBleConnection> call(final byte[] notificationBytes) {
mBarBytes = notificationBytes;
return Observable.just(rxBleConnection);
}
})
)
は、ここで私は、出力の「CHARACTERISTIC_FOO_UUID」と実際のUUIDを編集さ--- RxBleデバッグ出力です。
12-22 12:13:43.322 12074-12074/com.foo.example D/RxBle#Radio: QUEUED RxBleRadioOperationScan(217963087)
12-22 12:13:43.322 12074-12281/com.foo.example D/RxBle#Radio: STARTED RxBleRadioOperationScan(217963087)
12-22 12:13:43.412 12074-12281/com.foo.example D/RxBle#Radio: FINISHED RxBleRadioOperationScan(217963087)
12-22 12:13:43.682 12074-12074/com.foo.example D/RxBle#Radio: QUEUED RxBleRadioOperationConnect(37012551)
12-22 12:13:43.682 12074-12281/com.foo.example D/RxBle#Radio: STARTED RxBleRadioOperationConnect(37012551)
12-22 12:13:44.052 12074-12085/com.foo.example D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0
12-22 12:13:44.092 12074-12558/com.foo.example D/RxBle#Radio: QUEUED RxBleRadioOperationServicesDiscover(72789039)
12-22 12:13:44.092 12074-12281/com.foo.example D/RxBle#Radio: FINISHED RxBleRadioOperationConnect(37012551)
12-22 12:13:44.092 12074-12281/com.foo.example D/RxBle#Radio: STARTED RxBleRadioOperationServicesDiscover(72789039)
12-22 12:13:45.232 12074-12086/com.foo.example D/RxBle#BluetoothGatt: onServicesDiscovered status=0
12-22 12:13:45.262 12074-12558/com.foo.example D/RxBle#Radio: QUEUED RxBleRadioOperationDescriptorWrite(8700606)
12-22 12:13:45.262 12074-12281/com.foo.example D/RxBle#Radio: FINISHED RxBleRadioOperationServicesDiscover(72789039)
12-22 12:13:45.262 12074-12281/com.foo.example D/RxBle#Radio: STARTED RxBleRadioOperationDescriptorWrite(8700606)
12-22 12:13:45.342 12074-12085/com.foo.example D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
12-22 12:13:45.362 12074-12281/com.foo.example D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(8700606)
12-22 12:13:46.172 12074-12086/com.foo.example D/RxBle#BluetoothGatt: onCharacteristicChanged characteristic=CHARACTERISTIC_FOO_UUID
12-22 12:13:46.192 12074-12558/com.foo.example D/RxBle#Radio: QUEUED RxBleRadioOperationDescriptorWrite(179103302)
12-22 12:13:46.192 12074-12281/com.foo.example D/RxBle#Radio: STARTED RxBleRadioOperationDescriptorWrite(179103302)
12-22 12:13:46.272 12074-12201/com.foo.example D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
12-22 12:13:46.272 12074-12281/com.foo.example D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(179103302)
以下は、複数のサブスクリプションとConnectionSharingAdapterを使用するRxAndroidBleを使用したバージョンの簡略化した例です。両方のバージョンでObservableは他の場所に登録されますので、私は複数のサブスクリプションのすべての簿記を避けようとしています---ここのCompositeSubscriptionと他のサブスクリプション。問題を抱えている上記のアプローチは、より機能的に見えます。私の実際のアプリケーションでは、私がやっていることはもっと複雑なので、上記のバージョンは実際にはより簡単になります。この単純化されたバージョンでは、もう少しコードのように見えるかもしれません。
CompositeSubscription bleConnectionSubscriptions = new CompositeSubscription();
Observable<RxBleConnection> bleConnectionObservable =
bleConnectionObservable = bleDevice.establishConnection(context, IS_AUTO_CONNECT)
.compose(new ConnectionSharingAdapter());
Subscription subscription =
bleConnectionObservable
.flatMap(rxBleConnection ->
rxBleConnection.setupNotification(CHARACTERISTIC_FOO_INGREDIENTS))
.flatMap(observable -> observable)
.subscribe(notificationBytes -> mFooBytes = notificationBytes);
bleConnectionSubscriptions.add(subscription);
subscription =
bleConnectionObservable
.flatMap(rxBleConnection ->
rxBleConnection.setupNotification(CHARACTERISTIC_BAR_INGREDIENTS))
.flatMap(observable -> observable)
.subscribe(notificationBytes -> mBarBytes = notificationBytes);
bleConnectionSubscriptions.add(subscription);
あなたのコードは動作するはずです(これはおそらく、複数の値がFOOから通知された場合に誤動作を開始しますけれども最初の通知は配信されますが、2番目の通知はどこにも表示されません。ペーストした後にBLEログがありますか?同時に別のデバイスに別のBLE接続がありますか? (特徴的な通知のAndroid OSの制限が接続間で共有されているかどうかわからない) –
@s_noopyありがとう。 FOO uuidからの通知は1つだけなので、安全であるべきですが、潜在的な問題を指摘してくれてありがとう。ログについては、貼り付けたものはすべて報告されています。コネクションを単独のままにしておくと、接続が自動的に切断されると、しばらくしてから追加のログが生成されます。 –
あなたのデバイスは、BAR特性に関する通知をまったく送信していないようです。通知が設定される前にBAR特性値が変更される可能性があります。 –