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,那么它就不会执行了?(我试图编写标准的日期/时间特征,但发现出于某种原因,该设备为此提供了自定义服务。)