Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

piątek, 11 marca 2011

Android - App Inventor 2: Jak automatycznie połączyć Bluetooth po włączeniu aplikacji i rozłączyć przy wyjściu?


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:

Anonimowy
A jak napisać, aby aplikacja automatycznie łączyła się z urządzeniem BT? bez konieczności wybierania jej z listy... wiadomo wcześniej musi być sparowana...

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:
  1. automatyczne połączenie Bluetooth po uruchomieniu aplikacji,
  2. 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:


Android + App Inventor: Blok .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:


Android + App Inventor: Przykładowy blok dokonujący połączenia Bluetooth 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 :-)",

W przypadku braku możliwości automatycznego połączenia blok:
  • 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:


Android + App Inventor: Blok reagujący na wybranie urządzenia z listy sparowanych 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:


Android + App Inventor: Błąd Error 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 :


Android + App Inventor: Blok .ErrorOccurred reagujący na wystąpienie błędu.


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":


Android + App Inventor: Blok .DeforePicking uzupełniający listę urządzeń Bluetooth.

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:


Android + App Inventor: Ekran po dokonaniu automatycznego połączenia Bluetooth.


W przypadku, gdy połączenie nie będzie możliwe mogą się pojawić dwa ekrany:


Android + App Inventor: Ekran z listą urządzeń Bluetooth.Android + App Inventor: Ekran z pustą listą urządzeń Bluetooth.


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":


Android + App Inventor: Ekran aplikacji testowej Bluetooth.


Jeżeli po ręcznym wybraniu z listy urządzenia nie zostanie poprawnie nawiązana komunikacja, na ekranie pojawi się komunikat:


Android + App Inventor: Ekran aplikacji, gdy urządzenie Bluetooth nie odpowiada.


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:


Android + App Inventor: Ekran aplikacji, gdy dokonano ręcznego połączenia urządzenia Bluetooth.


Mamy więc rozwiązany problem automatycznego połączenia. Warto byłoby jeszcze uzupełnić powyższy algorytm o blok .IsDevicePaired :


Android + App Inventor: Blok .IsDevicePaired - blok sprawdza, czy urządzenie o danym adresie MAC jest sparowane.


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:


Android + App Inventor: Blok .ConnectWithUUID dokonuje połączenia z urządzeniem Bluetooth wskazanym adresem MAC oraz identyfikatorem UUID.


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 :


Android + App Inventor: Blok .BackPressed - powrót do poprzedniej strony wywołany po kliknięciu przycisku Back.


Wystarczy więc wstawić do niego blok zakończenia połączenia .Disconnect :


Android + App Inventor: Blok .BackPressed automatycznie rozłączający Bluetooth i zamykający aplikację.


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:


Android + App Inventor: Blok .BackPressed pytający o zgodę na zamknięcie aplikacji.


który wywoła na ekranie takie okienko:


Android + App Inventor: Ekran z pytaniem o zgodę na zamknięcie aplikacji.


Pozostaje nam dodać reakcję na przyciśnięcie przycisku Tak:


Android + App Inventor: Blook .AfterChoosing wyłączający Bluetooth i zamykający aplikację po wyrażeniu zgody.


i ładnie zakończymy aplikację :-)





Do pobrania

Całość aplikacji wygląda więc następująco:


Android + App Inventor: Kompletna aplikacja automatycznie łącząca Bluetooth po jej uruchomieniu i rozłączając Bluetooth w trakcie jej wyłączania.


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 :-)


Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

22 komentarze:

  1. A co z automatycznym łączeniem w tle jako usługi?

    OdpowiedzUsuń
    Odpowiedzi
    1. App Inventor 2 nie posiada takich moliwosci.

      Usuń
  2. 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ń
  3. 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.

    trochę nagmatwałem, ale chyba wiecie o co mi chodzi. :)

    OdpowiedzUsuń
  4. 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ń
  5. 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 :-)

    Jeżeli dasz mi nieco czasu, to w weekend przygotuję artykuł na początek tygodnia.

    OdpowiedzUsuń
    Odpowiedzi
    1. czy jest jakaś nadzieja na artykuł ??
      prawdopodobnie nie tylko Ja na niego czekam ...:)

      Usuń
  6. Dzięki. Jestem jak najbardziej zainteresowany takim artykułem. Pozdrawiam.

    OdpowiedzUsuń
  7. Gdyby ktoś szukał jak skłonić aplikacje do włączenia modułu BT:
    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

    OdpowiedzUsuń
    Odpowiedzi
    1. fajnie, tylko mam problem z ułożeniem tego z klocków appinventora.
      czy można by prosić o screena albo przykład aplikacji
      Dziękuje za pomoc

      Usuń
  8. witam, mam problem z automatycznym łączeniem, wyskakuje mi error 515, co z tym zrobić??

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń
  9. widzę, że temat się rozwija :)
    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ń
    Odpowiedzi
    1. 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ń
    2. OK. :)
      to cierpliwie czekamy

      Usuń
  10. Witam, a jak zmusić aplikację, aby automatycznie włączyła BT w telefonie i połączyła się z modułem...
    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 ...

    OdpowiedzUsuń
  11. może ktoś wie jak zrobić aby przy wychodzeniu z aplikacji wyłączał się moduł BT w telefonie...

    OdpowiedzUsuń
  12. skoro aplikacja jest napisana a brak czasu na opis może umieścisz samą aplikację a analizę zostawisz innym ....

    OdpowiedzUsuń
  13. Witam
    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

    OdpowiedzUsuń
  14. 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ń
  15. 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ń
    Odpowiedzi
    1. Tak jest taka możliwość ponieważ występują:

      - 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.

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.