写特征后的GATT内部错误

时间:2015-04-13 14:55:08

标签: android bluetooth-lowenergy android-bluetooth

我一直在尝试使用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}枚举对应{"请求存储记录","所有记录"}。

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设备接收新记录,因此希望错误与设备无关。

1 个答案:

答案 0 :(得分:2)

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