2015-08-29 32 views
5

Piszę bibliotekę w C/C++ dla urządzenia o niskiej energii Bluetooth. Do tej pory korzystałem z interfejsu D-Bus odsłoniętego przez Bluez i udało mi się odkryć, połączyć się i komunikować z urządzeniem.Urządzenia do automatycznego ponownego łączenia urządzeń Bluez

Jednak, gdy urządzenie zostanie odłączone z powodu awarii łącza lub poza zasięgiem, ponowne połączenie z nim nie jest banalne. Idealnie chciałbym móc tworzyć oczekujące połączenia ze wszystkimi odłączonymi urządzeniami, ale Bluez nie wydaje się tego wspierać. Wygląda na to, że Bluez obsługuje tylko jedno jednoczesne połączenie, które upływa po 15-20 sekundach.

Rozwiązaniem byłoby zatem słuchanie pakietów reklamowych i łączenie się w przypadku wykrycia znanego urządzenia. Dobrzy ludzie z #bluez powiedzieli mi, że to już zostało zaimplementowane, a sposobem na to jest zarejestrowanie obiektu, który implementuje GattProfile1 za pomocą metody GattManager1 RegisterProfile. Próba tego nie dała żadnego rezultatu, urządzenie pozostaje rozłączone po awarii łącza. Jest również bardzo słabo udokumentowana, więc jest duża szansa, że ​​coś przeoczyłem.

Moje pytania są następujące: Czy to właściwe rozwiązanie? Czy zapewni bezproblemowe i szybkie ponowne podłączanie? Jeśli tak, to co może być nie tak?

Odpowiedz

2

Jeśli chcesz ponownie połączyć się z jednym urządzeniem Bluetooth, możesz monitorować stan połączenia, odbierając org.freedesktop.DBus.Properties.PropertiesChanged i dzwoniąc pod numer org.bluez.Device1.Connect, aby nawiązać połączenie w razie potrzeby. Ponieważ to spowoduje przekroczenie limitu czasu, możesz umieścić w pętli Connect(), którą opuścisz tylko wtedy, gdy właściwość org.bluez.Device1.Connected jest prawdziwa.

Czy autorowi udało się to jeszcze zrobić na wielu urządzeniach za pomocą GattProfile1?