Уведомления о характеристиках BLE не работают каждый разLinux

Ответить
Гость
 Уведомления о характеристиках BLE не работают каждый раз

Сообщение Гость »


Я разрабатываю приложение Qt для Android, которому необходимо взаимодействовать с Raspberry Pi через Bluetooth Low Energy, чтобы обмениваться рядом значений конфигурации, необходимых для запуска сеанса сверхширокополосного диапазона. Я пришел к выводу, что обмен данными иногда блокируется, когда я запускаю серверную программу Raspberry Pi, из-за того, что уведомления о характеристиках, участвующих в обмене данными, не включены, и, таким образом, телефон не знает, что данные на этом характеристика изменилась и не отвечает. Чтобы включить уведомления на Raspberry Pi, приложение Qt запускает следующий код:

void DeviceHandlerBase::onServiceStateChangedUwb(QLowEnergyService::ServiceState s) { if (s == QLowEnergyService::RemoteServiceDiscovered) { если (m_service == nullptr) { LOGE("СЕРВИСНЫЙ УКАЗАТЕЛЬ UWB НУЛЬ"); возвращаться; } // Переместить в CONFIG.H txCharacteristic = m_service->характеристика (UWB::UWB_TX_CHARACTERISTIC_UUID); rxCharacteristic = m_service->характеристика (UWB::UWB_RX_CHARACTERISTIC_UUID); if (txCharacteristic.isValid() && rxCharacteristic.isValid()) { LOGI("Характеристики RX и TX найдены и действительны"); m_notificationDesc = txCharacteristic.descriptor(UWB::UWB_DESCRIPTOR_UUID); если (m_notificationDesc.isValid()) { LOGI("Дескриптор уведомления действителен"); LOGI("Desc UUID: " + m_notificationDesc.uuid().toString()); ЛОГИЯ((m_notificationDesc.type())); // Сбрасываем значение дескриптора уведомления?! // Это может помешать onConfirmedDescriptorWriteUwb // m_service->writeDescriptor(m_notificationDesc, UWB::BLE_DISABLE_NOTIFICATIONS); m_service->writeDescriptor(m_notificationDesc, UWB::BLE_ENABLE_NOTIFICATIONS); } еще LOGE("ДИСКРИПТОР УВЕДОМЛЕНИЯ НЕ ДЕЙСТВИТЕЛЬЕН"); } еще LOGE("ХАРАКТЕРИСТИКИ RX И TX НЕДЕЙСТВИТЕЛЬНЫ"); } } Это запишет 0x0100 в дескриптор CCCD и должно включить уведомления от RPi. Для сервера RPi я использую API DBUS Bluez для взаимодействия с BLE, поэтому я пытался отслеживать сообщения Bluez DBUS в целях отладки.

Как я уже говорил, обмен либо работает, либо нет случайно, при запуске серверной программы, и Я заметил следующие различия в сообщениях DBUS:

Если уведомления работают нормально:

Type=method_call Endian=l Флаги=1 Версия=1 Cookie=2651 Отправитель=:1.16 Назначение=:1.99 Путь=/org/bluez/dbz_application/service_0/char_1 Interface=org.bluez.GattCharacteristic1 Member=StartNotify УникальноеИмя=:1.16 СООБЩЕНИЕ "" { }; Если уведомления не работают:

Type=method_call Endian=l Флаги=0 Версия=1 Cookie=2844 Отправитель=:1.16 Назначение=:1.107 Путь=/org/bluez/dbz_application/service_0/char_1/desc_0 Interface=org.bluez.GattDescriptor1 Member=WriteValue УникальноеИмя=:1.16 СООБЩЕНИЕ "aya{sv}" { МАССИВ "y" { БАЙТ 1; БАЙТ 0; }; МАССИВ "{sv}" { DICT_ENTRY "св" { STRING "устройство"; ВАРИАНТ "о" { OBJECT_PATH "/org/bluez/hci0/dev_74_B0_0A_B8_27_BF"; }; }; DICT_ENTRY "св" { STRING "ссылка"; ВАРИАНТ "с" { СТРУНА «ЛЕ»; }; }; DICT_ENTRY "св" { STRING "мту"; ВАРИАНТ "д" { UINT16 517; }; }; }; }; Известна ли вам какая-либо причина, по которой для дескриптора вызывается метод WriteValue вместо метода StartNotify для характеристики, которой принадлежит дескриптор уведомления?
Ответить

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

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

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

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

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