Как правильно читать рекламные пакеты с датчика BLE, используя bluez 5.43 и DBus?

Я пытаюсь реализовать код C ++ (используя bluez 5.43 и dbus) для чтения рекламных пакетов с датчика BLE. В соответствии с документами Bluez DBus, есть StartDiscovery API, который можно использовать для сканирования ближайших устройств. Тем не менее, я не могу найти какие-либо API для хранения / анализа рекламных пакетов от соседних устройств BLE. рекламно-api.txt содержит списки API для регистрации рекламы, но, насколько я понимаю, его можно использовать только для создания рекламных пакетов, а не для чтения с внешнего устройства (или я ошибаюсь?). Может, кто-нибудь подскажет, как правильно получать рекламные пакеты с соседних устройств BLE, используя bluez и DBus?

2

Решение

Поведение, которое вы описали в одном из ваших последних комментариев, является правильным (рекламные данные не обновляются): если я прав, BLE-устройство не должно постоянно работать, оно может спать или переходить в режим низкого энергопотребления и т. Д. ,

В этом контексте не странно, что данные каким-то образом «кэшируются». По моему опыту, когда вы выполняете сканирование и обнаруживаете устройство (даже если вы не подключаетесь к нему), информация об устройстве будет храниться в течение некоторого времени.

В вашем случае это проблематично, потому что вы передаете данные через рекламу. тем не мение есть способ заставить bluez удалить все кэшированные данные об устройстве :
Адаптер-API обеспечивает RemoveDevice (объект устройства) метод. Он принимает путь объекта (например, «/ org / bluez / hci0 / dev_AA_BB_AA_BB_AA») в качестве аргумента.

Если вы ищете привязки DBus в C, я предлагаю GLib GDBus (вы найдете ссылки внизу этого руководства на сайте freedesktop: https://dbus.freedesktop.org/doc/dbus-tutorial.html).

Если вы знакомы с bluetoothctl (инструмент для взаимодействия с bluez с использованием команд), он был разработан ребятами из bluez с помощью Glib GDbus, и вы можете найти исходный код здесь (посмотрите внизу, чтобы найти список команд): https://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/main.c

Есть более простые способы использовать GDBus с bluez, но исходный код bluetoothctl — это начало, и вы найдете примеры практически всего, что можно сделать с bluez =)

0

Другие решения

Спасибо всем за предложения. Наконец-то я смог получить данные производителя, используя библиотеку Intel TinyB. Он имеет API enable_manufacturer_data_notifications, который позволяет получать уведомления при изменении данных производителя.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector