【问题标题】:GATT internal error after writing characteristic写入特性后 GATT 内部错误
【发布时间】:2015-06-18 22:47:41
【问题描述】:

我一直在尝试使用Glucose service 从 BLE 设备读取葡萄糖测量记录。我能够成功连接到设备并在获取新记录时读取它们,但是当我请求以前记录的列表时,我收到状态为 129 的回调(“GATT_INTERNAL_ERROR”)。之后没有其他回调发生,最终传输超时。

据我了解,要检索记录,我需要向Record Access Control Point characteristic 发送请求。收到请求后,设备应通过吐出请求的记录来响应。

我的请求代码如下:

private void requestRecords() {
    byte[] requestValue = new byte[] {0x01, 0x01};
    racpCharacteristic.setValue(requestValue);
    bluetoothGatt.writeCharacteristic(racpCharacteristic);
}

其中 {0x01, 0x01} 枚举对应于 {"Request stored records", "All records"}。

setValue() 和 writeCharacteristic() 操作都返回 true,表示成功。然后,我的 BluetoothGattCallback 会收到 RACP 特性的 onCharacteristicWrite() 回调。但是,回调返回的状态是 129(内部错误)而不是预期的 0(成功)。

我认为我还需要启用 RACP 特性的指示(和/或测量特性的通知)才能接收记录。但是启用过程似乎可以正常工作,并且无论我使用哪种通知/指示组合(如果有),我都会收到相同的错误。所以我不认为错误是相关的,但为了完整起见,这里是通知/指示代码,它在记录请求代码之前运行:

private static final String DESCRIPTOR_UUID = "00002902-0000-1000-8000-00805f9b34fb";

...

private void enableNotifications(BluetoothGattCharacteristic char) {
    bluetoothGatt.setCharacteristicNotification(char, true);

    UUID uuid = UUID.fromString(DESCRIPTOR_UUID);
    BluetoothGattDescriptor descriptor = char.getDescriptor(uuid);

    boolean usesIndications = characteristicUsesIndications(char);
    descriptor.setValue(usesIndications ?
            BluetoothGattDescriptor.ENABLE_INDICATION_VALUE :
            BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

    bluetoothGatt.writeDescriptor(descriptor);
}

我确保在执行后续操作之前等待相应的 onDescriptorWrite() 回调。例如。 enableNotifications(measurementChar) -> onDescriptorWrite() -> enableNotifications(racpChar) -> onDescriptorWrite() -> requestRecords()

谁能帮我弄清楚出了什么问题?我不相信这是设备,因为我的 iOS 对应方能够成功检索记录。我知道有些手机不能很好地与 BLE 配合使用,所以为了记录,我正在使用三星 Galaxy S5 进行测试。如前所述,它能够从 BLE 设备接收新记录,因此希望该错误与设备无关。

【问题讨论】:

    标签: android bluetooth-lowenergy android-bluetooth


    【解决方案1】:

    在为适应症配置 RACP 之前,您必须为葡萄糖测量和葡萄糖测量上下文启用通知。一些血糖仪只允许启用 RACP 指示,但作为一般做法,您应该在写入记录访问控制点之前启用 (2) 测量通知和 (1) RACP 指示。

    【讨论】:

    • 如果血糖记录开始时没有此信息,那么可以想象,血糖仪报告的记录没有测量上下文,也没有启用那些“缺失”测量上下文消息的通知。即使是不随每个患者记录发送测量上下文的血糖仪也应该启用测量上下文以发送通知。然后,当您使用 RACP 发送记录请求时,将启用测量和上下文,它应该都能正常工作:)
    • 非常感谢,这正是我所缺少的。你把我从安卓蓝牙这个无休止的噩梦中拯救了出来。出于好奇,您能否向我指出表明此特性是必要的文档?我可以发誓我会仔细检查所有相关文件。
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多