2017-12-05 7 views
0

Der Versuch, Daten von einem BLE-Blutdruckmessgerät zu erhalten. Dokumente sagen, dass das Datum/die Zeit jedes Mal synchronisiert werden muss, wenn das Gerät verbunden ist. Code:BLE-Gerät writeCharacteristic failing

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 
     ); 

Das Gerät verbindet und abonniert ist, sondern der Versuch, das Merkmal zu schreiben einen Fehler verursacht. Die Fehlermeldung von der BleDisconnectedException ist nur "Disconnected from F4: 5E: AB: 10: DF: 5C" ohne Erklärung.

Ich kann mir nicht vorstellen, woher dieser Fehler kommt. Das Testdatum/die Testzeit, die ich versuche zu schreiben, hat gültige Werte für das Jahr (16-Bit Little-Endian) und die anderen 1-Byte-Mengen.

Typische Protokollfolge:

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) 

Antwort

0

Wie Sie in den Protokollen sehen kann, ist die onConnectionStateChange() mit status=62 genannt, die 0x3E entspricht. Die Android Sources Punkt:

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

So scheint es, dass die Verbindung nicht wirklich auf den unteren Schichten des OS aufgebaut ist, obwohl es zunächst als verbunden gemeldet:

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

Interessant, aber was kann ich tun darüber? Ist es wahrscheinlich ein Fehler im BLE-Stack des Telefons? Ich habe eine frühere Version des Codes (ohne die 'Observable.concat()'), die mindestens 'setupIndication()' funktioniert, obwohl das Peripheriegerät dann falsche Daten meldet, scheinbar von einer früheren Messung zwischengespeichert, was zu erwarten wäre wenn der Versuch fehlschlägt, die interne Uhr des Geräts mit 'writeCharacteristic()' zu setzen. In der früheren Version funktioniert 'writeCharacteristic()' nicht, führt aber zumindest nicht dazu, dass die Verbindung unterbrochen wird. Vielleicht werde ich 'concat()' durch 'concatDelayError()' ersetzen. –

+0

'Ist es wahrscheinlich ein Fehler im BLE-Stack des Telefons?' Definitiv etwas auf der unteren Ebene als Android BLE API. Momentan wird das Merkmal Schreiben nicht einmal ausgeführt. Ich bezweifle, dass Sie von der Anwendungsseite aus etwas tun können, um zu helfen. Sie könnten die HCI-Protokolle überprüfen, wenn sie etwas Interessantes enthalten. Es kann auch sein, dass Ihr Peripheriegerät jetzt versagt. HCI-Protokoll oder Sniffer-Protokolle könnten mehr erzählen. –

+0

Könnte dies erklärt werden, indem 'writeCharacteristic()' einen ungültigen Wert auf das Gerät schreibt, wodurch es sofort getrennt wird? Die Protokollierung zeigt an, dass das Observable vor dem Trennen kurz angemeldet wurde. –