#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 успешно решило проблему.