Как исправить «отсутствие ответа от характеристики записи в файле Bluetooth»?

#android #bluetooth-lowenergy

#Android #bluetooth-низкое энергопотребление

Вопрос:

Я изучаю Bluetooth le на Android и столкнулся с проблемой невозможности получить ответ от характеристики записи. Аппаратное обеспечение, которое я использую, — это HM-10, у которого есть сервис и характеристика, на которые я могу записывать — что-то, что, я уверен, относится к написанному мной коду.

Я следил за статьей о разработчике Android для настройки Bluetooth gatt. Обратный вызов содержит onDescriptorRead / Write, onCharacteristicRead / Write, onServicesDiscovered, onCharacteristicChanged, включая широковещательный приемник для обновления информации от службы к действию. Я также пытался подключить HM-10 к своему компьютеру и использую RealTerm для отправки данных из моего приложения для телефона. Я подтверждаю, что данные, которые я отправляю, проходят. Но при отправке данных с компьютера через HM-10 я не получаю никакой информации из своего приложения для телефона. (на onCharacteristicChanged или onCharacteristicRead) Перед отправкой я изменяю настройку уведомления на характеристике на включенную.

Дескриптор — CCCD (0x2902) Характеристика является пользовательской, которая, согласно документации, обрабатывает ЧТЕНИЕ, ЗАПИСЬ, УВЕДОМЛЕНИЕ. Честно говоря, я не знаю, как проверить это в коде.

Команда для отправки характеристике.

 if (characteristic.equals("0000ffe1-0000-1000-8000-00805f9b34fb")) {
  characteristic.setValue("AT CSQ?");
}
bluetoothGatt.writeCharacteristic(characteristic);

  

Обратный вызов для записи

 @Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
Log.w(TAG, "successfully wrote characteristic");

broadcastWrite(ACTION_WRITE_AVAILABLE, characteristic);
}
}
  

Обратный вызов для характеристики чтения

 @Override
// Result of a characteristic read operation
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);

}
}
  

обратный вызов для характеристики изменен

 @Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
Log.w(TAG, "successfully received new characteristic change");
BroadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
  

Команда для включения уведомления о характеристике

 descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
 bluetoothGatt.writeDescriptor(descriptor);
  

Я ожидаю, что Bluetooth gatt настроен для обработки изменений характеристик. На самом деле происходит большая черная дыра без ответов.

Комментарии:

1. Проведя немного больше исследований, выяснилось, что для свойства установлены значения READ, WRITE_NO_RESPONSE и NOTIFY. Я провел небольшое исследование по использованию WRITE_NO_RESPONSE, и в нем говорилось, что ответы были сделаны через уведомление. Я провел некоторое исследование о методе setCharacteristicNotification (у меня нет этой строки в моей программе), но это тоже не работает.

Ответ №1:

После дальнейшего исследования использование setCharacteristicNotification в сочетании с изменением настройки уведомлений в дескрипторе CCCD успешно решило проблему.