Android 可写设备写特征故障

Android 可写设备写特征故障,android,rx-java,android-bluetooth,rxandroidble,Android,Rx Java,Android Bluetooth,Rxandroidble,试图从一个不稳定的血压装置获取数据。文档中说,每次连接设备时都必须同步日期/时间。 代码: interactionSub = Observable.concat( deviceConnection .writeCharacteristic( ReactiveBluetoothHelpers.DATE_TIME_CHARACTERISTIC_UUID, testDateTime ) .doOnSubscribe((

试图从一个不稳定的血压装置获取数据。文档中说,每次连接设备时都必须同步日期/时间。 代码:

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位little endian)和其他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)

正如您在日志中所看到的,调用
onConnectionStateChange()
时使用的
status=62
对应于
0x3E
。要点是:

#define GATT_CONN_FAIL_ESTABLISH    HCI_ERR_CONN_FAILED_ESTABLISHMENT /* 0x03E connection fail to establish  */
因此,似乎连接并没有真正建立在操作系统的较低层上,尽管它首先被报告为已连接:

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

很有趣,但我能做些什么呢?这是否可能是手机的BLE堆栈出现故障?我有一个早期版本的代码(没有
Observable.concat()
),它至少允许
setupIndication()
工作,尽管外围设备随后会报告错误的数据,似乎是从早期的测量中缓存的,如果尝试使用
writeCharacteristic()设置设备的内部时钟,这是意料之中的
失败。因此,在早期版本中,
writeCharacteristic()
不起作用,但至少不会导致连接中断。也许我会用
concatDelayError()
替换
concat()
这可能是手机的BLE堆栈中的一个故障吗?
肯定比Android BLE API级别低。目前,甚至没有执行特征写入。我怀疑你能从应用方面做些什么来帮助我。如果HCI日志包含任何有趣的内容,您可以查看它们。也可能是您的外围设备现在出现故障。HCI日志或嗅探器日志可以说明更多信息。这是否可以通过
writeCharacteristic()
向设备写入非法值来解释,从而导致设备立即断开连接?日志记录表明,在断开连接之前,已短暂订阅了Observable。否。正如您在日志中看到的,绝对没有迹象表明执行了特征写入。我不知道该说什么,但当我使用正确的特征UUID和正确格式化的数据时,它工作了。我猜如果你有错误的UUID,那么它就不会执行了?(我试图编写标准的日期/时间特征,但发现出于某种原因,该设备为此提供了自定义服务。)