Android BLE: onDescriptorWrite, onCharacteristicWrite, onCharacteristicRead ни один не вызывается, но другие обратные выJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Android BLE: onDescriptorWrite, onCharacteristicWrite, onCharacteristicRead ни один не вызывается, но другие обратные вы

Сообщение Anonymous »

Я пишу клиент Android, который подключается к пользовательскому серверу BLE (периферийному устройству), используя специальную службу и характеристики. Я подтвердил, что могу обмениваться данными с устройством с помощью приложения BLE Scanner для Android, а также подтвердил, что у меня есть правильные UUID для различных характеристик. Я написал код для записи в характеристику, доступную только для записи, и обратный вызов onCharacteristicWrite никогда не вызывается. Я также написал код для включения уведомлений о характеристике чтения/уведомления, включая обновление дескриптора CCC, чтобы указать, что уведомления включены, но ни обратный вызов onDescriptorWrite, onCharacteristicWrite или onCharacteristicChanged не вызывается. Я знаю, что BluetoothGattCallback правильно зарегистрирован, поскольку я получаю вызовы onConnectionStateChanged и onServicesDiscovered.
Этот код включает уведомления по заданной характеристике:

Код: Выделить всё

    public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
boolean enabled) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(CLASS_NAME, "BluetoothAdapter not initialized");
return;
}
// Check if this characteristic actually has NOTIFY property
if((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == 0 ) {
Log.e(CLASS_NAME, "Characteristic does not support notifications");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

// For characteristics that support it, write to the CCC descriptor
// that notifications are enabled.
if (enabled) {
if (TX_PERIPHERAL_TO_CENTRAL.equals(characteristic.getUuid())) {
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString(GattAttributes.TX_PERIPHERAL_TO_CENTRAL_CCC));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
if (!mBluetoothGatt.writeDescriptor(descriptor)) {
Log.d(CLASS_NAME, "Write to descriptor failed: "+TX_PERIPHERAL_TO_CENTRAL_CCC);
}
}
}
}
В журналах я вижу, что это вызывается и что вызов writeDescriptor() успешен. Однако ни onDescriptorWrite, ни onCharacteristicChanged никогда не вызываются.
Вот код обратных вызовов:

Код: Выделить всё

        @Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
Log.d(CLASS_NAME, "in onCharacteristicChange() characteristic = "+characteristic.getUuid());
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);
Log.d(CLASS_NAME, "in onDescriptorWrite() status = "+status+", descriptor = "+descriptor.getUuid());
Log.d(CLASS_NAME, "  descriptor value = "+descriptor.getValue());
}
Как видите, я должен был бы увидеть что-то в журналах, если бы был вызван любой из них.
Похожая проблема возникает с характеристическими записями. Вот код, который выполняет запись, но после этого onCharacteristicWrite никогда не вызывается:

Код: Выделить всё

    public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic, String data) {
boolean result = false;
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(CLASS_NAME, "BluetoothAdapter not initialized");
return false;
}
// Check if this characteristic actually has WRITE property
if((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0 ) {
Log.e(CLASS_NAME, "Characteristic is not writeable");
return false;
}
byte[] ascii = data.getBytes(StandardCharsets.US_ASCII);
if (characteristic.setValue(ascii)) {
result = mBluetoothGatt.writeCharacteristic(characteristic);
}
return result;
}
В этом случае writeCharacteristic() всегда возвращает false, несмотря на то, что я проверяю, является ли эта характеристика доступной для записи.
У меня также есть использовал BLE Scanner, чтобы убедиться, что характеристики, которые я использую, можно успешно записывать и читать с помощью уведомлений, так что, какова бы ни была проблема, она на моей стороне. И извините за беспорядочный код — он явно не завершен.

Подробнее здесь: https://stackoverflow.com/questions/725 ... cread-none
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»