Obecnie opracowuję aplikację, która będzie korzystać z Bluetooth Low Energy (testowanie na Nexusie 4). Po rozpoczęciu pracy z oficjalnymi interfejsami API BLE w Androidzie 4.3 zauważyłem, że po pierwszym podłączeniu urządzenia rzadko jestem w stanie pomyślnie połączyć się z tym urządzeniem lub innym urządzeniem.
Zgodnie z instrukcjami tutaj , mogę z powodzeniem podłączyć do urządzenia, usługi skanowania i charakterystyki i odczytu / zapisu / odbierać powiadomienia, bez żadnych problemów. Jednak po rozłączeniu i ponownym połączeniu często nie mogę skanować usług / cech lub nie mogę zakończyć odczytu / zapisu. Nie mogę znaleźć w dziennikach niczego, co wskazywałoby, dlaczego tak się dzieje.
Gdy to się stanie, muszę odinstalować aplikację, wyłączyć Bluetooth i ponownie uruchomić telefon, zanim zacznie ponownie działać.
Za każdym razem, gdy urządzenie zostanie odłączone, wywołuję funkcję close () na obiekcie BluetoothGatt i ustawiam na zero. Jakieś spostrzeżenia?
EDYCJA:
Zrzuty dziennika: dla tych dzienników zrootowałem swój telefon i podniosłem poziomy śledzenia powiązanych elementów w /etc/bluetooth/bt_stack.conf
Udane połączenie - pierwsza próba po ponownym uruchomieniu telefonu i zainstalowaniu aplikacji. Jestem w stanie połączyć się, odkryć wszystkie usługi / cechy oraz czytać / pisać.
Nieudana próba 1 - to kolejna próba po rozłączeniu się z udanym połączeniem powyżej. Wygląda na to, że byłem w stanie odkryć cechy, ale pierwsza próba odczytu zwróciła wartość zerową i wkrótce potem się rozłączyła.
Nieudana próba 2 - przykład, w którym nie jestem nawet w stanie odkryć usług / cech.
EDYCJA 2:
Urządzenie, z którym próbuję się połączyć, oparte jest na układzie scalonym CC2541 TI. Otrzymałem TI SensorTag (również oparty na CC2541) do zabawy i odkryłem, że TI wydało wczoraj aplikację na Androida dla SensorTag. Jednak ta aplikacja ma ten sam problem. Przetestowałem to na dwóch innych Nexusach 4 z tym samym rezultatem: połączenie z SensorTag jest udane za pierwszym lub drugim razem, ale (zgodnie z logami) później nie wykrywa usług, powodując różnego rodzaju awarie. Zaczynam się zastanawiać, czy to problem z tym konkretnym układem?
Odpowiedzi:
Ważne wskazówki dotyczące wdrażania
(Być może niektóre z tych wskazówek nie są już konieczne z powodu aktualizacji systemu operacyjnego Android).
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
a następnie połącz. Powód:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
zawsze zawodzi, jeśli zostanie wywołanyLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
w tym samym wątku na Samsung Galaxy S3 z Androidem 4.3 (przynajmniej dla kompilacji JSS15J.I9300XXUGMK6)android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
tego parametru do filtrowania niektórych UUID usług, ponieważ jest on całkowicie uszkodzony w Samsung Galaxy S3 z Androidem 4.3 i ogólnie nie działa na 128-bitowych UUID .Samouczek dla początkujących
Całkiem OK dla początkujących może być ten samouczek wideo: Tworzenie inteligentnych aplikacji Bluetooth na Androida http://youtu.be/x1y4tEHDwk0
Problem i obejście opisane poniżej zostały prawdopodobnie naprawione teraz przez aktualizacje systemu operacyjnego
Obejście: Mógłbym „ustabilizować” moją aplikację, robiąc to ...
To obejście oparte jest na doświadczeniach obserwacyjnych ...
źródło
Wyłączanie WIFI:
Mogę również potwierdzić, że wyłączenie WIFI sprawia, że Bluetooth 4.0 jest bardziej stabilny, szczególnie w Google Nexus (mam Nexusa 7).
Problem
jest to, że tworzona przeze mnie aplikacja potrzebuje zarówno WIFI, jak i ciągłego skanowania LE Bluetooth . Wyłączenie WIFI nie było dla mnie opcją.
Ponadto zdałem sobie sprawę, że to ciągłe skanowanie LE Bluetooth może faktycznie zabić połączenie WIFI i sprawić, że adapter WIFI nie będzie mógł ponownie połączyć się z żadną siecią WIFI, dopóki skanowanie BLE nie zostanie WŁĄCZONE. (Nie jestem pewien sieci komórkowych i mobilnego internetu).
Zdecydowanie stało się to na następujących urządzeniach:
Jednak skanowanie BLE z włączoną siecią WIFI wydawało się dość stabilne na:
Moje obejście
I skanować ble na krótki okres czasu 3-4 sekundy potem wyłączyć skanowanie przez 3-4 sekund . Następnie włącz ponownie.
services
lubcharacteristics
niepowodzenia.źródło
Upewnij się, że Twój Nexus jest sparowany z urządzeniem. Nie mogę zweryfikować, czy komunikacja działa poprawnie, ale będziesz mógł połączyć się więcej niż jeden raz bez ponownego uruchamiania. Wydaje się, że pierwsze połączenie nie wymaga parowania, ale wszystkie kolejne próby wymagają.Zaktualizuję tę odpowiedź za kilka dni, gdy przetestuję wykrywanie usługi i odczyta żądania odczytu i zapisu bez ponownego uruchamiania.
EDYCJA: Okazuje się, że testowałem wersję oprogramowania układowego (naszego czujnika), która powodowała problemy, jeśli nie została sparowana. Nasze najnowsze produkcyjne oprogramowanie układowe działa dobrze na modelach 2540 i 2541.
EDYCJA: Zauważyłem, że na Nexusie 7 2013 połączenia są bardziej stabilne, gdy Wi-Fi jest wyłączone. Chciałbym wiedzieć, czy to pomaga komukolwiek innemu.
EDYCJA: Wydaje mi się, że miałem parowanie wstecz. Wszystko działa dobrze, gdy nie jest sparowane. Po sparowaniu doświadczam dokładnie tych samych objawów, co OP. Po prostu nie wiadomo jeszcze, czy jest to związane z naszym oprogramowaniem układowym lub interfejsem API Android BLE. Zachowaj ostrożność podczas testowania, ponieważ po sparowaniu możesz nie być w stanie usunąć parowania z powodu błędu wyjaśnionego w 3b tego postu .
źródło
W niektórych modelach występuje wada: https://code.google.com/p/android/issues/detail?id=180440
Z drugiej strony w moim przypadku problemem było to, że moje połączenie nie zostało poprawnie zamknięte w metodzie onDestroy. Po prawidłowym zamknięciu problem dla mnie nie istnieje, bez względu na to, czy Wi-Fi jest włączone lub wyłączone.
źródło
close
konieczne?Miałem podobny problem. Moja poprawka była
i dzwonienie blisko po rozłączeniu.
źródło