Автоматическое переподключение устройств Bluez

Я пишу библиотеку на C/C++ для устройства Bluetooth с низким энергопотреблением. До сих пор я использовал интерфейс D-Bus, представленный Bluez, и мог обнаруживать, подключаться и взаимодействовать с устройством.

Однако, когда устройство отключается либо из-за сбоя соединения, либо из-за того, что оно находится вне зоны действия, повторное подключение к нему не является тривиальной задачей. В идеале я хотел бы иметь возможность создавать ожидающие подключения ко всем отключенным устройствам, но Bluez, похоже, не поддерживает это. Похоже, что Bluez поддерживает только один одновременный вызов соединения, время ожидания которого истекает через 15-20 секунд.

Таким образом, решением будет прослушивание рекламных пакетов и подключение при обнаружении известного устройства. Хорошие люди на #bluez сказали мне, что это уже реализовано, и способ сделать это — зарегистрировать объект, реализующий GattProfile1, с помощью метода GattManager1 RegisterProfile. Попытка этого не дала результата, устройство остается отключенным после сбоя соединения. Он также очень плохо документирован, так что есть большая вероятность, что я что-то упустил.

Мои вопросы: это правильное решение? Обеспечит ли это плавное и быстрое переподключение? Если да, то что может быть не так?


person prinsen    schedule 29.08.2015    source источник


Ответы (1)


Если вы хотите повторно подключиться к одному устройству Bluetooth, вы можете отслеживать состояние подключения, приняв org.freedesktop.DBus.Properties.PropertiesChanged и при необходимости вызвав org.bluez.Device1.Connect для повторного подключения. Поскольку это время ожидания, вы можете поместить Connect() в цикл, из которого вы выйдете только тогда, когда свойство org.bluez.Device1.Connected истинно.

Удалось ли оригинальному автору сделать это для нескольких устройств, внедрив GattProfile1?

person davhoo    schedule 11.02.2016