VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky
Tvorba uživatelského rozhraní a komunikace pro Android tablet bakalářská práce
Autor: Josef Žák Vedoucí práce: Ing. Tomáš Kůdela Jihlava 2013
Abstrakt Práce se zabývá tvorbou uživatelského rozhraní pro operační systém Android. Probírá různé možnosti komunikace tabletu s proprietární firemní jednotkou. Je popsána implementace bezdrátové komunikace, i možnost vytvoření sériového kanálu přes čip FT311D. V práci byla použita a upravena offline navigační aplikace OsmAnd. Navigace využívá volně dostupných mapových podkladů (Open Street Map).
Klíčová slova Android, JAVA, tablet, WiFi, FTDI, offline navigace, OsmAnd, GPS
Abstract This bachelor thesis deals with the creation of a user interface for the Android operating system. It discusses various communication options between the tablet and a proprietary business unit. It describes implementation of wireless communication or creation of serial channel using FT311D. The OsmAnd offline navigation was used and customized. Navigation makes us of freely available map data (Open Street Map).
Keywords Android, JAVA, tablet, WiFi, FTDI, offline navigation, OsmAnd, GPS
Prohlašuji, že předložená bakalářská práce je původní a zpracoval jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ . Byl jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutím licence. V Jihlavě dne 8. 5. 2013
Podpis
Poděkování Děkuji mému vedoucímu bakalářské práce, panu Ing. Tomáši Kůdelovi, za poskytnutí hardwaru, podnětné rady a čas strávený diskuzí. Dále děkuji své rodině za podporu při studiu.
Obsah 1
Úvod ......................................................................................................................... 8 Současný stav .................................................................................................... 8
1.1 2
3
Popis a vznik systému Android............................................................................ 10 2.1
Uživatelské rozhraní ....................................................................................... 10
2.2
Bezpečnost ...................................................................................................... 11
2.3
Architektura .................................................................................................... 12
Vývojové prostředí a potřebné nástroje ............................................................. 14 3.1
4
Struktura projektu ........................................................................................... 14
Specifikace požadavků ......................................................................................... 17 4.1
Diagram aktivit ............................................................................................... 17
5
Grafický návrh ikon ............................................................................................. 18
6
Programování uživatelského rozhraní ................................................................ 19
7
6.1
Základní komponenty použité v této práci ..................................................... 19
6.2
Vlákna v Androidu.......................................................................................... 20
6.3
Úvodní obrazovka ........................................................................................... 21
6.4
Nastavení ........................................................................................................ 23
6.5
Zprávy ............................................................................................................. 25
6.5.1
Ukládání a zobrazení zpráv......................................................................... 25
6.5.2
Příjem zprávy .............................................................................................. 26
6.6
Informace ........................................................................................................ 28
6.7
Přepravy .......................................................................................................... 28
6.8
Navigace ......................................................................................................... 29
6.8.1
Existující navigační aplikace ...................................................................... 29
6.8.2
Zvolené řešení ............................................................................................. 32
6.8.3
Získání zdrojových kódů OsmAndu ........................................................... 33
6.8.4
Úprava zdrojových kódů OsmAndu ........................................................... 33
Komunikace tabletu s GP-317 ............................................................................. 38 7.1
Struktura testovacího GPS paketu .................................................................. 38
Drátové řešení – sériový kanál........................................................................ 38
7.2 7.2.1
Čip FT311D ................................................................................................ 39
7.2.2
Čip FT232R ................................................................................................ 40 Bezdrátové řešení ............................................................................................ 41
7.3
8
7.3.1
Hardware ..................................................................................................... 41
7.3.2
Možnosti implementace síťové komunikace .............................................. 42
7.3.3
Programování síťové komunikace .............................................................. 42
Závěr ...................................................................................................................... 46 8.1
Rozšíření a vylepšení aplikace ........................................................................ 46
8.2
Zhodnocení ..................................................................................................... 46
1
Úvod
Minulý rok se na Vysoké škole polytechnické v Jihlavě konal pilotní ročník Dne firem, JOBStart 2012. Tento projekt zprostředkovává kontakt mezi studenty a zaměstnavateli ze státního i soukromého sektoru. Na této akci jsem zhlédl prezentaci firmy ECS Invention. Tato firma se zabývá sledováním vozidel pomocí GPS, vývojem telemetrických systémů (sledování provozních hodnot vozidel) a tvorbou aplikačního software. Se zástupcem této firmy jsem se dohodl na tématu své bakalářské práce – tvorba uživatelského rozhraní a komunikace pro operační systém (OS) Android. Cílem práce je vytvoření programu, který umožní komunikaci mezi počítačem s operačním systémem Android (obvykle tablet) a periferií připojenou prostřednictvím USB nebo WiFi. Periferií se rozumí firemní jednotka GP-317.
1.1
Současný stav
Firma ECS Invention má v provozu aplikaci ShowCars pro telefony/tablety s operačním systémem Android (Obrázek 1). Toto řešení zobrazuje část webové stránky s mapou a aktuální polohou vozidla. Potřebuje stabilní datové připojení. Webová aplikace využívá mapových podkladů společnosti Google, které v současné době nelze pro Českou republiku stáhnout k offline1 používání. Je možné stáhnout pár „dlaždic“ mapy v řádech desítek kilometrů. Výše uvedená firma potřebuje sofistikovanější řešení, které umožní komunikaci řidiče s dispečinkem prostřednictvím textových zpráv, upravitelné nastavení aplikace a jednoduchou evidenci přeprav. Dále by bylo vhodné implementovat nějaké offline mapové podklady, protože mobilní připojení není dostatečné rychlé ve všech částech naší republiky.
1
Offline používání je používání programu bez datového připojení.
8
Obrázek 1: Aplikace ShowCars
9
2
Popis a vznik systému Android
Android je moderní operační systém založený na modifikovaném jádře operačního systému Linux. Záměrně jsem neuvedl slovo „mobilní“, neboť se s Androidem můžeme setkat i na tabletech, netboocích nebo MP3 přehrávačích. „Původně byl vyvíjen jako startup pod názvem Android Inc. Lidé, kteří stáli u jeho zrodu, Andy Rubin, Andy McFadden, Richard Miner a Chris White, chtěli vyvinout systém, který by učinil mobilní telefony chytřejší a více rozvinul jejich jedinečné schopnosti (sledování polohy uživatele, rychlé pořizování fotografií, dotykové uživatelské rozhraní). V roce 2005 se rozhodla společnost Google vstoupit na mobilní trh a koupila Android Inc. včetně vývojového týmu.“ [6] Google většinu zdrojových kódů uvolnil pod open-source licencí, Apache License. Tato licence umožňuje uživatelům volné modifikování a šíření zdrojového kódu. Kolem Androidu se vytvořila velká skupina nadšenců a vývojářů. „V říjnu roku 2012 se v oficiálním obchodu s aplikacemi, Google Play, nacházelo přes 700 000 aplikací.“ [3] Toto přispělo k velké oblibě mezi výrobci telefonů, Android se stal nejpoužívanějším mobilním OS na světě. „Popularita tohoto OS je obrovská, v současnosti ovládá 75 % trhu s mobilními zařízeními. Poradenská společnost Gartner dokonce předpokládá, že do roku 2016 překoná dosud nejrozšířenější desktopový OS Windows.“ [3]
2.1
Uživatelské rozhraní
Dotykové ovládání způsobilo menší revoluci ve světě mobilních zařízení. Rozdělilo uživatele na dva tábory. Na ty, kterým se dotykové ovládání líbí a na ty, kteří raději preferují hardwarová tlačítka. Dlouhou dobu jsem patřil do druhé skupiny, protože hardwarová tlačítka mi poskytovala přesnost a rychlost. Nicméně koupí dotykového zařízení jsem se zařadil do první skupiny. Mohu potvrdit, že změna způsobu ovládání je záležitostí zvyku. Uživatel provádí různé akce dotykem prstu na obrazovce, např. přechod do menu, potvrzení nebo zrušení dialogového okna. Položku lze vybrat krátkým dotykem prstu (click) nebo dlouhým dotykem (long click). Dlouhý dotyk většinou vyvolá kontextové munu, ale není to pravidlo. Existují i další formy ovládání pomocí prstů – tažení (swiping), poklepání (taping), přibližování (pinching), oddalování (reverse pinching). 10
Přibližování a oddalování je velmi intuitivní, využívá multidotekových gest, kdy uživatel může k interakci se zařízením použít více prstů. Dotykové ovládání je ve většině případů pohodlné, nicméně někdy se hodí jakási forma zpětné vazby, např. při psaní textových zpráv. Uživatel při psaní potřebuje vědět, zda virtuální klávesa na obrazovce byla stisknuta či nikoliv. V nastavení klávesnice OS Android lze zapnout vibrace nebo zaznění tónu při stisku virtuální klávesy. Navigace a pohyb v systému jsou velmi podobné ovládání desktopových operačních systémů. Systém podporuje koncept více uživatelských (domovských) ploch, na Androidu jich je obvykle pět. Hlavními prvky jsou ikony a widgety. Ikony spouštějí aplikace a widgety jsou interaktivní oblasti, které uživateli poskytují rychlý přístup k informacím. Widgety jsou umístěny na libovolné domovské ploše. Mohou zobrazovat např. aktuální ceny akcií na burze nebo poskytovat rychlý přístup k editaci poznámek. Posledním významnějším prvkem je stavový panel (Status bar). Tento panel zobrazuje aktuální stav telefonu, tj. spuštěné aplikace, oznámení o aktualizacích systému a aplikací, upozorňuje na zmeškané hovory nebo příchozí zprávy. V případě, že nastane určitá událost, např. přijetí textové zprávy, není uživatel rušen v práci zobrazením velkého dialogového okna, ale je pouze upozorněn jednořádkovým textem v horní části obrazovky.
2.2
Bezpečnost
Android je otevřený systém. To je jeho předností (lze vytvářet různě modifikované verze pro různá zařízení), ale zároveň i nevýhodou z hlediska bezpečnosti. Kdokoliv může procházet zdrojové kódy a v případě objevení chyby toho zneužít. Díky rozšířenosti Androidu bude v nadcházejících letech počet útoků přibývat. Při instalaci libovolné aplikace uživatel potvrzuje oprávnění, které aplikace vyžaduje. Například aplikace pro vyhledávání nejbližší restaurace v okolí může vyžadovat přístup k GPS senzoru nebo WiFi, ale neměla by požadovat přístup k osobním informacím jako historie hovorů nebo doručené SMS zprávy. V záplavě aplikací se může stát, že si uživatel nepřečte pozorně oprávnění při instalaci aplikace. „Tohoto jevu využili neznámí počítačový zločinci k tvorbě škodlivého softwaru s globálním zacílením. Vytvořili trojského koně, Boxer SMS. V prosinci roku
11
2011 bylo nalezeno dvacet dva aplikací infikovaných tímto škodlivým kódem přímo na oficiálním obchodu Google Play. Infikované aplikace odesílaly SMS zprávy na prémiová čísla, která byla zpoplatněna. Odesílání zpráv prováděla aplikace na pozadí a uživatel o ničem nevěděl. O tom, že něco není v pořádku, se uživatel dozvěděl až při pohledu na zbývající kredit nebo nesrovnalosti ve vyúčtování.“ [11] Na druhé straně je dnes Android poměrně bezpečný systém. Nové viry a malware jsou vzácnou záležitostí oproti nejrozšířenějším Windows. Když se něco objeví, masová internetová média z toho dělají velkou kauzu, čímž mohou v obyčejných lidech podvědomě vyvolávat paniku spojenou s potřebou vlastnit nějaký antivir.
2.3
Architektura
Architekturu podrobněji znázorňuje Obrázek 2.
Obrázek 2: Architektura Androidu [1]
12
Aplikace – vestavěné aplikace, které obsahuje každý Android telefon. Tři tečky v posledním obdélníku symbolizují, že se sem řadí i aplikace třetích stran, z Google Play, atp. Aplikační framework – názvy tříd, které zpřístupňují vývojářům různé možnosti Android zařízení. Například LocationManager slouží pro zjištění aktuální polohy uživatele pomocí WiFi nebo GPS senzoru. Knihovny – vestavěné knihovny operačního systému, obdobně jako aplikační framework, poskytují růžné funkcionality. Např. SQLite slouží jako relační databáze pro aplikace s většími nároky pro ukládání dat. Android runtime – obsahuje základní knihovny tříd, které umožňují programování aplikací v jazyku Java. Patří sem knihovny java.math, java.net a další. Dalvik Virtual Machine je speciálně navržený virtuální stroj Javy pro mobilní zařízení. Má menší paměťové nároky a bere v úvahu běh na méně výkonných procesorech. Díky němu je možné spouštět aplikace na různých zařízeních. Linux kernel – jádro OS, stará se o komunikaci s hardwarem. Jsou zde ovladače pro různé senzory, kameru, displej.
13
3
Vývojové prostředí a potřebné nástroje
Pro vývoj Android aplikací je třeba stáhnout a nainstalovat JDK (Java SE Development Kit) z webových stránek Oraclu. JDK je vývojové prostředí pro programování aplikací, appletů a komponent za použití programovacího jazyka Java. Dále je vhodné použít nějaké integrované vývojové prostředí (IDE), které usnadňuje vývojáři psaní zdrojového kódu a údržbu. Google doporučuje používání Eclipse, které jsem také zvolil. Eclipse je vícejazyčné vývojové prostředí (Java, C, C++, aj.), rozšiřitelné pomocí pluginů. Pluginy mohou upravovat vzhled vývojového prostředí, ale mnohem častěji přidávají nějakou funkcionalitu. Po spuštění Eclipse je třeba ještě nainstalovat ADT (Android Development Tools) plugin, který obsahuje nástroje pro vývoj a ladění Android aplikací. V průběhu instalace pluginu je uživatel požádán o stažení nejnovější verze SDK (Software Development Kit). SDK obsahuje Android API (třídy, balíčky pro programování Android aplikací), systémové obrazy různých verzí OS pro emulaci.
3.1
Struktura projektu
Android projekt se skládá z adresářů a souborů (Obrázek 3).
14
Obrázek 3: Struktura projektu
Nejvýznamnější sobory a složky jsou: src – zde se nachází balíčky, které obsahují zdrojové kódy jednotlivých tříd. Zde obsažené soubory mají příponu .java. gen – obsahuje soubory, které automaticky generuje kompilátor. Je zde např. soubor R.java, který obsahuje názvy zdrojů aplikace, na které se lze za běhu programu odkázat. Mezi zdroje patří konstanty, řetězce, layouty (uživatelské rozhraní), menu, obrázky. assets – slouží pro uložení html souborů, zvukových souborů. bin – zde se nachází soubor s příponou .apk, což je spustitelná aplikace v Android zařízení. libs – do této složky se vkládají externí knihovny s příponou .jar.
15
res – fyzické uložení zdrojů. Zdroje jsou dále logicky členěny do podsložek. V podsložkách
drawable-xxx
jsou
obrázky
v různých
rozlišeních.
Například
v drawable-hdpi jsou obrázky pro zařízení s vysokým rozlišením obrazovky (high density pixel). Podsložka layout-xxx obsahuje popis uživatelského rozhraní v jazyku XML. Ve složce layout-port jsou xml soubory popisující vzhled uživatelského rozhraní na zařízeních v port (portrét) módu. Values-xxx obsahuje řetězce, pole, styly. AndroidManifest.xml – specifikace oprávnění, které bude aplikace vyžadovat, minimální verze OS Android nutná pro spuštění a další data konfiguračního charakteru.
16
Specifikace požadavků
4
Každý projekt by měl mít přesně vymezené požadavky. Požadavky na tento projekt jsou následující:
Návrh základního uživatelského rozhraní. Mapa, zprávy, navigace, zobrazení dat z vozidla.
Programování aplikace pro Android (jazyk JAVA, vývojové prostředí Eclipse).
Příjem GPS souřadnic z externího zařízení GP-317.
Ověření vhodnosti použití IC FT232R pro Android.
Pokud bude FT232R vyhodnocen jako nevhodný použít FT311D.
Testování komunikace USB/RS232.
Spojení s reálnou jednotkou GP-317.
Testování finální aplikace v cílovém zařízení.
Zobrazení polohy a navigování bez datového připojení.
Se zadavatelem jsme se dohodli, že některé požadavky se mohou v průběhu projektu měnit, protože při vývoji mohou nastat situace, které nelze dopředu odhadnout.
4.1
Diagram aktivit
Zobrazuje pohyb uživatele v budoucí aplikaci (Obrázek 4).
Obrázek 4: Diagram aktivit
17
5
Grafický návrh ikon
Aplikace je cílena na řidiče vozidel, proto byla požadována dobrá čitelnost a snadná orientace. Během studia platformy Android jsem se dozvěděl, že je dobrým zvykem, aby aplikace fungovala na různě velkých obrazovkách s odlišnou hustotou pixelů. Každý použitý obrázek v Android aplikaci by měl být zastoupen minimálně ve čtyřech různých rozlišeních (ldpi, mdpi, hdpi a xhdpi). Proto bylo nutné vytvořit ikony v nějakém vektorovém editoru. Zvolil jsem open-source vektorový editor Inkscape (Obrázek 5). Editor Inkscape ukládá kresby ve formátu SVG (Scalable Vector Graphics), který umožňuje export kresby v libovolném rozlišení bez ztráty kvality. Motivy ikon jsem nalezl v Open Clip Art Library (www.openclipart.org), kde jsou k dispozici vektorové kresby pod licencí Public Domain.
Obrázek 5: Vektorový editor Inkscape
18
6
Programování uživatelského rozhraní
Cenným
zdrojem
rad,
tipů
a
informací
pro
mě
byla
webová
stránka
http://developer.android.com/guide/components/index.html. Na této adrese se nachází odkazy k podrobně vysvětleným ukázkám kódů, které předvádí použití různých tříd. Dalším výborným zdrojem informací byla kniha Beginning Android 4 Application Development, Wei-Meng Lee. Jako poslední zdroj musím zmínit server www.stackoverflow.com. Zde se potkávají nadšení programátoři, kteří odpovídají na dotazy jiných programátorů. Na tomto serveru jsem našel spoustu vyřešených problémů okolo Androidu ale i programování obecně.
6.1
Základní komponenty použité v této práci
Základní komponenty jsou stavební bloky, které tvoří aplikaci. Jsou to třídy z Android API, ze kterých programátor vytváří podtřídy, překrývá potřebné metody, a upravuje další vlastnosti. Tyto třídy budu často zmiňovat v následujících kapitolách práce, proto je vysvětlím podrobněji. Activity (aktivita) Reprezentuje jednu obrazovku v aplikaci. Obsahuje uživatelské rozhraní. Uživatelské rozhraní je odděleno od aplikačního kódu v XML souboru. Rozhraní lze také dynamicky generovat za běhu. Každá aktivita prochází „životním cyklem“. Životní cyklus je tvořen metodami, které jsou volány od vytvoření aktivity až po její ukončení. Tyto metody nevolá programátor, ale operační systém. Fragment (fragment) Tato komponenta je podobná aktivitě. Nemůže existovat samostatně, vyskytuje se pouze uvnitř aktivity. Také obsahuje metody, které volá sám operační systém. Fragmenty jsou často přidávány a odstraňovány za běhu aplikace nebo měněny za jiné prvky uživatelského rozhraní. Fragmenty slouží pro programování komplexnějších uživatelských rozhraní.
19
Intent (úmysl) Objekt třídy Intent slouží pro spuštění aktivity nebo služby. Umožňuje posílat data mezi těmito komponentami. V referenci [7] se lze dočíst, že Intent se skládá z atributů: akce (co se má provést), data, kategorie (další informace o akci), typ dat, název komponenty (explicitní název komponenty, která vykoná Intent), dodatečná data (uložení elementárních informací). Service (služba) Vykonává dlouho-trvající úkoly bez interakce uživatele. Dlouhodobý úkol musí běžet v pracovním vlákně, jinak by uživatelské rozhraní mohlo „zamrznout“. Se službou může komunikovat více aktivit i aplikací. Služba prochází metodami životního cyklu, které volá systém.
6.2
Vlákna v Androidu
Vlákno je komponenta, která umožňuje paralelní běh části programu. Jazyk Java má v sobě zabudované třídy a mechanizmy pro práci s vlákny. Android umožňuje pro vlákna používat třídy z Javy, nicméně disponuje i vlastními třídami se svými specifiky. Vlákna a procesy jsou velmi dobře popsány v API průvodci [10]. Z tohoto průvodce jsem převzal hlavní myšlenky. Při spuštění aplikace je vytvořeno implicitní, hlavní vlákno. Hlavní vlákno vykonává události uživatelského rozhraní (stisk tlačítka, překreslení obrazovky). Ve výchozím stavu je vše prováděno v hlavním vlákně. Když si tuto skutečnost začínající programátor neuvědomí a naprogramuje dlouho-trvající úkol (čtení z databáze, síťový požadavek) v hlavním vlákně, tak dojde k jeho zablokování po dobu provádění tohoto úkolu. Blokace hlavního vlákna se uživateli jeví tak, že se nemění uživatelské rozhraní, i když uživatel např. stiskne tlačítko. Po pěti sekundách dojde k zobrazení dialogu „Aplikace neodpovídá“ s možností ukončení. Aby se zabránilo tomuto chování, musí všechny dlouho-trvající úkoly probíhat v pracovních vláknech. Programátor nemůže měnit uživatelské rozhraní z pracovního vlákna. Uživatelské rozhraní mění vždy pouze hlavní vlákno. 20
Android nabízí několik způsobů, jak z pracovního vlákna provést aktualizaci uživatelského rozhraní v hlavním vlákně:
6.3
metoda runOnUiThread() třídy Activity,
metoda post() třídy View,
použít objekt třídy Handler,
použít objekt třídy AsyncTask.
Úvodní obrazovka
Nejdříve bylo třeba naprogramovat úvodní obrazovku aplikace (Obrázek 6). Úvodní obrazovka slouží jako rozcestník a je tvořena šesti tlačítky. Po kliku se uživatel přesune do příslušné podobrazovky.
Obrázek 6: Úvodní obrazovka
Jak je zmíněno v odstavci 6.1, každá aktivita prochází „životním cyklem“. Jednou z metod životního cyklu je onCreate(): public class MainActivity extends Activity implements View.OnClickListener { private Button btn_navigation; private Button btn_transport; private Button btn_messages;
21
private Button btn_infrormation; private Button btn_settings; private Button btn_option;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity);
btn_navigation = (Button) findViewById(R.id.btn_navigation); btn_navigation.setOnClickListener(this); ... } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_navigation: startActivity(new Intent(this, NavigationActivity.class)); break; case R.id.btn_transport: startActivity(new Intent(this, TransportActivity.class)); break; ... default: break; } } }
V metodě
onCreate()
je
nastaveno
uživatelské
rozhraní
pomocí
metody
setContentView(), která jako parametr přebírá XML soubor popisující toto rozhraní.
22
Metoda onClick() je vyvolána pokaždé, když uživatel stiskne nějaké tlačítko. Podle toho, jaké tlačítko bylo stisknuto, se vytvoří nová aktivita a spustí se.
6.4
Nastavení
Podobrazovka nastavení se dělí na dvě sekce – uživatelské nastavení (pro řidiče) a administrátorské nastavení (pro nadřízeného). V uživatelském nastavení je možné měnit intenzitu jasu. Administrátorské rozhraní (Obrázek 7) je přístupné pouze po zadání hesla a umožňuje editaci přeprav.
Obrázek 7: Administrátorské nastavení
V levé části obrazovky je výčet položek, které lze měnit. Zatím je zde pouze jedna položka, nicméně do budoucna lze snadno doprogramovat další, například změnu hlavního
hesla.
V pravé
části
obrazovky
se
zadávají
přepravy
ve
tvaru
ID(mezera)komodita. Tyto přepravy se ukládají do speciálního XML souboru, kterému se říká SharedPreferences. Tento soubor slouží pro ukládání uživatelských předvoleb. Předvolby se ukládají v páru, klíč-hodnota. Android API nabízí třídy, které jsou přímo navržené pro ukládání uživatelských předvoleb. CheckBoxPreference, EditTextPreference nebo ListPreference a další. Tyto třídy programátorovi velmi usnadňují práci, protože se nemusí starat o ukládání do souboru, vše se děje „automaticky“. Tyto třídy jsem zpočátku používal, ale pak jsem 23
narazil na jednu nepříjemnou věc. Když bylo třeba změnit zásadním způsobem uživatelské rozhraní, tak to šlo velmi těžko nebo vůbec. Vyřešil jsem to napsáním vlastní třídy pro ukládání předvoleb, čímž jsem docílil oddělení uživatelského rozhraní od způsobu ukládání dat. Samotné ukládání probíhá následujícím způsobem. Po stisknutí tlačítka „Uložit“ se obsah komponenty EditText převede na řetězec a ten se předá jako parametr metodě toArrayList(). Tato metoda má za úkol převést řetězec, který obsahuje ID a názvy komodit na pole objektů Commodity. V případě že jsou vstupní data bez chyby, je uživatel upozorněn textem „Uloženo“, v opačném případě textem „Vstupní data obsahují chybu“. Vstupní řetězec je uložen vždy, i když obsahuje chyby. Při zadávání dlouhého seznamu přeprav by uživatel v případě chyby musel tuto proceduru opakovat, což by bylo pracné. Takto se uživatel může k vstupním datům později vrátit a opravit je. public static ArrayList
toArrayList(String input) { ArrayList list = new ArrayList(); // default delimiter is whiteSpace Scanner scanner = new Scanner(input);
boolean isInputOk = true; do { try { String token = (String) scanner.next(); int id = Integer.parseInt(token); String name = scanner.next(); list.add(new Commodity(id, name)); } catch (Exception e) { isInputOk = false; } } while (scanner.hasNext() && isInputOk); return (isInputOk ? list : null); }
24
Java nabízí třídu Scanner, která usnadňuje parsování textu. Programátor si může zvolit oddělovač, který je defaultně jakýkoliv bílý znak. Metoda toArrayList() je volaná dvakrát. Jednou při ukládání vstupního řetězce (ověření správnosti) a podruhé při zobrazování názvů komodit v aktivitě Přepravy.
6.5
Zprávy
Zobrazení zpráv využívá dvou-sloupcový layout (Obrázek 8). V levém sloupci je zobrazeno datum a čas příchozí zprávy. Po kliknutí na zprávu se v pravém sloupci zobrazí obsah.
Obrázek 8: Zobrazení zpráv
6.5.1 Ukládání a zobrazení zpráv Zprávy jsou po přijetí ukládány do databáze. Android poskytuje relační databázi SQLite, což je odlehčená verze standardní SQL databáze. Nejdůležitější třída je MessageDbAdapter. Tato třída poskytuje metody pro otevření a uzavření databázového spojení, přidání nové zprávy, mazání zpráv. Třída IncomMessageFragment obsahuje objekt třídy MessageDbAdapter. Načítání zpráv z databáze probíhá v pracovním vlákně. Pro asynchronní úlohy slouží potomek třídy AsyncTask, který programátorovi umožňuje vyhnout se přímé manipulaci s vlákny. AsyncTask má tři generické parametry: první specifikuje typ prvků pole, které je v parametru metody 25
doInBackground(), druhý specifikuje typ prvků pole, které je v parametru metody onProgressUpdate() (není implementována, proto Void) a třetí specifikuje typ parametru metody onPostExecute(). Jak napovídají názvy metod, dlouhodobý úkol provádí doInBackground() v pracovním vlákně. Jakmile je úkol dokončen, provede se nějaká akce (většinou změna UI) v hlavním vlákně v metodě onPostExecute(). private class FetchMessagesTask extends AsyncTask<MessageDbAdapter, Void, Void> { @Override protected Void doInBackground(MessageDbAdapter... dbAdapter) {
dbAdapter[0].open(); mItems = (LinkedList<Message>) dbAdapter[0].getAllMessages(); dbAdapter[0].close(); return null; }
@Override protected void onPostExecute(Void result) { // mAdapter methods must be called only from the main thread mAdapter.clear(); mAdapter.addAll(mItems); mDialog.dismiss(); // select the first message IncomMessageFragment.this.clickOnItem(0); } }
6.5.2 Příjem zprávy Nová zpráva může přijít kdykoliv, a nezáleží na tom, v jaké aktivitě se uživatel nachází. O síťové spojení se stará potomek třídy Service. Jakmile je přijata nová zpráva, dojde k zápisu do databáze a vyvolání notifikace (upozornění uživatele). Zpráva však může 26
přijít i ve chvíli, kdy si uživatel prohlíží příchozí zprávy. Musí dojít k překreslení obrazovky. V takovém případě musí existovat komunikace aktivity, která zajišťuje zobrazování zpráv a třídy Service. Tuto komunikaci obstarává potomek třídy BroadcastReceiver. public class IncomMessageFragment extends Fragment implements View.OnClickListener { ... @Override public void onResume() { super.onResume(); getActivity().registerReceiver(broadcastReceiver, mIntentFilter); }
@Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(broadcastReceiver); }
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // when this activity is visible and new message is received, // screen must be redrawn mDialog = ProgressDialog.show(getActivity(), "Nová zpráva.", " ", true); new FetchMessagesTask().execute(mDbAdapter); } }; ... }
27
Když aktivita zobrazující příchozí zprávy přejde do stavu Resumed, je v metodě onResume() zaregistrován objekt třídy BroadcastReceiver. Při příjmu nové zprávy pošle potomek třídy Service broadcast-zprávu a vyvolá se metoda onReceive(), ve které dojde k znovu-načtení zpráv z databáze. Pokud není aktivita viditelná, je v metodě onPause() BroadcastReceiver odhlášen.
6.6
Informace
Obrázek 9: Informace
Zobrazení informací ilustruje Obrázek 9. Informace jsou graficky rozděleny do 4 sekcí: Motor, Gps, Přepravovaná komodita a Přesný čas. V sekci „Motor“ je zobrazována aktuální rychlost vozidla a otáčky motoru. Tyto hodnoty jsou aktualizovány pokaždé, když je přijat nový Gps paket. V sekci „Gps“ se zobrazují aktuální GPS souřadnice. Sekce „Přepravovaná komodita“ zobrazuje aktuální přepravovaný náklad. Náklad lze změnit v podobrazovce Přepravy. Přesný čas nezobrazuje systémový čas tabletu, ale čas, který je obsažen v Gps paketu.
6.7
Přepravy
Tato podobrazovka (Obrázek 10) slouží pro řidiče, který může rychle vybrat přepravovanou komoditu. Po výběru by mělo dojít k odeslání ID komodity přes síťové
28
spojení. Odeslání ID zatím není implementováno, protože WiFi modul není připraven na příjem ID.
Obrázek 10: Nastavení přeprav
6.8
Navigace
Volba mapové části aplikace se odvíjela od specifikace požadavků. Bylo požadováno zobrazení aktuální polohy nad mapou a navigaci na zaslanou souřadnici. Aktuální polohu musí být možné zobrazit offline a navigování musí fungovat také bez datového připojení. Z těchto požadavků je patrné, že není v silách jednoho programátora vše naprogramovat od začátku. Problematika zobrazování mapových dlaždic včetně navigace je natolik rozsáhlá, že by pokryla další samostatný projekt. Proto bylo třeba vhodně vybrat existující řešení, tj. uvážit dostupnost zdrojových kódů (případně API) a cenu.
6.8.1 Existující navigační aplikace Google maps Google maps (Obrázek 11) je jedna z nejznámějších a nejrozšířenějších mapových aplikací pro Android. „Mezi hlavní funkce patří podrobné mapy s 3D budovami, hlasově řízená navigace (navádění auta, cyklisty i pěšího), živé dopravní informace, 29
vyhledávání zájmových míst v okolí (restaurace, ubytování), Google Maps Street View (na daném místě se lze virtuálně procházet), vnitřní mapy vybraných letišť, hotelů a obchodních domů.“ [8] Aplikaci jsem testoval na svém telefonu. Mapy lze stáhnout offline ve formě „dlaždic“ pouze do určité hodnoty zoomu a je také omezen maximální počet dlaždic. Navigace potřebuje datové připojení, nefunguje offline. Pro celkovou práci s mapami je potřeba datové připojení – restaurace či penziony nelze vyhledat offline.
Obrázek 11: Navigace Google Maps
OsmAnd „OsmAnd (Obrázek 12) je navigační aplikace, která používá volně šiřitelné OSM (Open Street Map) mapové podklady. Je možné stáhnout mapy pro celý stát a uložit je na externí paměťovou kartu pro offline použití. Navigace je přizpůsobena pro potřeby auta, cyklisty i pěšího. Navigace i zobrazení aktuální polohy fungují v režimech online i offline. Hlavní rysy aplikace jsou: hlasová navigace, odhadovaný čas přijetí do cíle, podpora průjezdních míst, automatické přepočítání trasy při vychýlení, vyhledávání zájmových míst (hotely, čerpací stanice, muzea) dle adresy nebo geografických 30
souřadnic. Při navigaci dochází k automatickému natáčení mapy dle směru pohybu uživatele, nejdůležitější místa lze uložit do oblíbených.“ [9] OsmAnd nenabízí žádné API, ale lze stáhnout kompletní zdrojové kódy, které jsou veřejně k dispozici. Pomocí třídy Intent lze z jiné aplikace zobrazit bod nebo adresu na mapě. To není pro účely tohoto projektu dostatečné řešení. Možným řešením je manuální úprava zdrojových kódů.
Obrázek 12: Navigace OsmAnd
Sygic V obchodě Google Play má přízvisko „nejstahovanější offline navigace na světě“. Má velmi povedené grafické rozhraní (Obrázek 13). „Hlavní odlišností této navigace oproti ostatním offline řešením je, že nepoužívá OSM mapy, ale TomTom mapy. Sygic nabízí po zakoupení licence doživotní aktualizace map. Aplikace podporuje 3D hardwarovou akceleraci, upozornění na změnu dopravní situace v reálném čase, čtení názvů ulic v angličtině, multi-dotykové ovládání, automatické natáčení mapy podle pohybu, upozornění na překročení rychlosti, předpověď počasí v dané oblasti, integraci sociálních sítí (Facebook, Twitter), body zájmu aj.“ [5] 31
Sygic nabízí verzi Sygic Fleet. SygicFleet je samostatná aplikace, které umožňuje zabudovat navigaci do jiných aplikací na platformách Windows, Android, Linux. Sygic SDK poskytuje komunikaci mezi Sygic Fleet a uživatelskou aplikací. V API dokumentaci jsem našel funkci StartNavigation, která umožňuje spustit navigaci k zadanému cíli. Nenašel jsem ale žádný způsob, jak změnit zdroj GPS souřadnic.
Obrázek 13: Navigace Sygic
6.8.2 Zvolené řešení Aplikace
Licence
Dostupnost zdrojových kódů
Offline navigace
Velikost map ČR
Cena
Google maps
komerční
ne, pouze API
ne
nezjištěno
Zdarma
OsmAnd
GPLv3
ano
ano
364 MB
Sygic
komerční
ne, placené API
ano
134 MB
Zdarma / 170Kč 30 € (750 Kč)
Tabulka 1: Porovnání navigačních aplikací
Hlavním požadavkem bylo fungování bez připojení k internetu. Google maps nelze použít bez datového připojení. Druhým kritériem byla dostupnost zdrojových kódů nebo 32
API, přes které by šlo programově měnit aktuální GPS souřadnici a cíl navigace. U navigace Sygic jsem nenašel žádný způsob, jak změnit zdroj souřadnic. U navigace OsmAnd jsem věděl, že budu mít k dispozici kompletní zdrojové kódy, tudíž zdroj souřadnic půjde nějak nahradit. Z tohoto důvodu a také kvůli nulové ceně zvítězila aplikace OsmAnd. Podrobnější parametry jednotlivých navigací shrnuje Tabulka 1.
6.8.3 Získání zdrojových kódů OsmAndu Zdrojové kódy se nachází na: https://github.com/OsmAndapp/OsmAnd. Vývojáři používají distribuovaný verzovací systém Git. Vývojové prostředí Eclipse podporuje spolupráci s Gitem pomocí pluginu Egit. Egit umožňuje práci s verzovacím systémem pomocí grafického rozhraní místo příkazů. Po instalaci pluginu stačí vybrat v menu položku Import, kde programátor zadá, zde chce klonovat lokální nebo vzdálený repozitář2. Po zadání URL adresy se zdrojové kódy ve výchozím nastavení stáhnou do složky Git v domovském adresáři uživatele. Zdrojové kódy OsmAndu jsou přístupné pod licencí GNU Public License version 3. „GPL definuje 4 základní práva, které má každý uživatel volně šiřitelného softwaru:
svoboda užívat software za jakýmkoliv účelem,
svoboda měnit software, aby vyhovoval požadavkům uživatele,
svoboda sdílet software s kamarády, sousedy,
svoboda sdílet změny, které uživatel provede.
Tato licence umožňuje použít zdrojové kódy i v komerčních projektech, avšak je nutné poskytnout upravené zdrojové kódy veřejnosti k dalšímu použití.“ [12]
6.8.4 Úprava zdrojových kódů OsmAndu Aplikace OsmAnd je poměrně rozsáhlá. Skládá se ze dvou samostatných projektů, Java projektu a Android projektu.
2
Obsahuje soubory a složky, které jsou spravovány (zálohovány) verzovacím systémem.
33
Java projekt obsahuje přibližně 30 balíčků a jsou zde definované třídy pro: správu mapových objektů (banky, nemocnice, školy), správu entit (města, ulice), typy vykreslovaných objektů (mnohoúhelníky, posloupnosti čar, body), filtrování bodů zájmu (POIs), mapové algoritmy a vlastní kolekce. Android projekt obsahuje navigační službu, která běží na pozadí. Dále obsahuje třídy zajišťující zobrazení uživatelského rozhraní – aktivity, dialogy. Vývojáři pamatovali i na nevidomé uživatele. Jsou zde třídy pro usnadnění přístupnosti, které obsahují mluvené dialogy a popisky. Programové nastavení cíle Prvním úkolem bylo programově nastavit cíl navigace. Tohoto usnadnění budou využívat řidiči vozidel. Když přijde řidiči nová zpráva se speciálním odkazem (značkou), tak stačí pouze klepnout na tento odkaz a automaticky dojde k nastavení nového cíle navigace. Z pohledu uživatele existuje v aplikaci aktivita, kde lze manuálně zadat GPS souřadnice a stiskem tlačítka je nastavit jako cíl. Rozhodl jsem se, že nejprve začnu v kódu hledat toto tlačítko, které je zodpovědné za nastavení cíle. Využil jsem nástroje Vyhledat/Nahradit, který má dnes jakékoliv IDE. Hledal jsem řetězec „Nastavit jako cíl“, který se nacházel na hledaném tlačítku. Po chvíli hledání jsem našel událost, která obsluhuje stisk tohoto tlačítka, nachází se v aktivitě NavigatePointActivity: ((Button)findViewById(R.id.Cancel)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(dlg == null){ showOnMap(true); } else { close(); } } });
Po stisku tlačítka se vyvolá metoda showOnMap() s parametrem „true“. V této metodě je větvení a volají se další metody, takže jsem musel použít logovací výpisy, abych 34
zjistil, kudy program „prochází“. Za nastavení cíle jsou zodpovědné metody objektů OsmAndSettings, TargetPointsHelper a statická metoda třídy MapActivity. Aktivita MapActivity je aktivní, když jsou uživateli zobrazovány mapy. V této třídě jsem v metodě onCreate() vytvořil kód, který programově nastaví cíl: Intent intentToNavigate = getIntent(); if(intentToNavigate != null && intentToNavigate.getExtras() != null){ double latitude = intentToNavigate.getExtras().getDouble("latitude"); double longitude = intentToNavigate.getExtras().getDouble("longitude"); final TargetPointsHelper targetPointsHelper = getTargetPoints(); String name = getString(R.string.point_on_map, latitude, longitude); settings.setPointToNavigate(latitude, longitude, true, name); targetPointsHelper.updatePointsFromSettings(); }
V praxi probíhá nastavení cíle tak, že z aplikace TerminalEbus vyvolám aktivitu MapActivity z aplikace OsmAnd. Poté dojde k provedení metody onCreate(), ve které je výše uvedený kód a dojde k nastavení nového cíle navigace. Změna zdroje GPS souřadnic Android zařízení, která mají GPS senzor, získávají GPS souřadnice z tohoto čipu. Úkolem bylo nahradit tento senzor jednotkou GP-317, která dodává vlastní GPS souřadnice. Testovací tablet Point of View nemá zabudovaný GPS senzor, to ale nebyl hlavní důvod pro náhradu zdroje souřadnic. Hlavním důvodem bylo, že jednotka GP- 317 získává GPS souřadnice rychleji (má externí anténu) a navíc poskytuje další informace ve vlastním paketu. V následujícím textu popíšu, jak funguje získávání GPS souřadnic v OS Android. Čerpal jsem především z online dostupné reference. [2] O polohu zařízení se v Androidu starají třídy z balíčku android.location. Nejdůležitější třídy jsou: LocationManger, LocationProvider, Location a rozhraní LocationListener. LocationProvider hraje roli poskytovatele souřadnic. Poskytovatelem může být GPS systém, okolní WiFi síť nebo síť mobilního operátora. Tito poskytovatelé se liší svými kritérii, jako přesnost polohy, spotřeba baterie a cena. Poskytovatel se vybírá vždy podle 35
konkrétních potřeb aplikace, někdy stačí znát polohu uživatele na úrovni města (WiFi síť nebo mobilní síť), jindy zase na úrovni ulice (GPS systém). Location slouží jako „přepravka“ pro GPS souřadnice a další informace – čas, nadmořská výška, rychlost, přesnost, poskytovatel a kurz. LocationListener je rozhraní, které definuje, jaké metody musí implementovat „posluchači“ GPS souřadnic. Obsahuje 4 metody, které jsou volány, když nastane nějaká akce. Mohou nastat tyto akce: onLocationChanged (změna souřadnic), onProviderDisabled (uživatel zakázal poskytovatele) onProviderEnabled (uživatel povolil poskytovatele), onStatusChanged (změna stavu poskytovatele). LocationManager je systémová služba. Když se uživatel přiblíží k určitému místu (souřadnicím), může na to být vybraná aktivita upozorněna. Mezi nejdůležitější metody patří:
getLastKnownLocation
requestLocationUpdates „posluchače“).
(dotaz
(přihlášení
Z přihlašovacích
na
poslední
„posluchače“), a odhlašovacích
získané
souřadnice),
removeUpdates metod
lze
(odhlášení
odvodit,
že
LocationManager využívá návrhového vzoru Observer (pozorovatel). Instanci LocationManagera nelze vytvořti klasicky pomocí konstruktoru, to napovídá, že se také jedná o návrhový vzor Singleton (jediná instance). Návrhové vzory jsou osvědčené postupy, jak řešit často se vyskytující programátorské problémy. Vzor Observer lze jednoduše popsat slovy: „Jakmile se něco stane, dej vědět přihlášeným posluchačům.“ Po seznámení se systémem poskytování GPS souřadnic v Androidu jsem se rozhodl nahradit
některé
z výše
uvedených
tříd
vlastními.
Napsal
jsem
rozhraní
LocationListener a vlastní třídu LocationManager. UML diagram tohoto řešení zachycuje Obrázek 14.
36
Obrázek 14 : Aplikace návrhového vzoru Observer
Když chce MapActivity nebo NavigationService získávat GPS souřadnice, získá pomocí statické metody getInstance() odkaz na objekt třídy LocationManager. Poté na tomto objektu zavolá metodu requestLocationUpdates(), kde v parametru předá odkaz na sebe samu. Když uživatel opustí navigační aplikaci, třídy MapActivity a NavigationService se odhlásí
z odběru
souřadnic
pomocí
metody
removeUpdates()
u
objektu
LocationManager. Příjem GPS souřadnic probíhá v pracovním vlákně, ale aktualizace uživatelského rozhraní musí proběhnout v hlavním vlákně. Proto LocationManager obsahuje objekt třídy Handler, který přes rozhraní Callback volá metodu handleMessage(). Kód metody handleMessage() je vždy proveden v hlavním vlákně. Takto je zajištěno, že upozornění „posluchačů“ (LocationListener) proběhne v hlavním vlákně aplikace. 37
7
Komunikace tabletu s GP-317
7.1
Struktura testovacího GPS paketu
Firma ECS Invention má pro různé účely definované různé pakety. Pro získání informací z GPS paketu je nutné znát jeho strukturu, tj. na kolikátém bajtu začíná určitá hodnota a co znamená. Pro účely testování komunikace vysílala jednotka GP-317 paket, jehož strukturu znázorňuje Tabulka 2.
Tabulka 2 : Struktura GPS paketu
Paket obsahuje typ, délku následujících dat, čas, datum, X-souřadnici (zeměpisná délka), Y souřadnici (zeměpisná šířka), rychlost, otáčky motoru, značky (kvadrant souřadnic x a y). Data paketu mají velikost sedmnáct bajtů a tyto data bylo třeba správně interpretovat. Hodnoty jsou v binární podobě, pouze pole „Značky“ je třeba číst po bitech.
7.2
Drátové řešení – sériový kanál
Navrhované spojení Android tabletu a jednotky GP-317 znázorňuje Obrázek 15.
Obrázek 15: Drátové řešení
38
7.2.1 Čip FT311D
Obrázek 16: FT311 Dev Board
Firma ECS Invention mi poskytla vývojový kit FT311 Dev Board (Obrázek 16) za účelem testování komunikace s tabletem. Jako testovací tablet sloužil model TABPROTAB2XXL (Android 4.0) od výrobce Point Of View. FT311D slouží jako most mezi periferií připojenou jedním z šesti rozhraní (UART, PWMs, SPI Master, SPI Slave, GPIOS, I2C Master) a Android zařízením s USB portem. Způsob propojení „mode“ pinů na vývojové desce určuje, jaké rozhraní se bude používat. Já jsem testoval rozhraní UART. Dále bylo nutné propojit piny UART_TXD s UART_RXD a UART_RTS s UART_CTS. Propojením vysílacích pinů s přijímacími piny se vytvoří smyčka. Cílem testu komunikace bylo odeslat libovolná data z tabletu a tyto data opět přijmout a zobrazit. Čip FT311 by měl komunikovat s jakýmkoliv Android zařízením, které podporuje Android Open Accessory (AOA) protocol. AOA protocol umožňuje komunikaci periferie s Android zařízením prostřednictvím USB kabelu. [4] Na webových stránkách výrobce čipu, firmy FTDI, je ke stažení komunikační demo (UARTDemoActivity.apk) včetně zdrojových kódů. Tento demo program jsem použil k testování komunikace. Tablet jsem propojil s čipem a v demo-aplikaci ponechal výchozí komunikační parametry. Zkusil jsem odeslat testovací řetězec „asdf“. Nic se však nestalo, žádná data se nevrátila. Zajímalo mě, 39
v čem je problém. Prozkoumal jsem zdrojové kódy demo-aplikace a pomocí chybových výpisů jsem zjistil, že hodnota objektu OutputStream je null. Objekt OutputStream je zodpovědný za vysílání dat z tabletu. Zjistil jsem, že data se ani neodešlou. Otázkou však zůstává, proč se data neodešlou? Na www.youtube.com jsem našel video, ukazující komunikaci tabletu a čipu FT311. Zde vše fungovalo. Kontaktoval jsem autora tohoto videa, zda neví, proč moje komunikace nefunguje. Odpověděl mi, ať zkontroluji, existenci těchto souborů v Android zařízení:
/system/framework/com.android.future.usb.accessory.jar,
/system/etc/permissions/android.hardware.usb.accessory.xml.
Soubor com.android.future.usb.accessory.jar na tabletu chyběl. Výrobce Point of View zřejmě neudělal ovladače pro Android Open Accessory protokol. Došel jsem k závěru, že tablet výrobce Point Of View nepodporuje Open Accessory protocol a komunikace s FT311 není možná. Po tomto zjištění jsem se s vedoucím práce dohodl, že půjdeme cestou bezdrátové komunikace přes WiFi modul. Přibližně měsíc před dokončením projektu si můj kamarád koupil tablet výrobce GoClever s verzí Android 4.1. Oba výše uvedené soubory se v tomto tabletu nacházeli. Zkusil jsem komunikaci tohoto zařízení s FT311D a byla úspěšná. Zajímalo mě, zda je komunikace úspěšná i na jiných zařízeních s verzí Android 4.1. Požádal jsem jiného kamaráda, který vlastní mobilní telefon Samsung Galaxy S3, jestli můžu vyzkoušet komunikaci s jeho telefonem. I v tomto případě byla komunikace úspěšná. Z tohoto mini-průzkumu jsem usoudil, že FT311D komunikuje s jakýmkoliv zařízením, které má minimální verzi Android 4.1. V budoucím vývoji aplikace zřejmě dojde k zakoupení tabletu s verzí Android 4.1 a zrealizuje se původní záměr, vytvoření sériového kanálu přes FT311D.
7.2.2 Čip FT232R Se zástupcem ECS Invention jsme se rozhodli tento čip netestovat. Hlavním důvodem by byla složitá softwarová implementace. Pro otestování komunikace by bylo nutné
40
stáhnout zdrojové kódy OS Android a provést zásah do kernelu. Bylo by nutné zahrnout do kernelu ovladač pro komunikaci s FT232R. Většina výrobců upravuje OS Android a vydává vlastní verze. Hlavní nevýhodou tohoto postupu by byl zásah do kernelu pro každý tablet, který má jiného výrobce.
7.3
Bezdrátové řešení
Obrázek 17: Bezdrátové řešení
7.3.1 Hardware Po neúspěšných pokusech s čipy FTDI přišla na řadu bezdrátová komunikace. Spojení tabletu a jednotky GP-317 ilustruje Obrázek 17. Jednotka GP-317 nebyla v době testování k dispozici. Obdržel jsem jednotku GP-316, která pro vývojové účely plně dostačovala. Jednotku GP-316 zachycuje Obrázek 18. WiFi modul odhaluje Obrázek 19.
Obrázek 18: Jednotka GP-316
41
Obrázek 19: WiFi modul
7.3.2 Možnosti implementace síťové komunikace Síťová komunikace je dlouho trvající úkol, který musí probíhat v pracovním vlákně. Existuje více možností, jak tento úkol naimplementovat. Já jsem se zvažoval použítí třídy AsyncTask nebo třídy Thread. V dokumentaci třídy AsyncTask se píše, že je vhodnější pro kratší operace trvající několik sekund. Síťová komunikace poběží neustále, protože nová zpráva může přijít kdykoliv. Proto jsem se rozhodl využít třídu Thread.
7.3.3 Programování síťové komunikace Programátor ECS Invention se staral o programování WiFi modulu, který zaujímal roli serveru. Já jsem programoval klienta (tablet). WiFi modul vysílá GPS paket v pětisekundových
intervalech
pomocí
protokolu
UDP.
WiFi
modul
zvládá
i spolehlivější protokol TCP. Nicméně UDP protokol byl použit z důvodu snažší implementace na straně WiFi modulu. Jednou ze základních stavebních komponent, které Android nabízí je třída Service. Tato třída často zajišťuje provádění nějaké úlohy na pozadí. V mém případě jsem tuto komponentu použil pro síťové spojení s WiFi modulem. Vytvořil jsem potomka třídy Service a nazval ho WifiService. WifiService obsahuje dva důležité objekty – LocationManager a UiUpdater. LocationManager rozesílá GPS 42
souřadnice přihlášeným „posluchačům“ (třídy, které mají zájem o GPS souřadnice). Objekt třídy UiUpdater má v sobě objekt třídy Handler. Handler je zodpovědný za provádění ukolů v hlavním vlákně aplikace. public void catchUdpPackets() { new Thread(new Runnable() {
@Override public void run() { DatagramSocket udpSocket = null;
try { udpSocket = new DatagramSocket(PORT);
byte[] buffer = new byte[DATA_SIZE]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); do { udpSocket.receive(packet); byte[] data = packet.getData(); Decoder decoder = new Decoder(data); if(decoder.isGpsOK()){ locationManager.notifyListeners(data); Log.d(tag, "GPS ok"); } else{ //display Toast, GPS isn't OK Message msg = Message.obtain(); msg.what = UiUpdater.GPS_NOT_OK; uiUpdater.sendMessage(msg); }
43
//send data to InformationActivity in //TerminalEbus Intent intent = new Intent(GPS_PACKET); intent.putExtra(GPS_PACKET, data); sendBroadcast(intent); } while (!stopThread); } catch (Exception e) { Log.d(tag, "LocationManager: Exception" + e); } finally { if (udpSocket != null) { udpSocket.close(); } } } }).start();
Celá síťová komunikace probíhá v pracovním vlákně. Pracovní vlákno je vytvořeno objektem třídy Thread, který jako parametr přepírá objekt rozhraní Runnable. Odstartování vlákna provádí metoda start(). V metodě run() objektu Runnable je kód, který zajišťuje příjem UDP paketu. Nejdříve je vytvořen DatagramSocket, který jako parametr přebírá číslo portu. Na čísle portu jsem se dohodl s programátorem ECS Invention, protože obě komunikující strany musí mít stejné číslo portu. Dále je pomocí třídy DatagramPacket vytvořen prázdný paket o velikosti 20 bajtů. V cyklu do-while probíhá příjem a dekódování paketu. Dekódování paketu zajišťuje třída Decoder. Pokud jsou GPS souřadnice platné (nemusí tomu tak být vždy, např. když auto projíždí tunelem), pak LocationManager upozorní posluchače v aplikaci OsmAnd pomocí metody notifyListeners(). Na zobrazené mapě dojde k překreslení ikony, která znázorňuje pohybující se objekt. Jestliže jsou souřadnice neplatné, dojde ke krátkému upozornění uživatele pomocí třídy UiUpdater.
44
Po příjmu paketu je poslána broadcast zpráva, která obsahuje data paketu. Pokud má nějaká aktivita zájem o tuto zprávu, zaregistruje si objekt třídy BroadcastReceiver. InformationActivity přijimá tuto zprávu a pomocí třídy Decoder interpretuje zasílaná data. Pokud se během komunikace vyskytne nějaká chyba, je vyjímka zachycena v bloku catch. Blok finally je proveden vždy, nezáleží na tom, zda je komunikace úspěšná. Tento blok provede uzavření DatagramSocketu a uvolnění paměti.
45
8
Závěr
8.1
Rozšíření a vylepšení aplikace
V nadcházejících měsících se počítá s dalším vývojem aplikace. Programátor ECS Invention implementuje příjem zpráv a ID komodity na straně serveru (WiFi modul nebo GP-317). Po dokončení prací na serveru bude možné vyvíjet další schopnosti klienta (tablet). U zpráv bude doděláno odeslání a příjem zprávy, zatím je hotové pouze uživatelské rozhraní, které je odzkoušené simulací. Možná přibude další záložka v horní části zpráv – odeslané zprávy. Do nastavení se budou přidávat malé ikony pro rychlejší orientaci. V přepravách bude doděláno odesílání ID přepravované komodity. Je možné, že se změní způsob komunikace a místo bezdrátového spojení se přejde na drátové pomocí čipu FT311D.
8.2
Zhodnocení
Práce na reálné aplikaci z praxe mi dala spoustu nových zkušeností. Programátor by měl mít přehled o různých technologiích, rychle hledat nová řešení, ale také maximálně využívat existující aplikace. Je vhodné mít ponětí o základních návrhových vzorech. Důležitá je znalost alespoň jednoho verzovacího systému. Při programování jsem žádný nepoužíval a tím spíše jsem na vlastní kůži zažil úskalí, které takové rozhodnutí přináší. Uvědomil jsem si, jak mocným nástrojem je simulace. Ze začátku projektu jsem neměl k dispozici jednotku GP-316. To však nevadilo, protože příjem GPS souřadnic šlo nasimulovat. Nejdříve jsem aplikaci OsmAnd „podsouval“ fiktivní souřadnice, které byly pevně stanoveny. Jakmile jsem otestoval, že tato simulace funguje, nebyl problém nahradit pevné souřadnice skutečnými. Obdobně jsem postupoval při přijímání nových zpráv. Při programování školních úkolů student většinou píše kód aplikace od začátku do konce a pracuje sám. V praktickém světě programování se pracuje v týmu a programátor se musí zorientovat v cizím kódu a musí být schopný ho upravovat.
46
Dozvěděl jsem se přesné informace o tom, jak funguje sledování aut pomocí GPS. Dále také o tom, jak jsou některá řešení povedená, ale ve firemním prostředí nemusí uspět, protože se vždy zohledňuje finanční stránka věci. Díky této aplikaci mi bylo umožněno hlouběji se seznámit s problematikou programování OS Android. Naučil jsem se řešit některé praktické úlohy, jako práce s databází, síťová komunikace nebo tvorba uživatelského rozhraní.
47
Použitá literatura [1] Android (operating system). In: Wikipedia, the free encyclopedia [online]. 29 June 2012 [cit. 2013-05-22]. Dostupné z: http://en.wikipedia.org/wiki/File:AndroidSystem-Architecture.svg [2] Android.location. Android Developers [online]. 01 May 2013 [cit. 2013-05-08]. Dostupné z: http://developer.android.com/reference/android/location/packagesummary.html [3] BOŘÁNEK, Roman. Linuxové novinky: V roce 2016 Android překoná Windows. O počítačích, IT a internetu - Živě.cz [online]. Mladá fronta, 14.11.2012 [cit. 2013-01-01]. Dostupné z: http://www.zive.cz/clanky/linuxove-novinky-vroce-2016-android-prekona-windows/sc-3-a-166323/default.aspx [4] Build Accessories for Android. Android Open Source [online]. [2012] [cit. 2013-05-15]. Dostupné z: http://source.android.com/tech/accessories/ index.html [5] Features. Sygic | Sygic GPS Navigation Offline for Android [online]. © 2004 - 2013 [cit. 2013-04-30]. Dostupné z: http://www.sygic.com/en/android [6] Google Buys Android for Its Mobile Arsenal. In: Businessweek - Business News, Stock market & Financial Advice [online]. 16. 8. 2005 [cit. 2013-01-06]. Dostupné z: http://www.businessweek.com/stories/2005-08-16/google-buys-android-for-itsmobile-arsenal [7] Intent. Android Developers [online]. 01 May 2013 [cit. 2013-05-15]. Dostupné z: http://developer.android.com/reference/android/content/Intent.html [8] Maps: Android Apps on Google Play. Google Play [online]. 12 March 2013 [cit. 2013-04-28]. Dostupné z: https://play.google.com/store/apps/details?id=com.google.android.apps.maps&hl=e n_GB [9] OsmAnd Functionality: Global Mobile Map Viewing & Navigation for Offline and Online OSM Maps. Welcome To OsmAnd [online]. 01 April 2013 [cit. 2013-04-29]. Dostupné z: http://osmand.net/en/blog/59-welcome-osmand.html 48
[10] Processes and Threads: Threads. Android Developers [online]. [2013] [cit. 2013-05-14]. Dostupné z: http://developer.android.com/guide/components/processes-and-threads.html [11] RAMOS, Pablo. Boxer SMS Trojan: Malware as a Global Service. We Live Security [online]. 29.11.2012 [cit. 2013-01-10]. Dostupné z: http://www.welivesecurity.com/2012/11/29/android-boxer-a-worldwide-smstrojan/ [12] SMITH, Brett. A Quick Guide to GPLv3. A Quick Guide to GPLv3 - GNU Project - Free Software Foundation (FSF) [online]. 2013/02/28 [cit. 2013-04-30]. Dostupné z: http://www.gnu.org/licenses/quick-guide-gplv3.html
49
Seznam zkratek OS
Operační systém
OSM Open Street Map URL Uniform Resource Locator GPS
Global Positioning System
USB
Universal Serial Bus
WiFi Wireless Fidelity SMS
Short Message Service
JDK
Java Development Kit
IDE
Integrated development environment
ADT Android Development Tools SDK Software Development Kit API
Application programming interface
UI
User Interface
POI
Point of Interest
SVG Scalable Vector Graphics XML Extensible Markup Language AOA Android Open Accessory
50
Seznam obrázků Obrázek 1: Aplikace ShowCars ........................................................................................ 9 Obrázek 2: Architektura Androidu [1]............................................................................ 12 Obrázek 3: Struktura projektu......................................................................................... 15 Obrázek 4: Diagram aktivit............................................................................................. 17 Obrázek 5: Vektorový editor Inkscape ........................................................................... 18 Obrázek 6: Úvodní obrazovka ........................................................................................ 21 Obrázek 7: Administrátorské nastavení .......................................................................... 23 Obrázek 8: Zobrazení zpráv ............................................................................................ 25 Obrázek 9: Informace ..................................................................................................... 28 Obrázek 10: Nastavení přeprav ....................................................................................... 29 Obrázek 11: Navigace Google Maps .............................................................................. 30 Obrázek 12: Navigace OsmAnd ..................................................................................... 31 Obrázek 13: Navigace Sygic........................................................................................... 32 Obrázek 14 : Aplikace návrhového vzoru Observer ....................................................... 37 Obrázek 15: Drátové řešení ............................................................................................ 38 Obrázek 16: FT311 Dev Board ....................................................................................... 39 Obrázek 17: Bezdrátové řešení ....................................................................................... 41 Obrázek 18: Jednotka GP-316 ........................................................................................ 41 Obrázek 19: WiFi modul ................................................................................................ 42
Seznam tabulek Tabulka 1: Porovnání navigačních aplikací .................................................................... 32 Tabulka 2 : Struktura GPS paketu .................................................................................. 38
Přílohy Na přiloženém CD je tato bakalářská práce ve formátu PDF. Zdrojové kódy aplikací OsmAnd a TerminalEbus jsou uloženy v samostatných složkách.
51