Top Banner
Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm
30

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Jul 07, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

D3kjd3Di38lk323nnm

Page 2: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Inhalt

1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Für wen dieses Buch gedacht ist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Literaturempfehlungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Um was es in diesem Buch geht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Was Sie benötigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

In diesem Buch genutzte Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Danksagungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 NFC und RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Was ist RFID? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Was ist NFC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Wie RFID arbeitet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Wie NFC funktioniert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Die Architektur von NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Passende Devices und Tag-Typen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Was Sie mit NFC machen können . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3 Einstieg mit PhoneGap und der PhoneGap-NFC-Bibliothek . . . . . . . . . . . . . 23Warum Android? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Hallo Welt! Ihre erste PhoneGap-App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Eine einfache Locator-App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

PhoneGap trifft NFC: NFC-Leser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4 Einfuhrung in NDEF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49NDEF-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Datensatz-Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

| V

Page 3: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

NDEF in der Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Eine Tag-Writer-Anwendung: Foursquare Check-In . . . . . . . . . . . . . . . . . . . . . 61

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

5 Auf NDEF-Nachrichten lauschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Event-Listener des PhoneGap-NFC-Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Eine NDEF-Reader-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Das Tag Dispatch System von Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

6 Eine NFC-Anwendung in der Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Die Benutzerinteraktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Lernen Sie Hue kennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Die Android-Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Die PhoneGap Media-API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

Die Benutzeroberfläche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Der Anwendungscode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

7 Einfuhrung in Arduino und NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Digital trifft real: Der Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

Der Hardware-Kern von NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

Die Entwicklungsumgebung für den Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . 131

Die Arduino NDEF-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

Eine Mikrocontroller-NFC-Anwendung: Hotel-Schlüsselkarten . . . . . . . . . . . . . 144

Eine Browser-Oberfläche für das Arduino NDEF Writer Device . . . . . . . . . . . . . 162

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

8 Peer-to-Peer-Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171Peer-to-Peer-Nachrichten mit PhoneGap übertragen . . . . . . . . . . . . . . . . . . . . . 174

Peer-to-Peer-Nachrichten mit PhoneGap empfangen . . . . . . . . . . . . . . . . . . . . . 181

Handover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

Handover-Nachrichten mit PhoneGap übertragen . . . . . . . . . . . . . . . . . . . . . . 184

Peer-to-Peer mit dem Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Karten-Emulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

9 NFC auf Embedded Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Einführung in Embedded Linux Devices und Paketmanager . . . . . . . . . . . . . . . 194

NFC auf Embedded Linux: Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

VI | Inhalt

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 4: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Vor der Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

Die NFC-Tools installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

Befehlszeilen-Tools von Libnfc und Libfreefare . . . . . . . . . . . . . . . . . . . . . . . . . 204

Lesen und Schreiben von NDEF in Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

Web-Oberfläche für den Tag-Writer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Interaktion mit Tags und der realen Welt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

Anhang: NFC-Spezifikations-Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

Inhalt | VII

Page 5: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

KAPITEL 4

Einfuhrung in NDEF

Um NFC zu verstehen, müssen Sie das NFC Data Exchange Format (NDEF) kennen – dieLingua Franca für NFC-Devices und Tags. In diesem Kapitel werden Sie die Struktur vonNDEF und die darin enthaltenen Datensätze kennenlernen. Zudem werden Sie ein paarApps schreiben, die NDEF-formatierte Nachrichten lesen und schreiben.

NDEF-StrukturNDEF ist ein Binärformat, das in Nachrichten (Messages) aufgebaut ist, von denen jedeaus mehreren Datensätzen (Records) besteht (siehe Abbildung 4-1). Jeder Datensatz be-steht aus einem Header mit Metadaten zum Datensatz – zum Beispiel Datensatztyp und-Länge – und der Payload (Nutzlast) mit dem Inhalt der Nachricht. Stellen Sie sich eineNDEF-Nachricht wie einen Absatz vor und die Datensätze wie Sätze in diesem Absatz. Einwohlgeformter Absatz besteht aus Sätzen zu einem bestimmten Thema. Genauso sollauch eine NDEF-Nachricht mittels einer Reihe von Datensätzen ein Objekt beschreiben –zum Beispiel einen Adressbucheintrag.

NFC-Transaktionen sind im Allgemeinen kurz. Jeder Austausch besteht meist aus nur einerNachricht und jedes Tag enthält auch nur eine Nachricht. Denken Sie an die physikalischenGegebenheiten bei einer NFC-Transaktion: Sie tippen mit Ihrem Gerät an ein anderes Gerätoder ein Tag und der gesamte Austausch findet statt, während Sie sich in Kontakt mit demGegenüber befinden. Sie möchten mit einer Transaktion keinen ganzen Roman übermit-teln, daher gehen Sie bei der Länge einer NDEF-Nachricht auch wieder eher von einemAbsatzes als von einem Buch aus. Für das Übertragen größerer Dateien werden Sie nocheine Alternative in einem der letzten Kapitel dieses Buches kennenlernen, aber an dieserStelle gehen wir von einem NFC-Austausch als einer NDEF-Nachricht und einer NDEF-Nachricht als Sammlung mehrerer kurzer Datensätze aus.

| 49

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 6: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

NDEF-Datensatz

Datensatz-

Header

Datensatz-

Payload

NDEF-Nachricht

(variable Länge)

NDEF-Datensätze

(variable Länge)

NDEF-Datensatz NDEF-Datensatz

Datensatz 1:Kontaktname

Datensatz 2: Kontakttelefonnummer

Datensatz 3:Kontaktadresse

Datensatz-

Header

Datensatz-

Payload

Datensatz-

Header

Datensatz-

Payload

Abbildung 4-1: Die Struktur einer NDEF-Nachricht, die aus mehreren Datensätzen besteht. Dies ist eintypisches Beispiel – ein Adressbuch-Eintrag mit drei Datensätzen (Name, Telefonnummer, Adresse)

Ein NDEF-Datensatz besteht aus einer Payload mit den Daten und aus Metadaten, die be-schreiben, wie die Payload zu interpretieren ist. Die Payload jedes Datensatzes kann auseinem von vielen verschiedenen Datentypen bestehen. Der Header jedes Datensatzes enthältdie Metadaten, die den Datensatz und seine Position in der Nachricht beschreiben, gefolgtvom Typ und der ID. Nach dem Header folgt dann die Payload. Abbildung 4-2 zeigt imDetail, wie ein NDEF-Datensatz aufgebaut ist.

NDEF-Datensatz NDEF-Datensatz NDEF-Datensatz

Datensatz-Header Datensatz-Payload

Payload-IDPayload-TypTNF + Flags Typ- Länge

Payload- Länge

Payload- Länge

Payload- Länge

Payload- Länge

ID-Länge

Message Begin

Message End

Chunk Flag

Short Record

ID Length Type Name Format

NDEF-Nachricht(variable Länge)

NDEF-Datensätze (Variabel)

Datensatz-Header (6-9 Byte lang)

Nachrichten-Flags (1 Byte lang)

1 Byte 1 Byte 1 Byte 1 Byte 1 Byte 1 Byte 1 Byte Variabel Variable

1 Bit 1 Bit 1 Bit 1 Bit 1 Bit(boolean)

3 Bits

Variabel Variabel

Abbildung 4-2: Struktur einer NDEF-Nachricht mit den Details zu den Header-Bytes

Wie Sie anhand von Abbildung 4-2 sehen können, besteht ein NDEF-Datensatz aus einemType Name Format (TNF), einem Payload-Typ, einer Payload-Kennung und der Payloadan sich. Die Payload ist der wichtigste Teil eines NDEF-Datensatzes – sie ist der Inhalt,den Sie übermitteln möchten. Das TNF beschreibt, wie Sie den Payload-Typ zu inter-pretieren haben. Dieser ist ein NFC-spezifischer Typ MIME-Media-Typ oder eine URI,über die Sie erfahren, wie die Payload aufgebaut ist. Man kann es sich auch so vorstellen:Das TNF enthält die Metadaten des Payload-Typs und der Payload-Typ die Metadatender Payload. Die Payload-Kennung ist optional und ermöglicht, Payloads aufeinanderverweisen zu lassen.

50 | Kapitel 4: Einfuhrung in NDEF

Page 7: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Type Name FormatNDEF-Datensätze beginnen mit einem Type Name Format. Das TNF beschreibt dieStruktur des Wertes im Typ-Feld und Sie erfahren damit, wie dieser zu interpretieren ist.Es gibt acht mögliche TNF-Werte:

0 EmptyEin leerer Datensatz ohne Typ oder Payload

1 Well-KnownEiner von sieben vordefinierten Typen, die in der RTD-Spezifikation des NFC Forumdefiniert sind

2 MIME Media-TypeEin Internet Media-Typ, wie er im RFC 2046 definiert ist

3 Absolute URIEin URI, wie ihn RFC 3986 definiert

4 ExternalEin benutzerdefinierter Wert, basierend auf den Regeln aus der Record Type Defini-tion-Spezifikation des NFC Forum

5 UnknownDer Typ ist unbekannt. Die Typlänge muss 0 sein

6 UnchangedNur für mittlere und abschließende Datensätze bei einer aufgeteilten Payload. DieTyplänge muss 0 sein

7 ReservedVom NFC Forum für zukünftige Anwendungen reserviert

Bei vielen Anwendungen werden Sie vermutlich TNF 01 (Well-Known) oder TNF 02(MIME Media-Type) für die diversen Medienformate aus dem Internet einsetzen. AuchTNF 04 (External) wird gerne genutzt, da Android den External-Typ »Android Applica-tion Record« verwendet, um Apps zu öffnen.

Payload-TypDer Payload-Typ, auch als Datensatz-Typ (Record Type) bekannt, beschreibt den Inhaltder Payload etwas genauer. Das TNF definiert nur das Format des Payload-Typs. BeimTyp kann es sich um einen NDEF-Typ, einen MIME-Typ, eine URI oder einen externenTyp handeln. Die Spezifikation für die NDEF Record Type Definition (RTD) beschreibtdie Datensatz-Typen der Kategorie Well-Known und definiert die Regeln für das Erstellenexterner Typen. Der MIME-RFC und der URI-RFC legen die Regeln für die anderen Typfest.

So kann zum Beispiel ein Datensatz der Art TNF 01 (Well-Known) einen Datensatz-Typ»T« für eine Textnachricht, »U« für eine URI-Nachricht oder »Sp« für ein Smart Poster

NDEF-Struktur | 51

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 8: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

enthalten. Ein Datensatz der Art TNF 02 (MIME Media-Type) ist eventuell einer der vie-len verschiedenen Datensatz-Typen wie »text/html«, »text/json« oder »image/gif«. EinDatensatz der Art TNF 03 (Absolute URI) würde eine URI als Typ enthalten, zum Beispielhttp://schemas.xmlsoap.org/soap/envelope/. Für Datensätze der Art TNF 04 (External) gibtes ebenfalls viele verschiedene Datensatz-Typen, von denen der in diesem Buch amhäufigsten genannte »android.com:pkg« lautet.

Mehr Details finden Sie in der NDEF Specification zu Formaten für NFC Forum RecordType-Definitionen (http://bit.ly/specs-rtd). In Tabelle A-3 gibt es ebenfalls eine Liste mitgebräuchlichen NFC-RTD-Spezifikationen.

NDEF-Nachrichten können mehrere Payload-Typen enthalten, aber es ist Konvention,dass der Typ des ersten Datensatzes festlegt, wie die gesamte Nachricht verarbeitet wird.So wird zum Beispiel beim Android-Filter für NDEF-Nachrichten nur der erste Datensatzbeachtet.

URIs in NDEF-Nachrichten

Die Begriffe URI, URL und URN werden Ihnen in diesem Buch häufiger gegegnen. EinURI (Uniform Resource Identifier) ist eine Zeichenkette, die eine Webressource identifi-ziert. Ein URN (Uniform Resource Name) benennt den URI, und eine URL (UniformResource Locator) enthält auch noch das erforderliche Transportprotokoll, um an dieRessource zu gelangen. Wenn es sich bei der URN um Ihren Namen handelt, findet sichim URI Ihre Adresse und die URL gibt an, mit welchem Bus man zu Ihnen gelangt. InWebbegriffen:

URNmySpecialApp

URInet.tigoe.mySpecialApp (im Reverse Domain Format)

URLhttp://tigoe.net/mySpecialApp

Das Type Name Format »Absolute URI« ist ein wenig missverständlich. Das TNF gibt an,dass der Datensatz-Typ ein URI ist, nicht aber die Payload. Der URI im Typ-Feld be-schreibt die Payload – so wie ein MIME-Typ die Payload für TNF 02 festlegt. So nutzenzum Beispiel Windows und Windows Phone TNF 03 (Absolute URI) für LaunchApp-Datensätze mit dem Wert »windows.com/LaunchApp«. LaunchApp-Datensätze fordernden Benutzer auf, eine App zu starten – so wie Android die Android Application Recordszum Starten von Apps einsetzt. Wenn die App nicht installiert ist, wird der Benutzergebeten, sie aus dem Store herunterzuladen.

Android umgeht die NDEF-Spezifikation mit Absolute URI-Datensätzen ein wenig. Auchwenn die NDEF-Spezifikation besagt, dass der Typ die Payload beschreibt, verarbeitetAndroid Datensätze der Art TNF 03 (Absolute URI), indem es den Browser mit der URIaus dem Typ-Feld öffnet – damit interpretiert es diese URI so, als ob es sich um die Pay-

52 | Kapitel 4: Einfuhrung in NDEF

Page 9: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

load handelt würde. BlackBerry und Windows Phone öffnen den Browser nicht, wenn einAbsolute URI-Tag gescannt wird.

Wenn Sie ein URI oder eine URL als Payload verschicken möchten, sollten Sie nicht TNF03 (Absolute URI) verwenden, sondern sie als TNF 01 (Well-Known) mit der NFC RTD»U« (URI) kodieren. Die NDEF-Spezifikation enthält eine URI Record Type Definitionmit URI Identifier Codes für ein effizienteres Kodieren von URIs. So ist zum Beispiel 0x01der Code für http://www und 0x02 der für https://www. In »Verschiedene Datensatz-Typen schreiben« auf Seite 66 werden Sie ein Beispiel kennenlernen, in dem Sie eine URLzu einer Payload hinzufügen und dabei mit einem einzelnen Byte mit dem Wert 0x01 denAbschnitt http://www beschreiben. Das werden Sie genauer in der folgenden Anwendungsehen, auch ein Blick in Tabelle A-3 kann hier helfen.

Sie können URIs auch als TNF 01 (Well-Known) mit dem NFC RTD »Sp« (Smart Poster)verpacken. Bei Smart Poster-Datensätzen kann der URI von Zusatzinformationen beglei-tet werden, zum Beispiel textuellen Beschreibungen in mehreren Sprachen, Symbolen undweiteren Verarbeitungsanweisungen.

Payload-KennungDie Payload-Kennung, ein optionales Feld, sollte ein gültiger URI sein. Er kann relativsein, daher ist selbst »foo« korrekt. Die Kennung wird genutzt, damit Ihre Anwendungendie Payload im Datensatz über die ID identifizieren können oder damit andere Payloadsauf diese verweisen können. Es liegt an Ihnen, sich für eine Payload-ID zu entscheiden. Siekönnen sie aber auch weglassen.

PayloadDie Payload ist Ihr Inhalt. Sie kann alles enthalten, was sich in einem Bytestream ver-packen lässt. Eine sauber gebaute NDEF-Bibliothek kümmert sich nicht darum, was sichin der Payload befindet, sondern leitet sie einfach weiter. Sie können die Payload ver-schlüsseln, reinen Text versenden, einen Binärblob übergeben oder sonstiges dort unter-bringen. Die versendende Anwendung und die empfangende Anwendung müssen sichdarüber einig werden, was die Payload zu bedeuten hat und wie sie formatiert ist.

Abbildung 4-2 enthält weitere Informationen über das Binärformat des ersten Bytes desDatensatz-Headers. Sie werden diese Information hoffentlich niemals benötigen, da sichjede ordentlich geschriebene NDEF-Bibliothek selbst darum kümmert. Wenn Sie die indiesem Buch vorgestellten Software-Bibliotheken nutzen, ist das der Fall. Die genauerenDetails der Binärformatierung werden Ihnen abgenommen und Sie können direkt zu»NDEF in der Praxis« auf Seite 56 weiterblättern. Wenn Sie aber die Struktur von Nach-richten und Datensätzen genauer verstehen möchten, lesen Sie weiter.

NDEF-Struktur | 53

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 10: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Datensatz-LayoutDie ersten fünf Bytes des NDEF-Datensatzes sind Flags, mit denen angegeben wird, wieder Datensatz zu verarbeiten ist und welche Position er in der Nachricht hat.

Die Bit-Flags im ersten Byte des Datensatz-Headers sind folgende:

MB (Message Begin)True, wenn dies der erste Datensatz in einer Nachricht ist.

ME (Message End)True, wenn dies der letzte Datensatz in einer Nachricht ist.

CF (Chunk Flag)True, wenn dieser Datensatz aufgeteilt ist.

SR (Short Record)True, wenn das Short Record Format für die Länge der Payload verwendet wird.

IL (ID Length is Present)True, wenn das Feld ID Length vorhanden ist.

Beachten Sie, dass das IL-Bit nicht die Länge des ID-Felds enthält, sondern nur angibt, obletzteres vorhanden ist. Ist das IL-Bit 0, dann gibt es kein ID Length-Feld und auch keinID-Feld.

Die Bit-Flags Message Begin und Message End werden zum Verarbeiten des Datensatzesin einer Nachricht verwendet. Da eine NDEF-Nachricht nur ein Verbund von einem odermehreren NDEF-Datensätzen ist, gibt es kein Binärformat für eine NDEF-Nachricht. DieFlags MB und ME ermöglichen Ihnen zu erkennen, wann die Nachricht beginnt undwann sie endet. Der erste Datensatz in einer Nachricht hat sein MB-Flag auf True gesetzt.Bei den »mittleren« Datensätzen sind beide Flags False und beim letzten Datensatz einerNachricht ist das Flag ME auf True gesetzt. Bei einer Nachricht mit nur einem Datensatzsind sowohl Message Begin als auch Message End auf True gesetzt.

Da es nur acht mögliche Type Name Formats gibt, werden auch nur 3 Bits zum Ablegenbenötigt. Das TNF ist daher in den letzten drei Bits des Message Flags Byte untergebracht.

Datensatz-HeaderNDEF-Datensätze haben Datenstrukturen mit variabler Länge. Der Datensatz-Headerenthält die Informationen, die nötig sind, um die Daten auslesen zu können.

Ein NDEF-Datensatz beginnt mit dem TNF-Byte, zu dem auch die Bit-Flags gehören.Nach dem TNF folgt die Typ-Länge. Diese ist ein Byte lang und definiert die Länge desPayload-Typs in Bytes. Sie muss vorhanden sein, ihr Wert kann aber 0 betragen.

Die Payload-Länge folgt als Nächstes. Das Short Record (SR)-Bit-Flag im ersten Byte desDatensatz-Headers bestimmt die Länge des Payload-Datensatzes. Wenn SR den Wert

54 | Kapitel 4: Einfuhrung in NDEF

Page 11: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

True hat, ist die Payload-Länge ein Byte lang, ansonsten vier Bytes. Die Payload-Längemuss vorhanden sein, kann aber den Wert 0 haben.

Wenn das ID Length-Feld vorhanden ist und das IL-Flag den Wert True hat, enthält dasnächste Byte im Header die ID-Länge.

Das Feld mit dem Datensatz-Typ hat eine variable Länge und folgt nach dem ID Length-Feld (oder nach dem Feld mit der Payload-Länge, wenn das IL-Flag False ist). Das Feldmit der Typ-Länge bestimmt, wie viele Bytes gelesen werden müssen.

Wenn es eine Datensatz-ID gibt, folgt diese nach dem Typ. Die Länge dieses Feldes wirddurch das ID Length-Byte bestimmt.

Damit ist der Header abgeschlossen und als Nächstes folgt die Payload.

Wie groß kann eine NDEF-Nachricht sein?Die Payload eines NDEF-Datensatzes kann höchstens 232–1 Byte lang sein, denn das Feldfür die Payload-Länge ist nur vier Bytes (oder 232 Bits) groß. Aber es können ja in einerNachricht mehrere Datensätze zusammengefügt werden, um eine längere Payload zuermöglichen. Theoretisch gibt es keine Obergrenze für die Länge einer NDEF-Nachricht.In der Praxis sind aber durch die Möglichkeiten Ihrer Geräte und Tags entsprechendeGrenzen gesetzt. Wenn Sie Peer-to-Peer-Nachrichten zwischen Geräten austauschen undTags nicht daran beteiligt sind, sind Ihre NDEF-Nachrichten nur durch die Rechen-kapazitäten Ihrer Geräte und die Geduld desjenigen begrenzt, der die Geräte aneinander-hält. Wenn die Kommunikation zwischen Tag und Gerät erfolgt, sind Ihre Nachrichtenvor allem durch die Speichergröße des Tags begrenzt.

Wenn Sie NFC-Tags verwenden, liegt die Grenze für Ihre Datensätze weit unter den 232–1Byte. NFC-Tag-Typen basieren auf einigen wenigen RFID-Tag-Standards. Die meistenNFC-Tag-Typen nutzen den ISO-14443A-Standard. Dieser beginnt bei 96 Byte und reichtabhängig vom Tag-Typ bis 4K. Die Familie der Philips/NXP Mifare-Tags ist kompatibelmit NFC, ebenso die Tags vom Typ Mifare Ultralights, Mifare Classic 1K und 4K sowieClassic Mini. Es gibt einen Typ NFC-Tags, der auf dem Japanese Industrial Standard (JIS)X 6319-4 beruht. Dieser besitzt bis zu 1 MB Speicher. Sony FeliCa-Tags haben imAllgemeinen diesen Typ. Mehr Details zur Tag-Spezifikation finden Sie im entsprechen-den Abschnitt auf der Website des NFC Forum.

Im Allgemeinen werden per NFC nur wenig Daten ausgetauscht. Eine Person hält ihrGerät an ein Tag oder ein anderes Gerät, es gibt einen kurzen Austausch und die Persongeht weiter. Das Protokoll ist nicht für größere Datentransfers gedacht, da die Devicesdirekt aneinander gehalten werden müssen. Wenn Sie große Nachrichten übertragen,muss der Anwender das Gerät so lange an der entsprechenden Stelle halten, bis dieNachricht übermittelt ist. Das kann langweilig werden, daher verwenden die Nutzer NFCin solchen Fällen eher dafür, eine andere Kommunikationsmöglichkeit auszuhandeln unddann zu dieser – sei es WLAN oder Bluetooth – zu wechseln, um Daten oder Mediendatenauszutauschen.

Datensatz-Layout | 55

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 12: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Hier ein typisches Beispiel für die Kooperation von NFC und WLAN: Stellen Sie sich vor,Sie haben einen NFC-fähigen Musikabspieler, der Musikstücke mit Ihrem Smartphoneoder Tablet per WLAN von einem zentralen Medienserver bei Ihnen im Keller synchro-nisieren kann. Sie hören ein Album auf der Stereoanlage, müssen jetzt aber zur Arbeitfahren. Sie tippen mit Ihrem Smartphone an die Stereoanlage und diese teilt dem Telefonper NFC mit, welches Stück gerade läuft und wie weit es schon abgespielt ist. Ihr Telefonprüft dann, ob es das Lied in seiner Playlist findet. Ist das nicht der Fall, lädt es die Musikper WLAN oder Mobilfunk herunter. Sie verlassen das Haus und wenn Sie Ihre Kopfhöreraufsetzen, können Sie mit dem Album an der Stelle fortfahren, an der Sie es auf derStereoanlage unterbrochen haben.

Datensatze aufteilenWenn Sie Daten übertragen müssen, die über die Grenze von 232–1 Byte hinausgehen,können Sie eine Payload in Pakete (Chunks) unterteilen und in mehreren Datensätzenübertragen. Dann setzen Sie das Chunk Flag (eines der TNF-Flag-Bits) für den ersten undalle folgenden Datensätze auf 1 – nur beim letzten nicht. Daten lassen sich allerdings nichtauf mehrere NDEF-Nachrichten aufteilen.

Das TNF wird im ersten aufgeteilten Datensatz gesetzt. Nachfolgende Chunks müssenTNF 06 (Unchanged) verwenden. Die mittleren Chunks und der abschließende Chunkmüssen eine Typ-Länge von 0 aufweisen.

Die Länge der Payload eines jeden Datensatzes ist nur die der Daten in diesem Chunk.

Nachrichten über 500 MB (das sind 232 Bits) dürften eher unwahrscheinlich sein, deshalbwerden Sie Datensätze nur selten aufteilen. Aber das Chunking kann auch für dynamischerzeugte Inhalte verwendet werden, insbesondere wenn die Länge der Payload vorab nichtbekannt ist.

Chunking wird recht selten eingesetzt. Bei keiner der in diesem Buch genutzten Biblio-theken ist Chunking implementiert. Der Parser von Android liest hingegen aufgeteilteNachrichten und kombiniert sie zu logischen NDEF-Datensätzen.

Weitere InformationenMehr Informationen zur Struktur von NDEF (einschließlich einer praktischen Sammlungvon Tests für das Schreiben Ihrer eigenen Parsing-Engine) finden Sie auf den Spezifikati-ons-Seiten des NFC Forum (http://bit.ly/nfc-tech-specs).

NDEF in der PraxisUm NDEF in der Praxis zu erleben, kann man sich vorhandene Anwendungen anschauen.In diesem Abschnitt werden Sie einige vorhandene Apps auf Ihr Device herunterladen, sodass Sie Tags schreiben und deren Einsatz testen können.

56 | Kapitel 4: Einfuhrung in NDEF

Page 13: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Eine der beliebtesten Aktivitäten bei den bekannten Tag-Writer-Apps ist das Check-In beiFoursquare. Wenn Sie ein entsprechend formatiertes Tag antippen, verbindet sich IhrDevice automatisch mit der Social Media App Foursquare und checkt Sie an diesem Ortein. Allerdings geht jede App hier ein wenig anders vor und die Unterschiede zeigen sichdann auch in den Ergebnissen.

Für dieses Projekt benötigen Sie Folgendes:

• ein NFC-fähiges Android-Smartphone

• fünf NFC-Tags

• die im Folgenden aufgeführten Apps (Sie können Sie auf Ihrem Device direkt ausGoogle Play installieren.)

Wir gehen zudem davon aus, dass Sie Kapitel 3 durchgelesen und die Software, die zumUmsetzen der Beispiele in dem Kapitel erforderlich ist, vollständig installiert haben.

Die besten Ergebnisse für verschiedene Geräte erhalten Sie mit den Tag-Typen des NFC Forum. Mifare Classic Tags lassen sich von vielen neuerenGeräten nicht mehr lesen. In »Passende Devices und Tag-Typen« auf Seite 19erfahren Sie mehr über die Zusammenarbeit von Tags und Geräten. Ver-meiden Sie auch Tags vom Typ 2 (Mifare Ultralight), da diese nicht überausreichend Speicher für dieses Projekt verfügen.

Zum Vergleichen haben wir die folgenden Apps verwendet:

• Trigger (http://bit.ly/trigger-app) von TagStand

• NFC TagWriter (http://bit.ly/nfc-tagwriter) von NXP

• NFC Writer (http://bit.ly/nfc-tagstand), ebenfalls von TagStand

• TecTiles (http://bit.ly/samsung-techtiles) von Samsung (funktioniert nur in den USAund in Kanada)

• App Lancher NFC Tag Writer (http://bit.ly/app-lancher) [sic] von vvakame

Sie benötigen zudem noch NXP TagInfo (http://bit.ly/nfc-taginfo), um die Tags wiederauszulesen, Foursquare für Android (http://bit.ly/foursq-android) und einen Foursquare-Account (http://www.foursquare.com).

Melden Sie sich an der Foursquare-App an, bevor Sie mit den Tests fortfahren. WennProbleme auftreten (zum Beispiel ein Flackern und Verschwinden der App), melden Siesich wieder an. Dies ist ein gutes Beispiel für die Art von Problemen, die außerhalb IhrerKontrolle liegen. Nachdem die Payload an Android übergeben wurde, ist eine App (wieFoursquare) für die weitere Verarbeitung zuständig. Wenn diese App dann ins Stolperngerät, können Sie im Allgemeinen nicht viel tun.

Machen Sie sich keine Gedanken, wenn Sie sich nicht an dem Ort befinden, an dem Sieeinchecken wollen. Jede App muss um Erlaubnis fragen, wenn sie Foursquare nutzenmöchte, und Sie können die Check-Ins später auch auf der Foursquare-Website wieder

NDEF in der Praxis | 57

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 14: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

löschen. Ihre Freunde müssen sich also nicht wundern, wo Sie sich herumtreiben,während Sie NFC testen!

Das Schreiben der Tags ist für diese Apps recht einfach – außer bei TagWriter. Dies sinddie grundlegenden Schritte:

NFC Task LauncherÖffnen Sie die App und klicken Sie oben auf das +, um einen neuen Task zu erstellen.Wählen Sie aus der Kategorie-Liste »NFC«. Geben Sie Ihrem Task einen Namen undtippen Sie dann auf den +-Button. Wählen Sie aus der Liste »Social Media« undanschließend »Foursquare Check-in at a venue«. Wählen Sie ein Venue aus, indemSie einen Namen eingeben, oder tippen Sie auf die Lupe, damit die App nach Venuesin der Nähe sucht. Tippen Sie auf »OK« und anschließend auf »Add to Task«. TippenSie auf den Pfeil nach rechts, um auf das Tag zu schreiben. Wenn Sie Ihr Telefon aufdas Tag legen, wird die App den Schreibvorgang starten.

TagStand WriterÖffnen Sie die App, tippen Sie auf »Foursquare Venue« und wählen Sie ein Venueaus. Wenn der Bildschirm zum Schreib-Bildschirm wechselt, tippen Sie auf den Ve-nue-Namen, um den Inhalt des Tags anzuzeigen. Schreiben Sie die URL wie inAbbildung 4-3 auf, denn Sie benötigen sie für den NXP TagWriter. Wenn Sie dasTelefon über dem Tag platzieren, wird dieses beschrieben werden.

Abbildung 4-3: Wenn Sie sich auf dem Tag-Schreib-Bildschirm von TagStand Writer befinden, könnenSie auf den Venue-Namen tippen, um die vollständige URL des Venues zu erhalten

58 | Kapitel 4: Einfuhrung in NDEF

Page 15: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

NFC TagWriterÖffnen Sie die App und wählen Sie »Create, Write, and Store«. Tippen Sie nun auf»New« und wählen Sie im angezeigten Menü »URI« aus. Geben Sie im Beschrei-bungsfeld »Foursquare Check-in« ein. Für diese Übung ist eine Beschreibung erfor-derlich, damit ein Smart Poster-Datensatz auf das Tag geschrieben wird. Geben Siedas Foursquare Venue wie folgt ein: http://m.foursquare.com/venue/venueid, wobeivenueid ein langer, hexadezimaler String ist. Übernehmen Sie ihn von der URL, die Sieaus dem TagStand Writer abgeschrieben haben. Vergessen Sie dabei nicht das http://.Tippen Sie auf »Next«. Wenn Sie das Smartphone über das Tag halten, werden dieDaten übertragen.

Samsung TecTilesAchten Sie darauf, dass Foursquare schon installiert ist. Öffnen Sie die TecTiles-Appund klicken Sie auf »New Task«. Geben Sie ihm einen Namen und tippen Sie auf»OK«. Tippen Sie nun auf »Add«, um einen neuen Task anzulegen, und dann auf»Application«. Wählen Sie in der Liste der Apps «Foursquare« aus. Tippen Sie auf»Write to Tag«. Wenn Sie das Smartphone über das Tag halten, wird der Schreib-vorgang gestartet.

AppLauncher NFCÖffnen Sie die App und wählen Sie »Foursquare« aus. Wenn Sie das Telefon über dasTag halten, wird der Schreibvorgang gestartet.

Wenn Sie fünf Tags beschrieben und beschriftet haben, probieren Sie sie aus. SchließenSie alle Apps und halten Sie das Telefon über das Tag. Die Reaktionen sollten wie inTabelle 4-1 ausfallen.

Als Nächstes öffnen Sie NXP TagInfo. Wenn Sie das Telefon über das Tag halten, wird esvon der App ausgelesen. Wenn Sie NDEF wählen, werden die NDEF-Details des Tagsangezeigt (siehe Tabelle 4-1).

Tabelle 4-1: Die Ausgabe jeder App

App Daten-satz

TNF Datensatz-Typ Payload Aktion

NFC Task Launcher 1 MIME x/nfctl enZ:Foursquare;c:4a917563f964a520401a20e3

Versucht, TaskLauncher App zustarten; bei Erfolgwird die URL an dieFoursquare Appubergeben.

2 External android.com:pkg com.jwsoft.nfcactionlauncher

Tagstand Writer: 1 Well-Known U http://m.foursquare.com/venue/4a917563f964a520401a20e3

Startet die Four-square App undnavigiert zum Ve-nue-Check-In.

NDEF in der Praxis | 59

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 16: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Tabelle 4-1: Die Ausgabe jeder App (Fortsetzung)

App Daten-satz

TNF Datensatz-Typ Payload Aktion

NXP TagWriter 1 Well-Known Sp Startet die Four-square App undnavigiert zum Ve-nue-Check-In.

1.1 U http://m.foursquare.com/venue/4a917563f964a520401a20e3

1.2 T Foursquare check-in

Samsung TecTiles 1 Well-Known U tectile://www/samsung.com/tectiles Versucht, die Tec-Tiles-App zu star-ten.

2 Well-Known T �enTask����Foursquare�com.joelapenna\u1

App Launcher NFC 1 External android.com:pkg com.joelapenna.foursquared Startet nur dieLaunches Four-square App.

Wie Sie sehen, erledigt jede App ihre Aufgabe unterschiedlich. Es gibt aber prinzipiell vierverschiedene Vorgehensweisen:

• Die Foursquare App wird gestartet und der Benutzer muss sich um den Restkümmern (App Launcher NFC).

• Es wird eine URI übermittelt und das Betriebssystem kümmert sich um den Rest(Tagstand Writer).

• Es wird die Original-App gestartet, die wiederum die Foursquare App startet (NFCTask Launcher, Samsung TecTiles).

• Es wird ein Smart Poster übermittelt (NXP TagWriter).

Bei der erste Methode wird nur einen NDEF-Datensatz genutzt, dessen TNF auf »Exter-nal« steht. Der Datensatz-Typ ist dann der Android Application Record für die zustartende Anwendung und der Inhalt ist der eigentliche Name der App. Hier ein Beispiel:

TNF: ExternalRecord type: android.com:pkgcom.joelapenna.foursquared

Mit dieser ersten Methode informieren Sie Android lediglich darüber, welche App zustarten ist.

1 Die Samsung TecTiles-Nachricht enthält nicht ausdruckbare Zeichen. Sie sind aber nicht wichtig und wurdenhier durch Punkte ersetzt. Die Zeile wurde zudem in Form von drei Punkte abgekürzt. Den vollständigenByte-Stream erhalten Sie, indem Sie ein Tag mit TecTiles schreiben und mit NXP TagInfo auslesen.

60 | Kapitel 4: Einfuhrung in NDEF

Page 17: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Bei der zweite Methode wird auch nur ein NDEF-Datensatz genutzt, bei dem das TNF auf»Well-Known« steht und der Datensatz-Typ ein »U« für URI enthält. Auch in diesem Fallist der Inhalt die eigentliche Adresse. Hier wieder ein Beispiel:

TNF: Well-KnownRecord Type: Uhttp://m.foursquare.com/venue/4a917563f964a520401a20e3

Mit der zweiten Methode teilen Sie Android die URI des Objekts mit, das Sie öffnenmöchten, und lassen das Betriebssystem entscheiden, welche Anwendung dafür die besteWahl ist. Das ist ein wenig so wie unter Windows, wo das Betriebssystem entscheidet,welche Anwendung eine Datei mit einer bestimmten Erweiterung öffnet. Wäre Four-square nicht auf Ihrem Device vorhanden, hätte sich Google Play um diese URLsgekümmert.

Bei der dritten Methode wird eine NDEF-Nachricht genutzt, die aus zwei NDEF-Daten-sätzen besteht. Sowohl beim NFC Task Launcher als auch bei den Samsung TecTileskümmert sich die eigentliche App um das Lesen des Tags und das Starten von Foursquare.NFC Task Launcher nutzt einen MIME-Type-Datensatz, der die Foursquare Venue-In-formation sowie einen External AAR-Datensatz enthält, mit dem sichergestellt wird, dassdie Anwendung installiert ist. TecTiles verfolgt einen ähnlichen Ansatz mit einer anderenImplementierung. Hier wird ein URI-Datensatz mit einer speziellen tectile://-URL ver-wendet, um die Anwendung zu starten. Die Foursquare-Information wird dabei in einemzweiten Text-Datensatz verpackt. Leider startet TecTiles nur die Anwendung, ohne dieVenue-Information mitzugeben. Bei beiden Applikationen kommen Intent-Filter zumEinsatz, falls sie gestartet werden sollen, wenn ihr Tag gescannt wird. NFC Task Launcherregistriert sich auf den MIME-Typ x/nfctl, TecTiles auf ihre spezielle tectile://-URI. Mehrzu Intent-Filtern erfahren Sie in »Das Tag Dispatch System von Android« auf Seite 88.

Bei der vierte Methode kommt ein Smart Poster-Datensatz zum Einsatz. Dabei handelt essich um einen komplexeren NDEF-Datensatz, bei dem die Payload letztendlich wiedereine weitere NDEF-Nachricht ist. Die in die Smart Poster Payload eingebettete Nachrichtbesteht aus zwei NDEF-Datensätzen – einer URI und einem Text-Datensatz. Da SmartPoster-Datensätze mehrere Datensätze enthalten, können sie weitere Informationen zurURI enthalten – zum Beispiel einen Titel, ein Symbol oder Aktions-Vorschläge.

Manche der Anwendungen, wie zum Beispiel TecTiles und NFC Task Launcher, schrei-ben Android Application Records, um statt Foursquare ihre eigene App zu starten, diedann wiederum Foursquare startet. Damit können sie vermutlich protokollieren, wannihre App im Einsatz ist, selbst wenn im Endeffekt eine andere App gestartet wird. Das istkomplizierter, ermöglicht aber das Erstellen von Statistiken für den Einsatz Ihrer App.

Eine Tag-Writer-Anwendung: Foursquare Check-InIn diesem Abschnitt werden Sie Ihre eigene Tag-Writer-App schreiben, um ein besseresVerständnis bezüglich des Vorgangs zu erhalten. Diese App ist sehr einfach – sie sucht

Eine Tag-Writer-Anwendung: Foursquare Check-In | 61

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 18: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

nach einem Tag, das sie als NDEF-Tag formatieren kann. Wenn sie ein solches Tag findet,schreibt sie eine NDEF-Nachricht auf das Tag.

Für dieses Projekt benötigen Sie Folgendes:

• ein NFC-fähiges Android-Smartphone

• fünf RFID-Tags

• Foursquare für Android (http://bit.ly/foursq-android) und einen Foursquare (http://www.foursquare.com)-Account

Legen Sie als erstes ein neues Projekt an (siehe Kapitel 3). Verwenden Sie Cordova zumErstellen eines Projekts, fügen Sie die Android-Plattform hinzu und installieren Sie dasPlugin:

$ cordova create ~/FoursquareCheckin com.example.checkin FoursquareCheckin 1

$ cd ~/FoursquareCheckin 2

$ cordova platform add android$ cordova plugin add https://github.com/chariotsolutions/phonegap-nfc

1 Windows-Anwender sollten statt ~/FoursquareCheckin das Verzeichnis %userpro-file%\FoursquareCheckin nutzen.

2 Windows-Anwender sollten statt ~/FoursquareCheckin den Wert /d %userpro-file%\FoursquareCheckin nutzen.

Jetzt können Sie Ihre App schreiben, indem Sie die HTML- und JavaScript-Dateien be-arbeiten. Die Datei index.html findet sich im Verzeichnis www des App-Ordners, währendindex.js in www/js abgelegt ist. Öffnen Sie beide und löschen Sie sämtlichen Inhalt, umIhre eigene App von Grund auf selbst zu schreiben. Beginnen Sie mit index.html undtragen Sie Folgendes ein:

<!DOCTYPE html>

<html><head>

<title>Foursquare Check-In Tag Writer</title><style>body { margin: 20px }</style>

</head><body>

<p>Foursquare Check-In Tag Writer</p>

<div class="app"><div id="messageDiv">Kein Tag gefunden</div>

</div>

<script type="text/javascript" src="cordova.js"></script><script type="text/javascript" src="js/index.js"></script><script type="text/javascript">

app.initialize();</script>

</body></html>

62 | Kapitel 4: Einfuhrung in NDEF

Page 19: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Einen NDEF-Datensatz auf ein Tag schreibenAls Nächstes werden Sie die Datei index.js bearbeiten, um einen NDEF-Datensatz zuerstellen und eine NDEF-Nachricht auf das vorgefundene Tag zu schreiben. Wir wollen esuns einfach machen und werden daher die meisten Parameter fest vorgeben. Sie habennun schon viele Methoden kennengelernt, um einen Foursquare Check-In auszulösen.Für den Anfang werden wir es schlicht halten - wir starten die Foursquare-App über einenAndroid Application Record.

Beginnen Sie mit einer Variablen, die geschrieben werden soll, wenn ein Tag gefundenwird:

var app = {messageToWrite: [], // Nachricht, die beim nachsten NFC-Event geschrieben wird

Als Nächstes folgt eine Funktion initialize(), um alles einzurichten, und eine FunktionbindEvents(), um einen Event-Listener zu erstellen, der erkennt, wenn das Device bereitist:

// Anwendungs-Konstruktorinitialize: function() {

this.bindEvents();console.log("Foursquare Checkin App wird gestartet");

},/*

Events beim Starten an Listener binden:*/bindEvents: function() {

document.addEventListener('deviceready', this.onDeviceReady, false);},

Nun folgt ein Handler, der den Bildschirm leert und einen Event-Listener hinzufügt, umauf gefundene Tags zu reagieren:

/*Wird ausgefuhrt, wenn das Gerat zur Benutzerinteraktion bereit ist:

*/onDeviceReady: function() {

app.clear();

nfc.addTagDiscoveredListener(app.onNfc, // Tag erfolgreich gescanntfunction (status) { // Listener erfolgreich initialisiert

app.makeMessage();app.display("Tippen Sie ein NFC-Tag an, um Daten zu schreiben");

},function (error) { // Listener ließ sich nicht initialisieren

app.display("NFC-Writer konnte nicht initialisiert werden "+ JSON.stringify(error));

})

},

Eine Tag-Writer-Anwendung: Foursquare Check-In | 63

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 20: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Der NFC-Event-Handler onNfc() schreibt auf das Tag:

/*Aufruf, wenn ein NFC-Tag gefunden wird:

*/onNfc: function(nfcEvent) {

app.writeTag(app.messageToWrite);},

Als Nächstes folgen die Funktionen display() und clear(), die Sie schon aus »PhoneGaptrifft NFC: NFC-Leser« auf Seite 41 kennen:

/*@message an das messageDiv anfugen:

*/display: function(message) {

var label = document.createTextNode(message),lineBreak = document.createElement("br");

messageDiv.appendChild(lineBreak); // Zeilenumbruch ...messageDiv.appendChild(label); // ... und Text hinzufugen

},/*

messageDiv leeren:*/clear: function() {

messageDiv.innerHTML = "";},

Die Methoden makeMessage() und writeTag() nutzen die Funktionen zweier Objekte, diedurch das NFC-Plugin definiert werden. Es gibt das NFC-Objekt, mit dem Sie Zugriff aufden NFC-Leser Ihres Geräts erhalten, und das NDEF-Objekt, das NDEF-Datensätze und-Nachrichten definiert und formatiert.

makeMessage: function() {// Die Elemente der NDEF-Nachricht zusammenbauen:var tnf = ndef.TNF_EXTERNAL_TYPE, // NDEF Type Name Format

recordType = "android.com:pkg", // NDEF Datensatz-Typpayload = "com.joelapenna.foursquared", // Inhalt des Datensatzesrecord, // NDEF-Datensatz-Objektmessage = []; // NDEF-Nachricht, die an writeTag() ubergeben wird

// den NDEF-Datensatz erzeugen:record = ndef.record(tnf, recordType, [], payload);// den Datensatz in das message-Array einfugen:message.push(record);app.messageToWrite = message;

},

writeTag: function(message) {// den Datensatz auf das Tag schreiben:nfc.write(

message, // den Datensatz selbst schreibenfunction () { // nach erfolgreichem Abschluss diese Callback-Funktion aus-

// fuhren:app.display("Daten auf Tag geschrieben."); // in messageDiv schreiben

},

64 | Kapitel 4: Einfuhrung in NDEF

Page 21: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

// Diese Funktion wird ausgefuhrt, wenn das Schreiben fehlschlagt:function (reason) {

alert("Es gab ein Problem " + reason);}

);}

}; // Ende der App

Sie wissen schon, dass ein NDEF-Datensatz aus einem TNF, einem Datensatz-Typ undeiner Payload besteht. Das NDEF-Objekt besitzt Funktionen zum Erstellen von NDEF-Datensätzen. Eine NDEF-Nachricht ist dann einfach ein Array aus NDEF-Datensätzen.Um einen neuen NDEF-Datensatz zu erzeugen, müssen Sie vier Parameter übergeben:

Type Name FormatEinen 3-Bit-Wert. Die TNF-Werte sind als Konstanten im NDEF-Objekt enthalten,so dass Sie diese verwenden können.

Datensatz-TypEin String- oder Byte-Array mit 0 bis 255 Byte, das den Datensatz-Typ darstellt. DasNDEF-Objekt enthält auch hier Konstanten für viele dieser Typen. Wie Sie an diesemBeispiel sehen können, sind aber nicht alle enthalten.

Datensatz-IDEin String- oder Byte-Array mit 0 bis 255 Byte. Wie weiter vorne beschrieben sindDatensatz-IDs optional. Sie können daher ein leeres Array nutzen, aber der Wert darfnicht null sein.

PayloadEin String oder Array mit 0 bis (232–1) Byte. Auch hier können Sie ein leeres Arrayangeben und auch dieses darf nicht null sein.

In der Funktion makeMessage() ist das TNF TNF_EXTERNAL_TYPE – hier wird die Konstanteaus dem NDEF-Objekt verwendet. Der Datensatz-Typ ist android.com:pkg, was bedeutet,dass Ihre Payload ein Android Application Record sein wird. Die Datensatz-ID ist nichtangegeben, daher wird ein leeres Array übergeben. Die Payload ist schließlich der Nameder zu startenden App – hier com.joelapenna.foursquared.

Sichern Sie beide Dateien index.html und index.js, wechseln Sie dann in das Haupt-Ver-zeichnis Ihrer neuen App und starten Sie sie:

cordova run

Wenn Sie die App ausführen und dabei das Device vom Tag entfernen, sollten Sie einenBildschirm wie links in Abbildung 4-4 erhalten. Wenn Sie das Tag antippen, wird die Appauf das Tag schreiben und das Ergebnis zurückmelden (siehe rechts in Abbildung 4-4).Wenn Sie die App schließen und mit Ihrem Gerät auf das Tag tippen, sollte Foursquaregestartet werden.

Den kompletten Quellcode finden Sie auf GitHub (http://bit.ly/4square-checkin).

Eine Tag-Writer-Anwendung: Foursquare Check-In | 65

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 22: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Abbildung 4-4: Die Foursquare Check-In App; links wird auf ein Tag gewartet, rechts wurde das Taggeschrieben

Verschiedene Datensatz-Typen schreibenIhre App kann nun auf ein Tag schreiben, um dieses Tag eine andere App starten zulassen. Aber sie kann nicht all die anderen Dinge umsetzen, die Sie vorher gesehen haben.Es wäre toll, wenn Sie alle fünf Startvarianten zu Vergleichszwecken emulieren könnten.Dazu erstellen Sie ein neues Projekt mit dem Namen »FoursquareAdvanced«. InstallierenSie das NFC-Plugin und kopieren Sie dann die Dateien index.html und index.js aus demvorherigen Foursquare Check-In App-Beispiel:

$ cordova create ~/FoursquareAdvanced com.example.advanced FoursquareAdvanced 1

$ cd ~/FoursquareAdvanced 2

$ cordova platform add android$ cordova plugin add https://github.com/chariotsolutions/phonegap-nfc$ cp ~/FoursquareCheckin/www/index.html ~/FoursquareAdvanced/www/.$ cp ~/FoursquareCheckin/www/js/index.js ~/FoursquareAdvanced/www/js/.

1 Windows-Anwender sollte statt ~/FoursquareAdvanced das Verzeichnis %userpro-file%\FoursquareAdvanced nutzen.

66 | Kapitel 4: Einfuhrung in NDEF

Page 23: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

2 Windows-Anwender sollten statt ~/FoursquareAdvanced den Parameter /d %userpro-file%\FoursquareAdvanced nutzen.

Passen Sie die index.html an, indem Sie ein Formular mit einem Auswahlmenü hinzufü-gen, über das der Anwender die zu emulierende App festlegen kann:

<!DOCTYPE html>

<html><head><title>Foursquare Check-In Tag Writer - Erweitert</title><style>

body { margin: 20px }</style>

</head><body><p>Foursquare Check-In Tag Writer – Erweitert</p><div class="app"><form>Ein Tag schreiben: <br /><select id="appPicker"><option value="1">NFC Task Launcher</option><option value="2">TagStand Writer</option><option value="3">NXP TagWriter</option><option value="4">Samsung TecTiles</option><option value="5">App Launcher NFC</option>

</select></form><div id="messageDiv"></div>

</div><script type="text/javascript" src="cordova.js"></script><script type="text/javascript" src="js/index.js"></script><script type="text/javascript">app.initialize();

</script></body>

</html>

Wenn der Anwender eine der Apps aus dem Menü auswählt, können Sie das Form-Ele-ment auswerten und darüber festlegen, wie Ihr Tag formatiert wird. Sichern Sie die Dateiindex.html und öffnen Sie Ihre index.js. Sie müssen makeMessage() entsprechend anpassen.Die neue Funktion wird die hier aufgeführten Apps emulieren, indem sie die verschiede-nen Arten von NDEF-Nachrichten aufbaut. Zunächst wird eine neue lokale Variablehinzugefügt, die das HTML-Form-Element ausliest und den Wert bereitstellt, den derAnwender emulieren möchte. Die übrigen lokalen Variablen werden beibehalten, aller-dings werden die Werte dieses Mal jeweils dynamisch erzeugt:

makeMessage: function() {// den App-Typ aus dem HTML-Form ermitteln, den der Benutzer emuliert haben will:var appType = parseInt(appPicker.value, 10),

tnf, // NDEF Type Name FormatrecordType, // NDEF-Datensatz-Typpayload, // Inhalt des Datensatzes

Eine Tag-Writer-Anwendung: Foursquare Check-In | 67

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 24: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

record, // NDEF-Datensatz-Objektmessage = []; // NDEF-Nachricht, die an writeTag() ubergeben wird

Der Rest der Funktion makeMessage() ändert sich komplett. Es wird abhängig von dergewählten App eine NDEF-Nachricht erstellt. Da das HTML-Form einen Integer-Wertaus dem Options-Menü zurückliefert, können Sie das Ergebnis in einer switch-case-An-weisung einsetzen. In jedem case-Fall wird der zu einer App gehörende Datensatzgeschrieben. Bei Fall 1 wird ein MIME-Media-Datensatz erstellt, der die Anweisungenfür die Task Launcher App enthält. Anschließend folgt ein Android Application Record,damit Android weiß, welche App gestartet werden soll:

switch (appType) {case 1: // NFC Task Launcher

// MIME Media-Datensatz formatieren:recordType = "x/nfctl";payload = "enZ:Foursquare;c:4a917563f964a520401a20e3";record = ndef.mimeMediaRecord(recordType, payload);message.push(record); // Datensatz zur Nachricht hinzufugen

// Android Application Record:tnf = ndef.TNF_EXTERNAL_TYPE;recordType = "android.com:pkg";payload = "com.jwsoft.nfcactionlauncher";record = ndef.record(tnf, recordType, [], payload);message.push(record); // Datensatz zur Nachricht hinzufugenbreak;

In Fall 2 wird ein Datensatz vom Typ Well-Known erstellt, bei dem der RTD auf URIgesetzt ist. Da URIs ein Standard-Format besitzen, enthält die NDEF-Spezifikation URIIdentifier Codes, mit denen Teile des Standard-URI-Headers ersetzt werden können, umdie Payload zu verkleinern. In Tabelle 4-2 finden Sie die ersten URI Identifier Codes.

Tabelle 4-2: Einige der URI Identifier Codes

URI Identifier Code (UIC) Bedeutung

0x00 Keine, fur eigene Header

0x01 http://www.

0x02 https://www.

0x03 http://

Die übrigen URI-Header, die noch verbreitet sind, wie zum Beispiel ftp://, mailto: undfile:///, sind auch mit ihren eigenen Nummern vorhanden. Eine vollständige Liste findenSie im URI Record Type Definition-Dokument, das Teil der NFC-Spezifikation auf derSite des NFC Forum ist. In Tabelle A-3 sind die Codes ebenfalls aufgeführt.

Um den UIC hinzuzufügen, müssen Sie den URI-String in ein Byte-Array umwandeln undden UIC am Anfang einfügen. In Fall 2 wird 0x03 eingetragen – der UIC für http://:

case 2: // Tagstand Writer// URI-Datensatz vom Typ Well-Known:tnf = ndef.TNF_WELL_KNOWN;recordType = ndef.RTD_URI; // URI-Datensatztyp hinzufugen

68 | Kapitel 4: Einfuhrung in NDEF

Page 25: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

// in ein Byte-Array umwandeln:payload = nfc.stringToBytes(

"m.foursquare.com/venue/4a917563f964a520401a20e3");// URI Identifier Code fur "http://" hinzufugen:payload.unshift(0x03);record = ndef.record(tnf, recordType, [], payload);message.push(record); // Datensatz in Nachricht einfugenbreak;

Fall 3 ist ein spezieller Fall, weil hier eine Smart Poster-Nachricht erzeugt wird. SmartPoster sind unter den Well-Known-Typen etwas Besonderes, da deren Datensätze wieder-um NDEF-Nachrichten enthalten. Wie Sie im nächsten Beispiel sehen werden, erstellenSie die Payload des Smart Poster-Datensatzes als Array mit Datensätzen. Dieses Array istdie Nachricht.

In Kapitel 5 werden Sie sehen, wie Sie einen Smart Poster-Datensatz extrahieren, indemSie dessen Inhalt als Nachricht behandeln:

case 3: // NXP TagWriter// Die Payload eines Smart Poster-Datensatzes ist eine NDEF-Nachricht// wir erstellen ein Array mit zwei Datensatzen:var smartPosterPayload = [

ndef.uriRecord("http://m.foursquare.com/venue/4a917563f964a520401a20e3"),

ndef.textRecord("foursquare checkin"),];

// Smart Poster-Datensatz aus dem Array erstellen:record = ndef.smartPoster(smartPosterPayload);// Smart Poster-Datensatz in die Nachricht eintragen:message.push(record);break;

Bei Fall 4 werden ein URI-Datensatz und ein Text-Datensatz mit Binärdaten erzeugt. Wie inFall 2 müssen Sie die URI in ein Byte-Array umwandeln und den URI Identifier Code amAnfang einfügen. Da Samsung hier einen eigenen URI-Header verwendet (tectile://), greifenSie auf den URI Identifier Code 0x00 zurück, der die URI so wie angegeben abspeichert.TecTiles schreiben noch einen zweiten Datensatz mit TNF 01 (Well-Known) und Typ »T«.

Samsung nutzt in der Payload ein proprietäres Token. Sie finden es, wenn Sie mit der NXPTagReader-App ein Tag auslesen, das mit der TecTiles-App geschrieben wurde. Wir ko-pieren es hier, so dass die Nachricht wie von der Samsung App formatiert werden kann:

case 4: // TecTiles// Datensatz als Well-Known formatierentnf = ndef.TNF_WELL_KNOWN;recordType = ndef.RTD_URI; // URI-Datensatztypvar uri = "tectiles://www.samsung.com/tectiles";payload = nfc.stringToBytes(uri);var id = nfc.stringToBytes("0");// URI Identifier 0x00, weil es keine ID fur "tectile://" gibt:payload.unshift(0x00);record = ndef.record(tnf, recordType, id, payload);message.push(record); // Datensatz in die Nachricht einfugen

Eine Tag-Writer-Anwendung: Foursquare Check-In | 69

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 26: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

// Text-Datensatz mit Binardatentnf = ndef.TNF_WELL_KNOWN;recordType = ndef.RTD_TEXT;payload = [];// Sprachcode-Langepayload.push(2);// Sprachcodepayload.push.apply(payload, nfc.stringToBytes("en"));// Task-Namepayload.push.apply(payload, nfc.stringToBytes("Task"));// 4-Byte-Token speziell fur TecTiles:payload.push.apply(payload, [10, 31, 29, 19]);// Anwendungs-Namepayload.push.apply(payload, nfc.stringToBytes("Foursquare"));// NULL-Terminatorpayload.push(0);// Auszufuhrende Aktivitatpayload.push.apply(payload, nfc.stringToBytes(

"com.joelapenna.foursquared.MainActivity"));// NULL-Terminatorpayload.push(0);// packageName der Anwendungpayload.push.apply(payload, nfc.stringToBytes(

"com.joelapenna.foursquared"));id = nfc.stringToBytes("1");record = ndef.record(tnf, recordType, id, payload);message.push(record); // Datensatz in Nachricht einfugenbreak;

Der TecTiles-Datensatz ist für bestimmte Tags zu lang (zum Beispiel fürMifare Ultralight, das nur eine begrenzte Kapazität besitzt).

Bei Fall 5 wird ein Android Application Record genutzt, um Foursquare direkt zu öffnen.Dieser ist wie alle anderen Android Application Records, die Sie schon erzeugt haben. Eshandelt sich hier um ein External TNF mit dem Datensatz-Typ android.com:pkg und demApp-Namen als Payload:

case 5: // App Launcher NFC// Android Application Record:tnf = ndef.TNF_EXTERNAL_TYPE;recordType = "android.com:pkg";payload = "com.joelapenna.foursquared";record = ndef.record(tnf, recordType, [], payload);message.push(record); // Datensatz in Nachricht einfugenbreak;

} // Ende der switch-case-Anweisung

70 | Kapitel 4: Einfuhrung in NDEF

Page 27: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Nun schließen wir die Funktion makeMessage() ab, indem wir die zu schreibende Nach-richt festlegen und den Anwender informieren:

app.messageToWrite = message;app.display("Tippen Sie ein NFC-Tag an, um die Daten zu schreiben");

}, // Ende von makeMessage()

Mit diesen Änderungen können Sie die index.js speichern und die App ausführen (achtenSie darauf, dass immer noch die Funktion writeTag() aus dem vorigen Beispiel enthaltenist):

$ cordova run

Sie erhalten nun ein Auswahlmenü, mit dem Sie die Apps aus Tabelle 4-1 emulierenkönnen. Entscheiden Sie sich für einen Eintrag und tippen Sie dann mit dem Telefon einTag an. Abbildung 4-5 zeigt die App.

Den vollständigen Quellcode finden Sie auf GitHub (http://bit.ly/4squareadv).

Abbildung 4-5: Die erweiterte Foursquare Check-In App; Startbildschirm (links), Optionsmenü (Mitte)und nach dem Schreiben des Tags (rechts)

Zusammenfassung der PhoneGap-NFC NDEF-HilfsfunktionenDie App nutzt eine Reihe von Funktionen der PhoneGap-NFC-Bibliothek, während siedie verschiedenen Ansätze zum Aufrufen von Foursquare emuliert. Es gibt ein paar Hilfs-funktionen im NDEF-Objekt, mit denen sich NDEF-Datensätze erzeugen lassen. Diewichtigste davon ist ndef.record(), der Sie das TNF, den Datensatz-Typ, die ID und diePayload übergeben müssen:

// Angabe von TNF und Datensatz-Typrecord = ndef.record(tnf, recordType, id, payload);

Eine Tag-Writer-Anwendung: Foursquare Check-In | 71

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 28: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

// Beispiel:record = ndef.record(ndef.TNF_EXTERNAL_TYPE, "android.com:pkg",

[],"com.joelapenna.foursquared");

Es gibt auch eine Hilfsfunktion für MIME-Media-Datensätze, der man nur einen MIME-Typ und die Payload übergibt:

// TNF: MIME Media (02)record = ndef.mimeMediaRecord(mimeType, payload);// Beispiel:record = ndef.mimeMediaRecord("text/json", '{"answer": 42}');

Der URI-Helper erstellt einen Datensatz mit TNF 01 (Well-Known) und Datensatz-Typ»U«, um eine URI verschicken zu können (siehe Fall 3 in »Verschiedene Datensatz-Typenschreiben« auf Seite 66). Die Hilfsfunktion verkürzt dabei Ihre URI mit einem URIIdentifier Code. In diesem Beispiel wird http:// im Tag durch 0x03 ersetzt, worauf dannder Rest m.foursquare.com der URI folgt:

// TNF: Well-Known-Typ (01), RTD: URI ("U")record = ndef.uriRecord(uri);// Beispiel:record = ndef.uriRecord("http://m.foursquare.com/");

Die Hilfsfunktion für Text-Datensätze nutzt ein Well-Known-TNF und als Datensatz-Typ»Text«. Wenn keine Sprache angegeben wird, ist der Standard Englisch:

// TNF: Well-Known-Typ (01), RTD: Text ("T")record = ndef.textRecord(text, language);// Beispiel:// Standard ist Englisch, wenn keine Sprache angegeben:record = ndef.textRecord("How are you doing?");

Der Smart Poster Helper erstellt aus anderen Datensätzen ein Smart Poster:

//TNF: Well-Known-Typ (01), RTD: Smart Poster ("Sp")record = ndef.smartPoster(ndefMessage);// Beipiel:record = ndef.smartPoster (

// URI-Datensatz:ndef.uriRecord("http://m.foursquare.com/venue/4a917563f964a520401a20e3"),// Text-Datensatz:ndef.textRecord("foursquare checkin")

);

Es gibt auch einen Helper für einen leeren Datensatz, der nicht in diesem Kapitel genutztwird. Damit erzeugen Sie – nun, einen leeren Datensatz, den Sie anschließend mit Lebenfüllen können:

// TNF: Empty (00)record = ndef.emptyRecord();// Beispiel:record = ndef.emptyRecord(); // leer!

Mit diesen Funktionen können Sie alle Arten von NDEF-Funktionen erzeugen, die wir indiesem Buch einsetzen.

72 | Kapitel 4: Einfuhrung in NDEF

Page 29: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

ZusammenfassungIn den folgenden Kapiteln werden wir die NDEF-Datensätze und -Nachrichten noch wei-ter erläutern. Die wichtigsten Konzepte, die Sie aus diesem Kapitel mitnehmen sollten,sind folgende:

NFC-formatierte Tags enthalten NDEF-Nachrichten. NDEF-Nachrichten bestehen auseinem oder mehreren NDEF-Datensätzen. Sie werden vielleicht in Gesprächen Tags,Nachrichten und Datensätze synonym verwenden wollen – tun Sie das besser nicht.Weiter hinten in diesem Buch werden Sie noch Nachrichten zwischen Geräten austau-schen, ohne dabei Tags einzusetzen.

Alle NDEF-Datensätze verfügen über einen Typ. In den Spezifikationen wird dies manch-mal Payload Type, manchmal Record Type oder nur Type genannt. Das Type NameFormat (TNF) teilt die Typen grob in verschiedene Kategorien ein, so dass Sie wissen, wiediese zu interpretieren sind:

Für TNF 01 (Well-Known)Die NFC Forum-Spezifikation zur Record Type Definition (RTD) legt fest, welcheTypen genutzt werden können.

Für TNF 02 (MIME)Der MIME-RFC (RFC 2046) beschreibt, welche Typen gültig sind.

Für TNF 03 (URI)Der URI-RFC (RFC 3986) beschreibt, wie Sie gültige Typen erzeugen.

Für TNF 04 (External)Die RTD-Spezifikation des NFC Forum RTD beschreibt, wie Sie Ihren eigenen Typerstellen.

Es gibt acht formale Typ-Namen-Formate für NDEF-Nachrichten, meistens benötigt manaber nur einen von diesen dreien: Well-Known, MIME Media und External. Zum Well-Known TNF gehören eine Reihe nützlicher Definitionen für Datensatz-Typen, zumBeispiel Textnachrichten, URIs, Smart Poster und die verschiedenen Träger für Peer-to-Peer-Handovers. Mehr zu den Peer-to-Peer-Nachrichten erfahren Sie in Kapitel 8. Text-nachrichten und URIs werden Ihnen immer wieder begegnen. Das MIME-Media-TNFkümmert sich um alle Internet-Medientypen und Sie können auch hier eigene Typeneinsetzen (siehe Kapitel 6). Das External TNF wird für Datensätze wie den AndroidApplication Record verwendet.

Smart Poster werden Sie in diesem Buch eher selten begegnen. Wie Sie im entsprechendenFall in »Verschiedene Datensatz-Typen schreiben« auf Seite 66 gesehen haben, ist diePayload eines Smart Poster-Datensatzes selbst eine NDEF-Nachricht. Um also ein SmartPoster zu lesen, müssen Sie noch die eingebettete Nachricht parsen. Das erscheint uns inden meisten Fällen redundant. Es ist besser, einfach mehrere Datensätze in einer NDEF-Nachricht einzusetzen.

Zusammenfassung | 73

Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421

Page 30: Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und ... · Tom Igoe / Don Coleman / Brian Jepson, NFC mit Android und Arduino, O´Reilly, ISBN 9783955618421 D3kjd3Di38lk323nnm

Es gibt viele verschiedene Wege, mit NDEF-Nachrichten das gleiche Ziel zu erreichen.Wie die Nachricht empfangen wird, hängt vom Betriebssystem des Zielgeräts ab. Imnächsten Kapitel werden wir uns ansehen, welche Möglichkeiten Android bietet, umNDEF-Typen für Ihre Anwendung zu filtern.

74 | Kapitel 4: Einfuhrung in NDEF