Autor: Dondu
W artykule o Androidzie i module Bluetooth pokazałem, jak można po uruchomieniu napisanej aplikacji wyświetlić listę sparowanych urządzeń Bluetooth i wybrać jedno z nich w celu połączenia.
W komentarzu do artykułu padło pytanie:
To bardzo dobre pytanie, bo umożliwia znaczne przyspieszenie procesu od uruchomienia aplikacji do nawiązania połączenia z wybranym urządzeniem którym aplikacja będzie sterować np. mikrokontrolerem. Dlatego postanowiłem pokazać jak ładnie zaprojektować aplikację pod tym kątem.
W artykule przedstawia dwa aspekty:
- automatyczne połączenie Bluetooth po uruchomieniu aplikacji,
- automatyczne rozłączenie Bluetooth przy wyjściu z aplikacji po wcześniejszym upewnieniu się, że aplikację chcemy zamknąć.
Automatyczne połączenie Bluetooth po uruchomieniu aplikacji
W App Inventor 2 mamy możliwość użycia bloku .Initialize:
Screen1, to domyślna nazwa pierwszego ekranu aplikacji otwieranego po jej uruchomieniu. Nazwa ta może być przez Ciebie zmieniona, stąd jeżeli tego dokonałeś w powyższym bloku wybierz właściwy ekran.
Do powyższego bloku dodajemy podstawowy blok łączenia z urządzeniem Bluetooth (.Connect) oraz adres MAC urządzenia - moim przypadku był to moduł HC-05 z adresem: 98:D3:31:40:0E:32
Adres modułu możesz ustalić dowolną aplikacją terminala Bluetooth, z których kilka opisałem w cyklu Bluetooth, czyli komunikacja z otoczeniem lub za pomocą komponentu ListPicker, który opisałem w poprzednich artykułach (art.1 i art.2), a który użyjemy także w dalszej części niniejszego artykułu.
Przykładowy blok dokonujący połączenia zaraz po włączeniu aplikacji:
Blok wykona:
- próbę połączenia urządzenia o wskazanym adresie MAC,
- w przypadku prawidłowego połączenia pokaże komunikat "Połączono automatycznie :-)",
- pobierze listę sparowanych urządzeń i przypisze do listy ListPicker1,
- włączy widoczność przycisku ListPicker1,
- pokaże wykaz sparowanych urządzeń Bluetooth otwierając listę ListPicker1.
Teraz powinniśmy zareagować na kliknięcie wybranego z listy urządzenia Bluetooth:
Blok wykona sprawdzenie, czy jakiś element z listy został wybrany i jeżeli tak to:
- spróbuje nawiązać połączenie z wybranym urządzeniem i jeśli połączenie nie zostanie ustanowione zakończy działanie,
- jeśli połączenie nastąpi, schowany zostanie przycisk ListPicker, a na ekranie pojawi się komunikat: "Połączono ręcznie."
Jednak gdy próba połączenia nie uda się (np urządzenie nie ma włączonego zasilania lub jest poza zasięgiem), Android zgłosi to błędem nr 507:
Aby tego uniknąć należy dodać blok przechwytywania obsługi błędów. Blokiem tym jest blok ekranu głównego - w naszym przypadku Screen1.ErrorOccurred :
który sprawdzi numer błędu i zareaguje, komunikatem "Urządzenie nie odpowiada." zamiast systemowego komunikatu błędu 507.
W tym miejscu aplikacja (poprzez rozbudowę warunku o kolejne instrukcje else if) może oczywiście wyłapywać inne błędy występujące podczas jej pracy i może zawierać dowolne inne bloki, a nie tylko komunikat.
Do kompletu potrzeba nam jeszcze funkcjonalności odświeżenia listy urządzeń Bluetooth za każdym razem, gdy klikniemy przycisk ListPicker1, czyli "Pokaż dostępne urządzenia":
Jest to konieczne ponieważ w międzyczasie mogłeś sparować kolejne urządzenie lub po prostu włączyć Bluetooth w smartfonie.
Prześledźmy działanie aplikacji
Przy prawidłowym połączeniu podczas uruchamiania aplikacji na ekranie pojawi się tylko komunikat:
W przypadku, gdy połączenie nie będzie możliwe mogą się pojawić dwa ekrany:
Ten z lewej pokazuje sparowane urządzenia, gdy Bluetooth jest w smartfonie włączony. Ten z prawej pokazuje pustą listę czego przyczyną może być brak sparowanych urządzeń lub niewłączony moduł Bluetooth w smartfonie.
Klikając przycisk Back wracamy do ekranu głównego, gdzie czeka na nas przycisk ListPicker1 "Pokaż dostępne urządzenia":
Jeżeli po ręcznym wybraniu z listy urządzenia nie zostanie poprawnie nawiązana komunikacja, na ekranie pojawi się komunikat:
Po rozwiązaniu problemu i ponownej próbie wyboru z listy i nawiązaniu połączenia z urządzeniem, ukryty zostanie przycisk listy urządzeń Bluetooth i pojawi się komunikat:
Mamy więc rozwiązany problem automatycznego połączenia. Warto byłoby jeszcze uzupełnić powyższy algorytm o blok .IsDevicePaired :
którym możemy jeszcze dodatkowo wzbogacić rozpoznając, czy urządzenie o wskazanym przez nas adresie MAC występuje na liście sparowanych urządzeń. Proponuję, abyś w ramach ćwiczeń zmodyfikował program i wykorzystał tę funkcjonalność.
Innym blokiem służącym do połączenia z urządzeniem Bluetooth jest blok .ConnectWithUUID:
do którego podłączamy elementy tekstowe zawierające adres MAC oraz identyfikator UUID (Universally Unique Identifier). UUID, to identyfikator określający typ urządzenia wykorzystującego Bluetooth. W niniejszym artykule używałem moduł HC-05, który jest modułem komunikacji szeregowej SPP (Serial Port Profile), stąd jego UUID, to: 00001101-0000-1000-8000-00805f9b34fb
Razem te dwa parametry (adres MAC oraz UUID) jednoznacznie identyfikują urządzenie, z którym ma zostać połączony Android.
Automatyczne rozłączenie Bluetooth przy wyjściu z aplikacji
Tworząc aplikacje warto dbać o szczegóły, a jednym z nich jest rozłączenie połączonego urządzenia Bluetooth przed zamknięciem aplikacji. Zamknięcie aplikacji następuje zwykle, gdy klikniemy przycisk (lub ikonę) Back. Czynność ta powoduje wywołanie bloku .BackPressed :
Wystarczy więc wstawić do niego blok zakończenia połączenia .Disconnect :
oraz blok wyłączenia aplikacji close application, ponieważ jeżeli użyjesz bloku BackPressed, to automatycznie musisz sam zakończyć aplikację. Jeżeli bloku BackPressed nie użyjesz to aplikacja zostanie zamknięta automatycznie.
Szczegóły są ważne ...
Dopieśćmy jednak naszą aplikację upewnieniem się, czy użytkownik faktycznie chce ją zamknąć, bo może przez przypadek kliknął przycisk Back. W tym celu użyjemy bloku .ShowChooseDialog:
który wywoła na ekranie takie okienko:
Pozostaje nam dodać reakcję na przyciśnięcie przycisku Tak:
i ładnie zakończymy aplikację :-)
Do pobrania
Całość aplikacji wygląda więc następująco:
Aplikacja: Android_Bluetooth_Automatyczne_Polaczenie.apk (kopia)
Projekt aplikacji: Android_Bluetooth_Automatyczne_Polaczenie.aia (kopia)
Kod do pobrania aplikacji:
Masz jakieś inne problemy - pytaj w komentarzach - postaram się podpowiedzieć jeśli będę wiedział jak :-)
A co z automatycznym łączeniem w tle jako usługi?
OdpowiedzUsuńApp Inventor 2 nie posiada takich moliwosci.
UsuńCzy istnieje możliwość aby urządzenia połączyły się automatycznie gdy aplikacja na telefonie jest już uruchomiona a moduł hc-06 został właśnie włączony lub znalazł się w zasięgu ?
OdpowiedzUsuńlepszym rozwiązaniem by było aby podczas włączania aplikacja sama wykrywała czy moduł BT jest włączony, jeśli nie to by go włączyła i automatycznie połączyła z modułem BT. a po zamknięciu aplikacji BT zostałby wyłączony i tym samym połączenie zakończone i aplikacja zamknięta.
OdpowiedzUsuńtrochę nagmatwałem, ale chyba wiecie o co mi chodzi. :)
Chyba mało precyzyjnie zadałem pytanie ?. Chodziło mi o to że np. przemieszczam się w dużym budynku pomiędzy pomieszczeniami w ktorych co jakiś czas rozmieszczone są moduły BT. Chciałbym aby aplikacja uruchomiona przy wejściu do budynku wykrywała kolejne moduły ktore wcześniej zostały sparowane i łączyła się z nimi w kolejnych pomieszczeniach automatycznie w miarę przemieszczania się.
OdpowiedzUsuńOpisałeś wystarczająco dobrze. Oczywiście można tak zrobić. Jest bowiem możliwość odczytu listy sparowanych urządzeń i łączenia się z nimi po kolei po utracie połączenia z poprzednim :-)
OdpowiedzUsuńJeżeli dasz mi nieco czasu, to w weekend przygotuję artykuł na początek tygodnia.
czy jest jakaś nadzieja na artykuł ??
Usuńprawdopodobnie nie tylko Ja na niego czekam ...:)
Dzięki. Jestem jak najbardziej zainteresowany takim artykułem. Pozdrawiam.
OdpowiedzUsuńGdyby ktoś szukał jak skłonić aplikacje do włączenia modułu BT:
OdpowiedzUsuńset.ActivityStarter.action.to."android.bluetooth.adapter.action.REQUEST_ENABLE"
później:
call.ActivityStarter.StartActivity
Oczywiście nie ma tak pięknie i telefon zapyta nas czy zezwalamu aplikacji na włączenie BT
Pozdrawiam
fajnie, tylko mam problem z ułożeniem tego z klocków appinventora.
Usuńczy można by prosić o screena albo przykład aplikacji
Dziękuje za pomoc
witam, mam problem z automatycznym łączeniem, wyskakuje mi error 515, co z tym zrobić??
OdpowiedzUsuńNie miałem takiego przypadku więc trudno mi coś doradzić. Może dokonaj ponownego parowania urządzeń - któryś z błędów był w ten sposób eliminowany - nie pamiętam który.
Usuńwidzę, że temat się rozwija :)
OdpowiedzUsuńczy jest możliwość aby android łączył się ze sparowanym urządzeniem BT (np hc-06) jeśli pojawi się w zasięgu lub po stracie zasięgu... i nie chodzi tu o konkretny moduł BT, tylko o już sparowany ale pojawiający się w zasięgu... już kiedyś temat był poruszany ....
Tak jest taka możliwość, opracowałem już taką aplikację Androida w połączeniu z HC-05 lub BTM-222 ... tylko ten czas, którego ciągle brakuje.
UsuńOK. :)
Usuńto cierpliwie czekamy
Witam, a jak zmusić aplikację, aby automatycznie włączyła BT w telefonie i połączyła się z modułem...
OdpowiedzUsuńset.ActivityStarter.action.to."android.bluetooth.adapter.action.REQUEST_ENABLE"
później:
call.ActivityStarter.StartActivity
ten sposób działa ale tylko na włączenie modułu BT.. a nie połączy się.
nie wiem czy dobrze napisałem ...
może inaczej.....
jak zmusić aplikację do łączenia się z modułem po stracie połączenia, nie tylko przy uruchamianiu aplikacji.....
prosimy o wskazówki ...
może ktoś wie jak zrobić aby przy wychodzeniu z aplikacji wyłączał się moduł BT w telefonie...
OdpowiedzUsuńskoro aplikacja jest napisana a brak czasu na opis może umieścisz samą aplikację a analizę zostawisz innym ....
OdpowiedzUsuńWitam
OdpowiedzUsuńMógłby mi ktoś podsunąć 3 rozwiązania związane z rozszerzeniem powyższego wpisu.
1. czy po fragmencie:
set.ActivityStarter.action.to."android.bluetooth.adapter.action.REQUEST_ENABLE"
call.ActivityStarter.StartActivity
Można zrobić tak by okno, które nam wyskakuje było automatycznie potwierdzane?
2. jak sprawić żeby automatyczne łączenie z urządzeniem BT nastąpiło dopiero po tym gdy BT zostanie włączony (czyli z powodzeniem zostanie wykonany i potwierdzony punkt 1.)
3. Jak wyłączyć BT (nie chodzi mi o rozłączenie z urządzeniem tylko zwykłe wyłączenie go) po wyjściu z aplikacji?
próbowałem opierać się o stronę:
http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#ACTION_REQUEST_ENABLE
Ale bez większych rezultatów...:-(
Liczę na Waszą pomoc
A czy istnieje takie rozwiazanie aby przyciskac dwa przyciski jednoczesnie. Naprzyklad do sterowanie platformy mobilnej. A jak nie to jak to najlepiej rozwiązać
OdpowiedzUsuńCzy jest możliwość aby android łączył się ze sparowanym urządzeniem BT (np hc-06) jeśli pojawi się w zasięgu lub po stracie zasięgu... i nie chodzi tu o konkretny moduł BT, tylko o już sparowany ale pojawiający się w zasięgu... już kiedyś temat był poruszany ....
OdpowiedzUsuńTak jest taka możliwość ponieważ występują:
Usuń- możliwość pobrania do listy wszystkich sparowanych urządzeń: AdressesAndNames (przykład pokazałem w artykule: Bluetooth + Android: Pierwsza aplikacja APP Inventor - cz. II,
- możliwość użycia Clocka do okresowego sprawdzania, czy któreś ze sprawowanych urządzeń urządzenie jest w zasięgu, poprzez próbę połączenia z nim (po kolei według listy z punktu wyżej).
Przy okazji można sprawdzać stan połączenia za pomocą IsConnected.
Można także okresowo się rozłączać za pomocą Disconnect, by połączyć się z innym Bluetooth.
Wszystkie powyższe komendy dostępne są w komponencie BluetoothClient.