2017-12-05 21 views
0

BLE 혈압 장치에서 데이터를 가져 오려고합니다. 문서는 기기가 연결될 때마다 날짜/시간을 동기화해야한다고 말합니다. 코드 :BLE 장치 writeCharacteristic 실패

interactionSub = Observable.concat( 
     deviceConnection 
       .writeCharacteristic(ReactiveBluetoothHelpers.DATE_TIME_CHARACTERISTIC_UUID, testDateTime) 
       .doOnSubscribe(() -> Log.d(TAG, "doOnSubscribe called inside writeCharacteristic!")) 
       .doOnError(Error -> Log.e(TAG, "doOnError called inside writeCharacteristic. " + Error.getMessage())) 
       .doOnNext(bytes -> Log.d(TAG, "doOnNext called inside writeCharacteristic.")) 
       .delay(500L, TimeUnit.MILLISECONDS) 
       .ignoreElements(), 
     deviceConnection 
       .setupIndication(ReactiveBluetoothHelpers.BLOOD_PRESSURE_MEASUREMENT_UUID) 
       .doOnNext(indicationObservable -> { 
        Log.d(TAG, "Blood Pressure measurement indication has been set up."); 
       }) 
       .flatMap(indicationObservable -> indicationObservable) // 
) // end of concat 
     .subscribe(
       this::handleBpMeasurement, 
       this::handleBpMeasurementError 
     ); 

장치가 연결 및 가입되어 있지만 특성을 작성하는 시도가 오류가 발생합니다. BleDisconnectedException에서 오는 오류 메시지는 설명없이 "F4 : 5E : AB : 10 : DF : 5C"에서 단절된 것입니다.

이 오류의 출처를 알 수 없습니다. 작성하려는 테스트 날짜/시간에는 연도 (16 비트 리틀 엔디안) 및 기타 1 바이트 수량에 유효한 값이 있습니다.

일반적인 로그 시퀀스는 : 당신이 로그에서 볼 수 있듯이

12-04 15:47:46.617 16544-16612/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: QUEUED ConnectOperation(13884208) 
12-04 15:47:46.618 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: unregisterApp() - mClientIf=8 
12-04 15:47:46.621 16544-16565/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: FINISHED DisconnectOperation(252854751) 
12-04 15:47:46.624 16544-16565/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: STARTED ConnectOperation(13884208) 
12-04 15:47:46.630 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: connect() - device: F4:5E:AB:10:DF:5C, auto: false 
12-04 15:47:46.630 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: registerApp() 
12-04 15:47:46.630 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: registerApp() - UUID=91617ce4-e91f-4117-acd4-95a1b2acbf29 
12-04 15:47:46.633 16544-16575/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8 
12-04 15:47:47.042 16544-16575/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=8 device=F4:5E:AB:10:DF:5C 
12-04 15:47:47.043 16544-16575/com.calderadev.truecareccm.truecareservice D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0 
12-04 15:47:47.044 16544-16575/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: onClientConnectionState() - status=62 clientIf=8 device=F4:5E:AB:10:DF:5C 
12-04 15:47:47.044 16544-16575/com.calderadev.truecareccm.truecareservice D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=62 
12-04 15:47:47.045 16544-16575/com.calderadev.truecareccm.truecareservice I/RxBle#ConnectionOperationQueue: Connection operations queue to be terminated (F4:5E:AB:10:DF:5C) 
12-04 15:47:47.047 16544-16565/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(13884208) 
12-04 15:47:47.054 16544-16612/com.calderadev.truecareccm.truecareservice D/BPMonitor: We have connected to A&D_UA-651BLE_10DF5C with MAC F4:5E:AB:10:DF:5C 
12-04 15:47:47.062 16544-16611/com.calderadev.truecareccm.truecareservice D/RxBle#Executors$RunnableAdapter: Terminated. 
12-04 15:47:47.083 16544-16612/com.calderadev.truecareccm.truecareservice D/BPMonitor: doOnSubscribe called inside writeCharacteristic! 
12-04 15:47:47.100 16544-16612/com.calderadev.truecareccm.truecareservice E/BPMonitor: doOnError called inside writeCharacteristic. Disconnected from F4:5E:AB:10:DF:5C 
12-04 15:47:47.118 16544-16612/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: QUEUED DisconnectOperation(246198672) 
12-04 15:47:47.120 16544-16565/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: STARTED DisconnectOperation(246198672) 
12-04 15:47:47.121 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothManager: getConnectionState() 
12-04 15:47:47.121 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothManager: getConnectedDevices 
12-04 15:47:47.125 16544-16612/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: QUEUED ConnectOperation(589767105) 
12-04 15:47:47.125 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: close() 
12-04 15:47:47.127 16544-16571/com.calderadev.truecareccm.truecareservice D/BluetoothGatt: unregisterApp() - mClientIf=8 
12-04 15:47:47.131 16544-16565/com.calderadev.truecareccm.truecareservice D/RxBle#ClientOperationQueue: FINISHED DisconnectOperation(246198672) 

답변

0

onConnectionStateChange()0x3E에 해당 status=62 호출합니다. Android Sources 점 :

#define GATT_CONN_FAIL_ESTABLISH HCI_ERR_CONN_FAILED_ESTABLISHMENT /* 0x03E connection fail to establish */ 

그래서이보고되고 있지만 첫 번째 연결로 연결이 정말 OS의 하위 계층에 설정되지 않은 것 같습니다 :

12-04 15:47:47.043 16544-16575/com.calderadev.truecareccm.truecareservice D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0 
12-04 15:47:47.044 16544-16575/com.calderadev.truecareccm.truecareservice D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=62 
+0

가 재미있는, 그러나 나는 무엇을 할 수 그것에 대해? 휴대 전화의 BLE 스택에 오류가 발생했을 가능성이 있습니까? 필자는 적어도'setupIndication()'이 작동하는 것을 허용하는 코드의 이전 버전 ('Observable.concat()'이 없다)을 가지고있다. 주변기기는 앞의 측정에서 캐싱 된 잘못된 데이터를보고한다. 'writeCharacteristic()'로 장치의 내부 시계를 설정하려는 시도가 실패하면. 따라서 이전 버전에서는'writeCharacteristic()'이 작동하지 않지만 적어도 연결이 끊어지지는 않습니다. 어쩌면'concat()'를'concatDelayError()'로 대체 할 것입니다. –

+0

'휴대 전화의 BLE 스택에 오류가 발생했을 가능성이 있습니까? '분명히 Android BLE API보다 낮은 수준에서 진행되고 있습니다. 현재 특성 쓰기는 실행되지 않습니다. 나는 당신이 도움을 줄 수있는 응용 프로그램 측면에서 할 수있는 일이 있는지 의심 스럽다. 흥미로운 것이 있으면 HCI 로그를 확인할 수 있습니다. 주변 장치가 고장 났을 수도 있습니다. HCI 로그 또는 스니퍼 로그에서 더 많이 알 수 있습니다. –

+0

이것은'writeCharacteristic()'에 의해 장치에 잘못된 값을 쓰는 것으로 설명 될 수 있습니까? 로깅은 Observable이 연결 해제되기 전에 잠시 구독되었음을 나타냅니다. –