RxAndroidBle을 사용하여 예기치 않은 동작을 파악하는 데 어려움이 있습니다.RxBleConnection.setupNotification 두 특성 중 첫 번째에만 적용됩니다.
짧은 형식의 문제는 특정 장치의 두 가지 특성에서 순서에 따른 알림을 받아야한다는 것입니다. 아래 예제에서 SERVICE_UUID를 검색하고 CHARACTERISTIC_FOO_UUID 및 CHARACTERISTIC_BAR_UUID에 대한 알림을 설정합니다 (순서대로). 두 특성의 응답을 기반으로 무언가를 수행해야합니다. 예를 들어, 단순히 멤버 변수에 byte []를 저장합니다.
내가 겪고있는 문제는 첫 번째 특성이 두 번째가 아니라 첫 번째 특성을보고한다는 것입니다. 내가 주문을 뒤집 으면 체인의 첫 번째 특성이 여전히 남아 있습니다. 아래, 나는 낮은 수준의 설명자 쓰기를 포함하여 두 가지 모두에 대해 알림 호출이 발생했음을 보여주는 디버그 출력을 표시하지만 두 번째 이유는 다시보고하지 않습니다. (Observable에 가입한다고 가정하십시오.)
RxAndroidBle 없이도이 기능을 사용할 수있었습니다. 나는 또한 RxAndroidBle을 사용하는 하나의 버전을 가지고 있지만, 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)
다음은 RxAndroidBle을 사용하여 작동하지만 여러 구독 및 ConnectionSharingAdapter를 사용하는 버전의 간단한 예입니다. 두 버전 모두 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);
귀하의 코드 (작동합니다 특성) 로그에서 판단하여 첫 번째 알림은 전달되지만 두 번째 알림은 어디에도 표시되지 않습니다. 붙여 넣은 후 BLE 로그가 있습니까? 다른 장치에 동시에 다른 BLE 연결이 있습니까? (안드로이드 OS 제한 특성 통지에 대한 연결간에 공유되어 있는지 모르겠다) –
@s_noopy 감사합니다. FOO uuid로부터 한 통의 통보 만있을 것이므로 나는 안전해야하지만, 잠재적 인 문제를 지적 해 주셔서 감사합니다. 로그에 관해서, 내가 붙여 넣은 것은 모든 것이보고되었습니다. 만약 연결을 혼자두면 연결이 자동으로 끊어지면서 잠시 후 추가 로그가 생성됩니다. –
기기가 BAR 특성에 대한 알림을 전혀 보내지 않은 것으로 보입니다. 통지가 설정되기 전에 BAR 특성 값이 변경 될 수 있습니다. –