D-Bus Bluez, "StartNotify" против "AcquireNotify" - PullRequest
0 голосов
/ 24 ноября 2018

У меня на Raspberry Pi работает приложение c ++, использующее API-интерфейс bluez d-bus.Он поддерживает несколько датчиков от разных производителей, но по большей части добавить новые датчики было довольно просто, как только я запустил первый.После подключения я не использую ничего слишком экзотического, просто «StartNotify», «StopNotify», «ReadValue» и «WriteValue».Во всяком случае, недавно у меня возникли проблемы с добавлением пары новых датчиков.Оба используют пакеты большего размера, поэтому, используя анализатор пакетов, я вижу, как датчики согласовывают больший MTU.По какой-то причине, хотя после согласования я могу прочитать характеристики большего значения, но не могу включить (или получить) уведомления.Пробуя разные подходы с помощью bluetoothctl, я обнаружил, что использование «acqu-notify», похоже, решает проблему.Я также заметил, что новые команды acqu возвращают MTU, так что, возможно, это как-то связано с этим.Возвращаясь к датчикам, которые я уже поддерживаю, я также обнаружил, что замена «StartNotify» на «AcquireNotify», похоже, работает и с ними.Поэтому моя делимма заключается в том, использовать ли «AcquireNotify» для всех датчиков (чтобы мой код был более чистым) или только для новых, которые вызывают у меня проблему.

К сожалению, я не нашел подробной документации по новым интерфейсам "acqu".Кому-то, у кого нет большого количества истории bluez, не совсем понятно, каковы их последствия по сравнению с оригинальными интерфейсами.Так что мои вопросы двоякие -

  1. Есть ли какая-либо причина не использовать «AcquireNotify» / «ReleaseNotify» для всех датчиков (даже более старых, которые используют старый / более низкий MTU)?
  2. При использовании «AcquireNotify» имеет ли значение, если вы используете «ReadValue» / «WriteValue» на других характеристиках, или я должен использовать «AcquireRead» / «AcquireWrite»?

Любая информация высоко ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

AcquireNotify возвращает дескриптор файла, который вы можете опрашивать и читать, а уведомления не передаются по шине d-bus.с StartNotify вы читаете значение уведомления от d-bus.вы сможете добиться большей производительности с помощью файловых дескрипторов (и без d-bus), если отправляете много данных в уведомлениях GATT.

AcquireNotify / AcquireWrite - относительно новые API, и они имеют некоторую стабильностьпроблемы (Bluetooth может прекратить из-за SIGPIPE).в их репозиториях есть некоторые патчи для bluez 5.50, которые улучшают его.

0 голосов
/ 07 декабря 2018

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

...