Rok / Year: Svazek / Volume: Číslo / Number: 2013 15 6 Aplikace na přenos dat pomocí NFC Application for NFC data transmission Martin Rosenberg, Tomáš Mertlík {xrosen01, xmertl01@stud.feec.vutbr.cz Fakulta elektrotechniky a komunikačních technologií VUT v Brně Abstrakt: Technologie Near Field Communication je čím dál více podporována operačními systémy pro mobilní platformy. Tento článek se věnuje návrhu a popisu aplikace na operační systém Android pro přenos dat pomocí technologie NFC. První část je teoretická, kde je stručně popsána technologie NFC a datový formát NFC Data Exchange Format (NDEF). Tento datový formát je využit pro přenos jakýkoliv dat mezi zařízeními podporující standard NFC v režimu peer-to-peer (P2P). Jelikož NFC podporuje relativně pomalé spojení (od 106 kbit/s do 424 kbit/s) a zařízení musí být po dobu komunikace v těsné blízkosti (jednotky centimetrů), bude na samotný přenos objemnějších dat využita jiná technologie (bluetooth či Wi-Fi). Pomocí NFC si přístroje pouze vymění informace potřebné pro navázání spojení na vybrané technologii. Uživatel si pak bude moci vybrat jakou technologii bude pro přenos dat využívat. Abstract: The support of Near Field Communication technology is increasing on the mobile devices. The article is focusing on the draft and description of mobile application for an Android OS, which will allow data transmission between two devices using NFC technology. The first part is theoretical. It s briefly describing the own NFC technology and NFC Data Exchange Format (NDEF) used for the data exchanges of any kind. However NFC technology is relatively slow (106 kbit/s - 424 kbit/s) and communicating devices have to be in really close range during data transmission, for the larger data files Wi-Fi and Bluetooth technologies will be used. NFC technology will be providing handshaking and device pairing. The user can also choose preferred transfer technology.
Aplikace na přenos dat pomocí NFC Martin Rosenberg, Tomáš Mertlík Fakulta elektrotechniky a komunikačních technologií VUT v Brně Email: {xrosen01, xmertl01@stud.feec.vutbr.cz Abstrakt Technologie Near Field Communication je čím dál více podporována operačními systémy pro mobilní platformy. Tento článek se věnuje návrhu a popisu aplikace na operační systém Android pro přenos dat pomocí technologie NFC. První část je teoretická, kde je stručně popsána technologie NFC a datový formát NFC Data Exchange Format (NDEF). Tento datový formát je využit pro přenos jakýkoliv dat mezi zařízeními podporující standard NFC v režimu peer-to-peer (P2P). Jelikož NFC podporuje relativně pomalé spojení (od 106 kbit/s do 424 kbit/s) a zařízení musí být po dobu komunikace v těsné blízkosti (jednotky centimetrů), bude na samotný přenos objemnějších dat využita jiná technologie (bluetooth či Wi-Fi). Pomocí NFC si přístroje pouze vymění informace potřebné pro navázání spojení na vybrané technologii. Uživatel si pak bude moci vybrat jakou technologii bude pro přenos dat využívat. 1 Úvod Technologie Near Field Communication (NFC) je založena na standardech Radio-frequency identification (RFID) pracující na kmitočtu 13,56 MHz s velmi malou komunikační vzdáleností (obvykle jednotky centimetrů). Přenosové rychlosti nejsou velké (od 106kbit/s do 424kbit/s), protože se nepočítá s velkým objemem přenesených dat. Tato technologie se využívá spíše pro spárování zařízení nebo pro rychlý přenos malého objemu dat (řády desítek kb). Na samotný přenos dat lze využít rychlejší technologie, například bluetooth nebo Wi-Fi, které dosahují výrazně větší přenosové rychlosti s lepším dosahem. Nejrozšířenější bluetooth třída 2 dosahuje teoretických rychlostí 3 Mbit/s (prakticky 2.1 Mbps) s dosahem několika metrů. Je vhodná pro soubory o velikostech několika jednotek MB. Oproti technologii Wi-Fi výrazně zaostává v rychlosti, její výhodou je však výrazně lepší energetická náročnost. Technologie Wi-Fi s přenosovou rychlostí do 600 Mbit/s (podle použité specifikace) je tedy vhodná pro přenos vysoko objemných dat. Technologie NFC se díky své nízké energetické náročnosti se hodí do mobilních zařízení, kde se počítá každý spotřebovaný mw. Data se pomocí NFC přenášejí pouze v režimu half-duplex, protože na rádiovém médiu nelze data vysílat a číst ve stejnou dobu. NFC technologii lze do mobilního zařízení instalovat hned třemi způsoby. První způsob spočívá v existenci integrovaného NFC čipu na základní desce zařízení a antény připojené na zadní stěně baterie nebo na krytu zařízení. Druhý způsob je v nákupu SD karty, která je vybavena NFC čipem spolu s anténou externí či interní. Poslední způsob je založen na integraci NFC čipu přímo do SIM karty a to s anténou interní nebo externí. NFC může pracovat ve dvou základních režimech. První režim je pasivní. U tohoto režimu nemá transpondér vlastní napájení. Energii potřebnou pro chod transpondéru a generování odpovědi získá ze čtecího zařízení díky elektromagnetické indukci na anténě transpondéru. Anténa je připojena ke kondenzátoru, který tuto potřebnou energii uchovává až do chvíle, kdy energie dosáhne minimální úrovně na rozběhnutí elektronických součástek. Posléze se začne generovat odpověď. Druhý způsob je ten, že transpondér disponuje vlastním zdrojem napájení. Tento typ transpondéru se nazývá aktivní a na rozdíl od pasivních transpondérů nemusí čekat na akumulaci potřebné energie. Může tedy ihned vysílat odpověď. Režimy přenosu dat jsou hned tři. První, a klasický, je režim čtení/zápis. Ten umožňuje pouze nahrávat a číst data z NFC transpondérů. Druhý režim je emulace karty, ve kterém lze emulovat kartu do NFC zařízení. Tento režim se využívá v bankovnictví a u identifikace osob (otevírání dveří). Poslední režim je tzv. rovný s rovným (peer-to-peer), kde jsou si dvě zařízení rovny a mohou spolu vyměňovat jakákoliv data. Transpondéry se dále dělí podle druhu paměti na čtecí, jednou zapisovací, čtecí i zapisovací a kombinace předešlých typů. Lze je rozdělit i podle využití. S tím souvisí bezpečnost uložených dat. U veřejných transpondérů (např. Smart Label) je využit typ paměti pouze na čtení nebo je zabezpečen tak, aby útočník nemohl uloženou informaci přepsat (např. heslo, které povolí přeprogramování). Na soukromých transpondérech (např. Smart Card) je využito bezpečné úložiště chráněné šifrováním proti zneužití obsahu. Data tedy musí být zabezpečena před případným útočníkem, aby je nemohl přečíst, zkopírovat popř. modifikovat. Bezpečnost NFC není velmi kvalitní, protože NFC umí pouze detekovat narušení komunikace a nemá žádné mechanizmy na utajení dat nebo proti přepojovanému útoku. Samotné zabezpečení je odsunuto na vyšší vrstvy, tedy zabezpečení si musejí zajistit samotné aplikace. Pro zabezpečení komunikace lze využít zabezpečený kanál, který šifruje celou komunikaci. Další otázkou bezpečnosti je zabezpe- 427
čené uložení citlivých dat na transpondéru. To samozřejmě musí být šifrované a díky neustálým útokům se bezpečné uložení dat značně vylepšuje [1], [2], [4]. NDEF zpráva záznam 1 MB=1 záznam 2 záznam 3 záznam 4... Obrázek 1: Struktura NDEF zprávy [1]. záznam n ME=1 2 NDEF NFC Data Exchange Format Tato kapitola je čerpána ze specifikací a standardů NFC fóra, které prosazuje technologii NFC. Více viz. [1]. NFC fórum je nezisková organizace, která je složena z členů velkých firem snažících se standardizovat a vylepšovat komunikaci pomocí NFC technologie. Dříve zavedené standardy pro přenos dat pomocí RFID podporovaly pouze přenos identifikačních dat (URI - Uniform Resource Identifier nebo znaky z ASCII tabulky). Proto byl zaveden rozšiřující standard pro přenos jakýchkoliv dat pomocí technologie NFC. S tím přišla organizace NFC fórum, která specifikovala datový formát NDEF (NFC Data Exchange Format). NDEF tedy definuje formát zapouzdření zpráv pro výměnu dat mezi NFC zařízeními. Podporuje přenosy mezi dvěma aktivními zařízeními nebo aktivním a pasivním. Cílem specifikace je definice datových jednotek a pravidel pro přenos pomocí NFC. Tato specifikace je založena na spolehlivé a spojově orientované komunikaci, která je definována ve standardu NFCIP-1 (ISO/IEC 18092 Near- Field Communication Interface and Protocol) na podvrstvě Logical Link Control Protocol (LLCP). NDEF specifikace podporuje následující: Libovolné typy dat (GIF, JPEG, atd.). Poskytuje i přenos šifrovaných dat. Agregaci více typů dat, které spolu logicky souvisí do jedné zprávy. Sloučení malých bloků dat do jedné zprávy za účelem ušetření režie pří přenosu. Libovolné velikosti souborů, dokonce i o předem neznámé velikosti (dynamicky generovaná data). 2.1 NDEF zpráva NDEF zpráva se skládá z jednoho či více NDEF záznamů, kde první záznam je označen příznakem MB (Message Begin - počátek zprávy) a poslední záznam je označen příznakem ME (Message End - konec zprávy). Minimální délka zprávy je omezena na jeden záznam, které se dosáhne tím, že příznaky MB a ME se zapíší do stejného záznamu. Maximální počet záznamù ve zprávě NDEF není omezen. NDEF záznamy se ve zprávě nesmí překrývat, proto byl zaveden formát, který je uveden na obrázku 1. První záznam má index 1 (záznam s příznakem MB=1), pak následují číslované záznamy nesoucí data a poslední záznam má index n (záznam s příznakem ME=1), který označuje konec NDEF zprávy. 2.2 NDEF záznam Všechny NDEF záznamy, které nesou data, musí obsahovat následující identifikátory: 1. Velikost dat (Payload length) reprezentuje velikost užitečných dat zapouzdřených v NDEF záznamu. Pro krátké záznamy je vyhrazen jeden oktet a pro normální zprávy jsou vyhrazeny čtyři oktety. Krátké záznamy jsou identifikovány bitem SR (Short Record). Nula je platná délka. 2. Typ přenášených dat (Payload type) indikuje typ dat v NDEF záznamu. Konkrétní typ nastavuje uživatelská aplikace. V nabídce je hned několik typů dat, které se nastavují v poli TYPE. 3. Volitelný identifikátor (Payload identification) je určen aplikacím k dodatečné identifikaci NDEF záznamu. 7 6 5 4 3 2 1 0 MB ME CF SR IL TNF TYPE LENGTH PAYLOAD LENGTH 3 PAYLOAD LENGTH 2 PAYLOAD LENGTH 1 PAYLOAD LENGTH 0 ID LENGTH TYPE ID PAYLOAD Obrázek 2: Struktura NDEF záznamu [1]. Následuje znázornění struktury NDEF záznamu a vysvětlení jednotlivých polí z obrázku 2. MB (Message Begin) jednobitové pole, které značí začátek NDEF zprávy. ME (Message End) jednobitový příznak, který značí konec NDEF zprávy. CF (Chunk Flag) jednobitový příznak, který indikuje zda-li se jedná o rozkouskovaná (fragmentovaná) data do více záznamů nebo záznam obsahuje celou zprávu najednou. 428
SR (Short Record) opět jednobitový příznak indikující krátkou zprávu (nastaven na 1) nebo normální zprávu (nastaven na 0). Při použití krátké zprávy je vyhrazen jeden oktet na určení velikosti užitečných dat (pole PAYLOAD LENGTH) a při normální velikosti záznamu jsou použity čtyři oktety. IL (ID Length) jednobitový příznak oznamující přítomnost polí ID a ID LENGTH v hlavičce NDEF záznamu. Při nastavení na 1 jsou pole ID a ID LEN- GTH uvedeny v hlavičce a každý zabírá jeden oktet. Pokud je nastavena 0 jsou tyto pole z hlavičky vynechány. TNF (Type Name Format) jedná se o tříbitové pole, které definuje druh přenášených dat. Hodnoty jsou následující: 0x00 prázdný typ dat, při použití musí být pole TYPE LENGTH, ID LENGTH a PAY- LOAD LENGTH nulové a pole TYPE, ID a PA- YLOAD jsou vynechány ze záznamu. Používá se pokud uživatel již nemá data. 0x01 typ definovaný NFC fórem ve specifikaci NFC RTD (Record Type Definition). Potom pole TYPE obsahuje jméno RTD typu. 0x02 označuje, že se přenáší média (MIME - Multipurpose Internet Mail Extensions) a pole TYPE poté definuje konkrétní typ média dle specifikace RFC 2046. 0x03 nastavuje typ přenášených dat na absolutní URI (Uniform Resource Identifier). Pole Type obsahuje typ URI dle specifikace RFC 3986. 0x04 značí externí typ NFC fóra. Pole TYPE obsahuje jméno ze specifikace NFC RTD. 0x05 označuje neznámý typ dat. Při nastavení musí být pole TYPE LENGTH nulové a pole TYPE je vynecháno ze záznamu. 0x06 definuje nezměněný typ dat. Jedná se o typ určený pouze prostředním záznamům, který definuje, že má stejný identifikátor, jako počáteční kus záznamu. Pokud je nastaven, pak TYPE LENGTH musí být nulový a pole TYPE je vynecháno ze záznamu. 0x07 rezervováno pro budoucí účely. TYPE LENGTH obsahuje osmibitové celé číslo, které definuje délku pole TYPE v bytech. Toto pole je vždy nulové pro specifické hodnoty pole TNF. ID LENGTH obsahuje osmibitové celé číslo, které definuje délku pole ID v bytech. Toto pole je přítomno pouze v případech, kdy je nastaven příznak ID LEN- GTH na 1. Pokud je pole ID LENGTH nastaveno na 0 bytů, pak je pole ID vynecháno ze záznamu. PAYLOAD LENGTH definuje délku použitých dat. Velikost tohoto pole záleží na nastavení bitu SR, kde 0 značí použití čtyř oktetů (32 bitů) a 1 značí jeden oktet (8 bitů). Jsou-li data větší jak 231 bytů musí se rozdělit (fragmentovat) a posléze u příjemce opět složit. Pokud je velikost nulová potom pole PA- YLOAD je vynecháno ze záznamu. TYPE pole o velikosti jednoho oktetu, které definuje konkrétní typ přenášených dat dle specifikace z pole TNF. ID přiděluje jednoznačný identifikátor zprávy. Jednoznačnost zajišťuje strana generující data. Toto pole musí mít nastaven pouze první záznam, v případě fragmentované komunikace prostřední a ukončující kus záznamu nesmí mít toto pole nastaveno. PAYLOAD pole nesoucí užitečná data aplikace. 3 Aplikace pro přenos dat pomocí NFC na OS Android Tato kapitola je věnována návrhu a následnému vytvoření aplikace pro přenos dat pomocí NFC technologie. První podpora NFC technologie v OS Android je u verze 2.3 (Gingerbread), API level 9, kde nebyla podpora emulace karty. Od tohoto základu se hodně v OS Android změnilo a v poslední verzi 4.2 (Jelly Bean), API level 17, je podpora NFC technologie velmi dobrá. Při programování této aplikace bude s výhodou použita nová funkce OS, Android Beam, která vznikla ve verzi 4.0 (Ice Cream Sandwich), API level 16. Tato funkce usnadňuje programování aplikací založených na přenosové technologii NFC a obsahuje mnoho funkcí pro sdílení obsahu OS Android. Aplikace bude mít název NFC File Transfer, která pro komunikaci pomocí NFC bude využívat datový formát NDEF. Díky tomuto formátu je zaručena kompatibilita s ostatními zařízeními, které tento standart podporují. Lze díky němu nastavit obsah přenášených dat a tím i přehledně tento obsah filtrovat. Předpoklad pro přenos dat, je zapnutý přístroj a odemčená obrazovka, protože při zamknuté obrazovce (zhasnutý displej) se NFC technologie vypíná. Jedinou výjimkou je režim emulace karty (myšlena přístupová karta, ne bankovní), kde i při vypnutém zařízení NFC stále funguje. Návrh aplikace se dělí do tří kategorií. První popisuje logické chování aplikace, druhý se zaměřuje na návrh vzhledu a třetí popisuje klíčové funkce pro přenos dat [2] [3]. 3.1 Popis logického chování aplikace Tato kapitola se rozděluje na dva stěžejní směry. První popisuje co se všechno musí uskutečnit při odesílání dat druhému zařízení. Potom druhý směr popisuje nutnosti nastavení pro příjem dat od prvního zařízení. NFC samo o sobě není pohodlné pro přenos většího objemu dat, protože je poměrně malá rychlost přenosu dat na velmi krátkou vzdálenost. Navíc v celém průběhu výměny dat by musely být přístroje v dosahu NFC. Spojení NFC 429
a Bluetooth = Wireless Nirvana, kde se pomocí NFC přístroje spárují a samotný přenos dat probíhá přes Bluetooth [2] [3]. 3.1.1 Odesílání dat Na obrázku 3 je znázorněn zjednodušený vývojový diagram pro odesílání souboru 1. Diagram nezahrnuje žádné chyby v přenosu, vypršení časovačů nebo chyby v párování přístrojů, protože by jeho složitost hodně narostla a stal se tak nečitelný. Dále se předpokládá, že obě zařízení podporují technologie NFC, Bluetooth a volitelně Wi-Fi Direct. Odesílání souboru začíná výběrem souboru, kde se uživateli aplikace nabídne výběr souboru jakéhokoliv typu. Zvolený typ souboru se nastaví do NDEF záznamu pomocí kterého se na straně příjemce budou data identifikovat. Po výběru souboru má možnost uživatel zvolit přenosovou technologii. Bluetooth Odesílání souboru Výběr souboru Výběr přenosové technologie Wi-Fi Direct Zapnutí a nastavení přenosové technologie NFC Přiložen telefon v ANO dosahu NFC? Sestavení spojení NFC Velikost souboru větší jak 150 kb? Výměna informací pro sestavení spojení na vybrané technologii Ukončení spojení NFC Navázání spojení na vybrané technologii Přenos dat na vybrané technologii Ukončení spojení Konec odesílání ANO Pokračovat? ANO Přiloženo zařízení v dosahu NFC? ANO Sestavení spojení Přenos dat Ukončení spojení Konec odesílání Obrázek 3: Zjednodušený vývojový diagram pro odesílání souboru. Dále se předpokládá, že si uživatel vybral přenosovou technologii NFC (pravá strana diagramu). Nejdříve se testuje velikost vybraného souboru. Jestliže soubor není větší 1 Kontakt, URL a text se odesílá přímo pomocí NFC, protože by bylo zbytečné navazovat komunikaci na jiné technologii, kdy bude posíláno je pár kb. než 150 kb 2, aplikace uživatele upozorní, aby přiložil zařízení do dosahu NFC. Následuje podmínka, která čeká na přiložení telefonu do dosahu NFC. Pokud zařízení není v dosahu NFC jiného zařízení, podmínka se neustále opakuje a čeká na přiložení. Při detekci signálu NFC se podmínka vyhodnotí jako pravdivá a začne se sestavovat spojení následované samotným přenosem dat. Po ukončení přenosu dat se spojení zruší a uživateli se zobrazí informace o úspěšnosti přenosu souboru. Dále se předpokládá, že soubor má větší velikost než již zmíněných 150 kb, při přenosu souboru pomocí NFC. Aplikace na tento fakt uživatele upozorní varovným oknem, kde nabízí pokračování nebo vrácení na výběr přenosové technologie spolu s výpisem, že tento přenos může trvat výrazně dlouho. Pokud uživatel zvolí pokračování, tak pokračuje v odesílání pomocí NFC, které bylo popsáno o odstavec výše. Kdy uživatel zvolí nepokračovat, varovné okno se zavře a umožní se znovu výběr přenosové technologie. Pokud si uživatel zvolí jinou přenosovou technologii než NFC, vybraná technologie se zapne, nastaví a připraví na přenos dat. Do NDEF záznamu se uloží informace o nastavení přenosové technologie. Následuje opět podmínka na přiložení zařízení do dosahu NFC. Pokud je telefon přiložen v dosahu NFC, sestaví se spojení a proběhne výměna informací o nastavení vybrané přenosové technologie. Díky NFC tak odpadá složitost ručního nastavení přenosové technologie. Následuje ukončení spojení na NFC a sestavování spojení na vybrané technologii. Proběhne výměna dat přes vybranou technologii a spojení se ukončí. Na konec se uživateli zobrazí informace o úspěšnosti přenosu souboru [2], [3], [4]. 3.1.2 Příjem dat Pro příjem dat je diagram jednoduchší. Opět do diagramu nejsou zahrnuté žádné chyby v přenosu, vypršení časovačů nebo chyby v párování přístrojů. Dále se předpokládá, že zařízení podporuje technologie NFC, Bluetooth a volitelně Wi-Fi Direct. Příjem souboru znázorněný na obrázku 4 začíná podmínkou, jestli je přiloženo zařízení v dosahu NFC. Pokud ne, čeká na přiložení. Pokud ano, sestaví spojení, přenesou se data od odesílatele a spojení se ukončí. Následně si aplikace zkontroluje jaký typ dat byl přenesen v NDEF záznamu. Tím zjistí, jestli proběhl přenos vybraného souboru přímo pomocí NFC nebo byly přeneseny pouze informace pro nastavení technologie na přenos konkrétního souboru. Jestliže NDEF obsahuje pouze informace o nastavení jiné technologie na samotný přenos dat, musí aplikace tuto technologii zapnout, nastavit a připravit na přenos dat. Poté se sestaví spojení na vybrané technologii následujícím samotným přenosem dat. Po přenosu všech dat se spojení na vybrané technologii ukončí, smaže se její nastavení a vy- 2 Zvolená maximální doporučená velikost souboru pro přenos pomocí NFC je nastavena na 150 kb. S ohledem na to, že při menší velikosti je zbytečné sestavovat spojení na jiné technologii a při větší velikosti by se přenos souboru výrazně prodloužil. 430
VOL.15, NO.6, DECEMBER 2013 Příjem souboru Přiloženo zařízení v dosahu NFC? ANO Sestavení spojení Přenos dat Ukončení spojení Byly poslány informace pro nastavení jiné technologie? Konec příjmu ANO Zapnutí a nastavení dané technologie Navázání spojení na vybrané technologii Přenos dat na vybrané technologii Ukončení spojení Konec příjmu Obrázek 4: Zjednodušený vývojový diagram pro příjem dat. pne se. Nakonec se uživateli zobrazí informace o úspěšnosti přenosu dat [4]. 3.2 Návrh vzhledu aplikace Obrázek 5: Vzhled aplikace. Vzhled aplikace není nikterak důležitý pro správnou funkci, proto zde nejsou popsány detaily vzhledu. Uživatelé upřednostňují jednoduché a praktické ovládání. První aktivita (okno po spuštění aplikace), která se uživateli zobrazí je znázorněna na obrázku 5-a. Je na něm vidět název aplikace (NFC File Transfer) a logo (vlevo nahoře). Vpravo nahoře jsou tři čtverečky, které slouží pro nastavení aplikace. Návrh vzhledu aplikace pro přijaté soubory je na obrázku 5-b, pro výběr souboru na obrázku 5-c a obrázek 5-d vystihuje výběr přenosové technologie [4]. 3.3 Stručný popis programu První a nejdůležitější věc, kterou musí mít každá aplikace psaná pro Android, je správně nastavený soubor Manifest. Ten obsahuje informace o aplikaci a provádí následující úkony [2]: Pojmenovává balíček Java aplikace. Název balíčku slouží jako jedinečný identifikátor aplikace (např. com.adobe.reader). Popisuje komponenty aplikace (aktivity, služby, přijímače vysílání a poskytovatelé obsahu) a přiděluje potřebné práva pro komunikaci, filtry atd. 431 Určuje, která oprávnění aplikace dostane pro přístup k chráněným částem API rozhraní a pro komunikaci s ostatními aplikacemi. Definuje minimální úroveň použitelného API rozhraní. Uvádí jaké knihovny jsou propojené k aplikaci. Manifest pro tuto aplikaci vypadá následovně. < uses - sdk a n d r o i d : m i n S d k V e r s i o n = " 16 " / > < uses - feature android:name = " android. hardware. nfc " a n d r o i d : r e q u i r e d = " true " / > < uses - feature android:name = " android. hardware. bluetooth " / > permission. NFC " / > permission. BLUETOOTH " / > permission. W R I T E _ E X T E R N A L _ S T O R A G E " / > permission. R E A D _ E X T E R N A L _ S T O R A G E " / > permission. READ_CONTACTS " / > permission. WR ITE_CO NTACTS " / >
Minimální spustitelná verze Androidu je nastavena na Jelly Bean (API level 16, verze 4.1). To je kvůli nejnovější podpoře NFC přes Android Beam. Dále je zapotřebí nastavit aplikaci, aby vyžadovala zařízení s podporou NFC (android.hardware.nfc a required="true"). Bluetooth je pouze vyžadován, avšak na chod aplikace není nutný. Poté už stačí nastavit potřebná oprávnění pro aplikaci, jako je čtení/zápis do paměti, využití funkcí bluetooth spolu s NFC a čtení/zápis kontaktů [4], [5]. 3.3.1 Odesílání dat Následující obrázky vystihují vzhled aplikace pro odesílání souboru a pro potvrzení při úspěšném odeslání souboru. public NdefMessage createndefmessage ( NfcEvent event ) { switch ( fomrat ) { case 1: // " text / plain " NdefMessage msg_text = new NdefMessage ( NdefRecord. createmime ( " text / plain ", message. getbytes ())); return msg_text ; case 2: // " text / url " NdefMessage msg_url = new NdefMessage ( NdefRecord. createmime ( " text / url ", message. getbytes ())); return msg_url ; // case 3: Soubor // case 4: Kontakt default : break ; return null ; Díky příjmu události NfcEvent event se tato funkce vyvolá, pokud funkce Android Beam detekuje v dosahu jiné NFC kompatibilní zařízení. Potom již stačí potvrdit odeslání vybrané zprávy a data se začnou posílat. Aplikace rozlišuje posílání NFC zprávy pomocí příkazu switch() a proměnné format. V té se ukládá, co se posílá za data přes NFC, aby je mohla aplikace při příjmu třídit a správně vyhodnotit. Proměnná message obsahuje data v textové podobě. Pomocí funkce NdefRecord.createMime() se vytvoří daný NDEF záznam a funkcí NdefMessage() se vytvoří NDEF zpráva z jichž vytvořených NDEF záznamů [4], [5], [6]. Ukázka posílání souboru je v následujícím kódu. Obrázek 6: Vzhledd aplikace odesílání vybraného souboru. Aktivita odesílání (obrázek 6-a inicializace odeslání a obrázek 6-b potvrzení odeslání) začíná vytvořením třídy Odesilani s implementací podpůrných tříd na kontrolu a informování o průběhu přenosu dat pomocí NFC. public class Odesilani extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback Následuje přiřazení NFC adaptéru a testování jeho přítomnosti spolu s funkcí Android Beam. mnfcadapter = NfcAdapter. getdefaultadapter ( this ); if (! mnfcadapter. isenabled ()) { // Pokud NFC adapter nen í zapnut zobraz í zpravu Toast. maketext ( getapplicationcontext (), " NFC nen í zapnut é!", Toast. LENGTH_LONG ). show (); else if (! mnfcadapter. isndefpushenabled ()) { // Pokud nen í zapnuta funkce Android Beam Toast. maketext ( getapplicationcontext (), " Nen í zapnut Android Beam ", Toast. LENGTH_LONG ). show (); Pro samotné posílání dat slouží následující kód. // Pokracovani prikazu SWITCH case 3: // soubor InputStream is = null ; // Otevreni souboru a prirazeni do InputStream is = new BufferedInputStream ( new FileInputStream ( message )); // Vytvoreni vyrovnavaci pameti ByteArrayOutputStream bos = new ByteArrayOutputStream (); // Nacitani souboru do vyrovnavaci pameti while ( is. available () > 0) { bos. write (is. read ()); NdefRecord [] ndefzaznam = new NdefRecord [2]; // Prvni zaznam nese jmeno souboru ndefzaznam [0] = NdefRecord. createmime (" soubor / data ", jmenosouboru. getbytes ()); // Druhy nese samotna data souboru ndefzaznam [1] = NdefRecord. createmime (" soubor / data ", bos. tobytearray ()); // Vytvoreni NDEF zpravy NdefMessage msg_soubor = new NdefMessage ( ndefzaznam ); // Uzavreni souboru a vyrovnavaci pameti is. close (); bos. close (); return msg_soubor ; V proměnné message je uložena cesta k souboru. Tato část kódu není opatřena zachytáváním chybových stavů try a catch kvůli přehlednosti v kódu. Díky konstruktoru FileInputStream() se soubor otevře a může se načíst 432
do vyrovnávací paměti jeho obsah. Posléze se vytvoří dva NDEF záznamy, kde první ponese jméno souboru a druhý data souboru. Díky nastavení formátu soubor/data aplikace při příjmu pozná, že se jedná o soubor a může ho začít ukládat. Lze uvést libovolný typ NDEF záznamu, ale je nutné nastavit stejný typ při příjmu zprávy u intent filtrů (bude probráno u příjmu dat) [4], [5], [6]. Pro posílání kontaktu je následující kód. // Pokracovani prikazu SWITCH case 4: // Kontakt NdefMessage msg_kontakt = new NdefMessage ( NdefRecord. createmime (" text /x- vcard ", message. getbytes ())); return msg_kontakt ; U kontaktu se data posílají v textové podobě formátu text/x-vcard. To je standard na přenositelnost kontaktů. Z telefonu se načtou informace o vybraném kontaktu do textového řetězce message (není zde uvedeno). Ten se převede na byty funkcí getbytes() a odešle se na druhé zařízení. Operační systém Android tuto zprávu zachytí a díky nastavenému typu text/x-vcard ihned přidá přijatý kontakt do seznamu kontaktů. Proto není nutné v aplikaci tento typ dat nijak přijímat. Následující funkce se vyvolá, pokud je NDEF zpráva vytvořena a je připravena k odeslání. Díky této funkci je operační systém informován o průběhu přenosu a může řídit přenosovou rychlost. public void onndefpushcomplete ( NfcEvent arg0 ) { mhandler. obtainmessage ( MESSAGE_SENT ). sendtotarget (); Funkce Handler se vyvolá, když je NDEF zpráva úspěšně odeslána na druhé zařízení. private final Handler mhandler = new Handler () { public void handlemessage ( Message msg ) { switch ( msg. what ) { case MESSAGE_SENT : // Zobrazi informaci o~ uspesnosti prenosu Toast. maketext ( getapplicationcontext (), " Data odesl ána", Toast. LENGTH_LONG ). show (); break ; ; Další ukázka je poslání souboru přes Bluetooth. Díky funkci Android Beam, která je ve verzi operačního systému Android 4.1 (API level 16) značně vylepšena, je relativně jednoduché posílat soubory pomocí Bluetooth při párování přes NFC. Následujících pár řádků kódu tuto jednoduchost dokazují. V proměnné message je uložena cesta k souboru (je možno posílat i více souborù najednou). Přes NFC se pošlou jen párovací informace a samotná data se začnou posílat přes Bluetooth. Díky funkci Android Beam není nutno zprávu v aplikaci nijak přijímat a vše si zařídí sám [6]. 3.3.2 Příjem dat Nedílnou součástí je správné nastavení intent filtrů, které se předávají při spouštění aktivity (nová instance). Intent si lze představit jako zprávu, která je nastavena na určitý typ a prochází celým operačním systémem. Jen ty aplikace jejichž intent filtr obsahuje stejné typy, může operační systém vyvolat a spustit. Zde je příklad nastavení intent filtrů pro příjem NDEF zpráv u aktivity Prijem. Je nutné nastavit mimetype na ty typy, které se používají při odesílání dat v aplikaci. <intent - filter > < action android:name =" android. nfc. action. NDEF_DISCOVERED " / > < category android:name =" android. intent. category. DEFAULT " /> <data android:mimetype =" text / plain " / > </ intent - filter > <intent - filter > < action android:name =" android. nfc. action. NDEF_DISCOVERED " / > < category android:name =" android. intent. category. DEFAULT " /> <data android:mimetype =" text / url " / > </ intent - filter > <intent - filter > < action android:name =" android. nfc. action. NDEF_DISCOVERED " / > < category android:name =" android. intent. category. DEFAULT " /> <data android:mimetype =" soubor / data " / > </ intent - filter > V aktivitě Prijem je nutno mít funkci processintent (na jménu funkce nezáleží, ale musí přijímat zprávy intent). Ta přijímá zprávy intent, které prošly definovaným intent filtrem v manifestu. void processintent ( Intent intent ) { // Nacteni intent zpravy Parcelable [] rawmsgs = intent. getparcelablearrayextra ( NfcAdapter. EXTRA_NDEF_MESSAGES ); // Ulozeni NDEF zpravy NdefMessage msg = ( NdefMessage ) rawmsgs [0]; V proměnné msg je již takto uložena celá NDEF zpráva. Pomocí funkce if lze vytřídit různé typy NDEF zpráv a díky tomu jim lze nastavit různé zacházení. Zpracování NDEF zprávy text/plain a text/url je následující. private void odeslatbt () { File myfile = new File ( message ); mnfcpushuris [0] = Uri. fromfile ( myfile ); mnfcadapter. setbeampushuris ( mnfcpushuris, this ); 433
if ( msg. getrecords () [0]. tomimetype (). equals (" text / plain ") msg. getrecords () [0]. tomimetype (). equals (" text / url ")) { // Vypis obsahu a typu zpravy do textoveho pole minfotext. settext ( new String ( msg. getrecords () [0]. getpayload ()) + "\n" + msg. getrecords () [0]. tomimetype ()); Pro přijatý soubor je situace o něco složitější. Ukázka příjmu souboru vypadá následovně. else if ( msg. getrecords () [0]. tomimetype (). equals ( " soubor / data ")) { File mediadir = new File ("/ sdcard / NFC File Transfer /"); // Vytvoreni slozky pro soubor pokud neexistuje if (! mediadir. exists ()) { mediadir. mkdir (); // Jmeno souboru je v prvnim NDEF zaznamu String jmeno = new String ( msg. getrecords () [0]. getpayload ()); // Ulozeni tela zpravy byte [] telozpravy = msg. getrecords () [1]. getpayload (); File resolvemesdcard = new File ("/ sdcard / NFC File Transfer /" + jmeno ); if (! resolvemesdcard. exists ()) { // Vytvoreni souboru pokud neexistuje resolvemesdcard. createnewfile (); // Pokud soubor existuje, prepise ho FileOutputStream fos = new FileOutputStream ( resolvemesdcard ); // Zapis dat do souboru fos. write ( telozpravy ); fos. close (); // Vypis informace o uspesnem prijeti souboru Toast. maketext ( this, " Soubor " + jmeno + " byl pŕ ijat ", Toast. LENGTH_LONG ). show (); Hned po příjmu souboru se aplikace snaží vytvořit složku pro ukládání takto přijatých souborů. Pokud neexistuje, vytvoří ji, pokud existuje, nechá ji a pokračuje. Potom si zjistí jméno poslaného souboru, které je uložené v prvním záznamu NDEF zprávy. Následuje vytvoření souboru v paměti mobilního zařízení. Pokud již soubor existoval, přepíše jej. Potom se může do otevřeného souboru začít zapisovat přijatá data v bytech. Soubor se uzavře a aplikace zobrazí zprávu o úspěšnosti uložení souboru (obrázek 7). 4 Závěr První kapitola toho článku popisuje čtenáři datový formát NFC Data Exchange Format (NDEF). Ten lze s výhodou použít na přenos jakýkoliv dat pomocí technologie NFC v režimu peer-to-peer. Jelikož je NFC relativně pomalá technologie a navíc je komunikace na velmi krátkou vzdálenost, tak lze využít jinou technologii (např. Bluetooth či Wi-Fi) pro samotný přenos objemnějších dat. Pomocí NFC se přístroje pouze spárují. Méně objemnější data lze rychle přenést přímo přes NFC díky rychlému navazování komunikace bez nutnosti párování nebo nastavování. NFC NFC File Transfer Příjem dat Typ mime: image/jpeg Data: 01.jpg Zobraz soubor Soubor 01.jpg byl úspěšně přijat Obrázek 7: Vzhled aplikace potvrzení přijetí souboru. S výhodou byla využita funkce Android Beam při programování aplikace na přenos dat pomocí NFC. Díky této funkci je programování takovýchto aplikací o mnoho jednoduší než bylo ve starších verzích operačního systému Android. Dříve se totiž musely složitě nastavovat všechny příznaky NDEF záznamu a posléze napojit záznamy do jedné NDEF zprávy. Android Beam toto nastavení shrnul do pár řádků kódu, kde si veškeré nastavení dělá sám na pozadí a uživatel mu pouze předloží data na odeslání. Značné zjednodušení pro programátory je i posílání dat pomocí Bluetooth, kde se dříve musel nastavovat komunikační kanál, tzv. socket. Aplikace pak musela obsahovat server socket a klient socket mezi kterými se data posílaly. Komunikace pak probíhala ve stylu klient-server, podobně jako u TCP spojení. Android Beam si tyto funkce nastavuje na pozadí a opět mu stačí pouze předložit data na odeslání. Nejnovější verze operačního systému Android Jelly Bean (verze 4.2.1, API level 17) přináší další novinky v použití NFC. Byla přidána podpora Wi-Fi Direct, která jinak samotně funguje podobně jako Bluetooth (skenování prostředí, nastavení a vybudování komunikačního kanálu). Ve spojení Android Beam s NFC má Wi-Fi Direct rychlé navázání a spárovaní komunikace pomocí NFC a následný přenos dat probíhá přes bezdrátovou Wi-Fi síť. Literatura [1] NFC Forum [online]. 2013, [cit. 31. 1. 2013]. Dostupné z URL: <http://www.nfc-forum.org>. [2] Open Handset Alliance: Android Developer. [online]. 2013, [cit. 12. 2. 2013]. Dostupné z URL: <http:// developer.android.com>. 434
[3] Open Handset Alliance: Android Open Source Project. [online]. 2013, [cit. 12. 2. 2013]. Dostupné z URL: <http://source.android.com>. [4] MERTLÍK, Tomáš Popis technologie NFC a jejího zabezpečení: semestrální projekt. BRNO: Vysoké uèení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav telekomunikací, 2012. 98 s. Vedoucí práce byl Ing. Martin Rosenberg [5] MEDNIEKS, Z., L. DORNIN, M. NAKAMURA a B. MEIKE. Programming Android. 1st ed. Sebastopol: O Reilly, 2011, xvi, 482 s. ISBN 978-1-449-38969-7. [6] MILETTE, Greg; STROUD, Adam. Professional Android sensor programming. Hoboken, N.J.: Wiley, c2012, xxxiii, 517 p. ISBN 11-181-8348-7. 435