NFC steht für Near Field Communication und ist ein Übertragungsstandard zum kontaktlosen Austausch von Daten über kurze Strecken von wenigen Zentimetern. Eine typische Anwendung im mobilen Bereich ist das Auslesen von NFC-Tags. Ein Tag ist ein passiver NFC-Chip, der beispielsweise in einer Visitenkarte enthalten sein kann. Dieser kann mehrere Kilobytes an Daten enthalten, die über ein NFC-fähiges Mobilgerät ausgelesen werden können.

In diesem ersten Teil der Artikelserie wird gezeigt, wie URIs zwischen einem Windows Phone und einem NFC-Tag ausgetauscht werden können. Dafür wird die in der Windows Runtime enthaltene Proximity API verwendet. Mit URIs ergeben sich bereits vielseitige Anwendungsmöglichkeiten, die nicht nur auf das Versenden von Website-Links beschränkt sind.

1. Szenarien für NFC-Tags

Es können beliebige Daten über NFC erfasst und je nach Inhaltstyp weiterverarbeitet werden. Übliche Inhalte für einen NFC-Tag sind:

  • Kontaktdaten
  • Termine
  • Links zu Websites (Firmenwebsite, Online Visitenkarten)
  • Links zu Apps im App-Store
  • Allgemeine Informationen (z.B. Objektbeschreibungen in Museen)
  • Kleinere Bilder
  • App Erweiterungen/zusätzliche Inhalte (Digitale Gegenstände in einem Spiel)

In diesem Artikel werden URIs als Inhaltstyp für die Beispiele verwendet. Durch URIs können neben einfachen Links zu Websites oder Links zu Apps im App-Store auch Apps mit bestimmten, im Tag hinterlegten Parametern gestartet werden. Die Möglichkeiten sind hierdurch sehr vielseitig und werden in Abschnitt 6 nochmal ausführlicher dargestellt.

2. Die Windows Proximity API

Die wichtigsten Klassen der Proximity API sind ProximityDevice und ProximityMessage.

ProximityDevice:

  • Kapselt die eigentliche Verbindung zur Hardware
  • Erkennt NFC Tags oder Geräte in der Nähe
  • Liest und schreibt NFC Nachrichten

ProximityMessage:

  • Kapselt die eigentliche NFC Nachricht, die empfangen oder versendet werden kann

Für die folgenden Beispiele wird ein NFC-fähiges Windows Phone benötigt. Die Proximity API wird standardmäßig nicht auf dem Windows Phone Emulator unterstützt.

3. Projekteinstellungen

Für die Verwendung von NFC ist wichtig, dass die nötigen Einstellungen im Package.appxmanifest vorgenommen werden. Hierzu muss unter dem Reiter „Funktionen“ die Option „Näherung“ ausgewählt werden. Dadurch wird der Zugriff auf das ProximityDevice möglich.

Die Option Näherung muss ausgewählt werden, damit NFC verwendet werden kann. Die Option Näherung muss ausgewählt werden, damit NFC verwendet werden kann.

Damit die App auch nur auf NFC-fähigen Geräten installiert werden kann, kann zudem unter dem Reiter „Anforderungen“ noch die Option „NFC“ ausgewählt werden.

NFC kann als Mindestanforderung für das Gerät festgelegt werden. NFC kann als Mindestanforderung für das Gerät festgelegt werden.

4. URI von Tag oder Gerät empfangen

Zum Empfangen von Inhalten über NFC sind drei Schritte notwendig:

4.1 NFC Proximity Device aktivieren

Über die statische Methode GetDefault() der oben vorgestellten Klasse ProximityDevice wird eine Instanz dieser Klasse erstellt und die NFC-Näherung aktiviert. Hierbei ist eine Überprüfung auf null notwendig, die zutrifft, falls kein entsprechendes Gerät vorhanden ist oder der Benutzer NFC deaktiviert hat.

1
2
3
4
5
6
7
8
// Get the nfc device
var device = ProximityDevice.GetDefault();

// Test if nfc is available
if (device == null)
{
    await new MessageDialog("Your phone has no NFC or it is disabled").ShowAsync();
}

4.2 Abonnieren eines Protokolls

Um Daten zu empfangen, wird über die Methode SubscribeForMessage ein beliebiges Protokoll abonniert und ein entsprechender EventHandler registriert. Falls sich ein NFC-Gerät oder Tag nähert, welcher das Protokoll bereitstellt, wird die Nachricht übertragen. In diesem Beispiel wird als Protokoll WindowsUri angegeben, welches auf alle Arten von URIs reagiert.

1
2
3
4
5
6
7
8
9
10
// Test if nfc is available
if (device != null)
{
    // Subscribe to uri messages
    this.subscribedMessageId = device.SubscribeForMessage("WindowsUri", this.MessageReceivedHandler);
}
else
{
    await new MessageDialog("Your phone has no NFC or it is disabled").ShowAsync();
}

Als Rückgabewert wird eine eindeutig ID zurückgeliefert, die der jeweiligen Subscription zugeordnet ist. Zum Beenden der Subscription muss explizit StopSubscribingForMessage mit der jeweiligen ID aufgerufen werden:

// Unsubscribe the handler
this.device.StopSubscribingForMessage(this.subscribedMessageId);

4.3 Lesevorgang

Zum Lesen der Nachricht muss die ankommende ProximityMessage im ersten Schritt in ein Array konvertiert und daraufhin dekodiert werden. Hierzu wird der folgende Namespace benötigt, der die Erweiterungsmethoden bereitstellt, um aus dem ankommenden IBuffer ein Byte-Array zu erzeugen:

using System.Runtime.InteropServices.WindowsRuntime;

Der Lesevorgang erfolgt unabhängig vom UI-Thread. Dementsprechend muss der Dispatcher verwendet werden, um das Ergebnis auf der Seite auszugeben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private async void MessageReceivedHandler(ProximityDevice device, ProximityMessage message)
{
    // Get the data
    var buffer = message.Data.ToArray();

    // Decode the message
    var uri = Encoding.Unicode.GetString(buffer, 0, buffer.Length);

    // Display result in text area - use the dispatcher, as the reading occurs in a separate thread
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        this.TextArea.Text = uri;
    });
}

5. URI veröffentlichen

Um eine URI auf einen Tag zu schreiben, muss diese über das ProximityDevice mit dem entsprechenden Protokoll veröffentlicht werden. Wurde eine Nachricht über NFC ausgetauscht, kann das ProximityDevice automatisch ein Ereignis auslösen.

5.1 Daten vorbereiten

Im ersten Schritt werden die Daten in den benötigten Buffer konvertiert. Hierzu muss ebenfalls der Namespace System.Runtime.InteropServices.WindowsRuntime eingebunden sein.

1
2
3
4
5
6
// Get the uri to publish
var publishUri = new Uri(WriteTagContent.Text, UriKind.RelativeOrAbsolute);

// Convert the data to the needed Buffer
var bytes = Encoding.Unicode.GetBytes(publishUri.ToString());
var buffer = bytes.AsBuffer();

5.2 Daten veröffentlichen

Die Nachricht wird mit der Methode PublishBinaryMessage bereitgestellt, die als ersten Parameter das Protokoll der bereitzustellenden Daten erwartet und als zweiten Parameter die Daten in Form eines IBuffers. Das Protokoll gibt hier in dem Fall über WindowsUri:WriteTag an, dass eine URI für einen NFC-Tag veröffentlicht werden soll. Analog zum Abonnieren von Nachrichten, wird hier auch wieder eine eindeutige ID zurückgeliefert, über die der Veröffentlichungsvorgang wieder gestoppt werden kann.

Optional kann als dritter Parameter eine Callback-Funktion angegeben werden, die aufgerufen wird, wenn die Daten auf einen Tag geschrieben worden sind.

// Start publishing the message, store the message id for later unsubscription
this.publishedMessageId = this.device.PublishBinaryMessage("WindowsUri:WriteTag", buffer, this.PublishedHandler);

5.3 Callback-Funktion

Die Callback-Funktion kann optional bei der Veröffentlichung mit angegeben werden und wird aufgerufen, wenn die Nachricht auf einen Tag geschrieben wurde. Das kann beispielsweise dazu genutzt werden, um dem Nutzer eine Rückmeldung zu geben, dass der Schreibvorgang erfolgreich war. Hierzu wird in folgendem Codeausschnitt die Klasse VibrationDevice verwendet, um eine kurze Vibration zu erzeugen.

Die Veröffentlichung der Nachricht muss explizit über StopPublishingMessage wieder beendet werden. Hierzu kann ebenfalls die Callback-Funktion verwendet werden, falls die URI nur einmal geschrieben werden soll.

1
2
3
4
5
6
7
8
9
10
11
12
private void PublishedHandler(ProximityDevice sender, long messageId)
{
    // Let the device vibrate to indicate that a new message was written
    var vibrationDevice = VibrationDevice.GetDefault();
    if (vibrationDevice != null)
    {
        vibrationDevice.Vibrate(TimeSpan.FromSeconds(0.2));
    }

    // Stops the publishing of the current message
    sender.StopPublishingMessage(messageId);
}

6. Vielseitige Einsatzmöglichkeiten von URIs in NFC Tags

Die Einsatzmöglichkeiten von URIs sind vielseitig und nicht nur auf den Aufruf von Websites beschränkt. Durch das Erfassen eines NFC-Tags können auch Apps mit im Tag hinterlegten Parametern gestartet werden. Diese Funktion kann beispielsweise auch für folgende Bereiche nützlich sein:

  • Eintragen eines Termins in eine Kalender-App
  • Öffnen einer E-Mail-App mit bestimmten Empfänger, Betreff oder Text
  • Starten einer Navigations-App mit einem bestimmten Ziel
  • Abspielen eines Musikstücks in einer Musik-App
  • Koordinaten in Geocaching-Apps
  • Spiele, in denen digitale Inhalte freigeschaltet werden

Allgemeine Aktionen, wie ein Anruf oder das Versenden von Emails sind zudem plattformunabhängig, so dass der Tag ebenfalls unter anderen mobilen Plattformen, wie beispielsweise Android verwendet werden kann. Ein paar Beispiele für Formate der URIs für bestimmte Anwendungen sind in folgender Tabelle dargestellt:

Aktion URI-Format
Anruf starten tel:+49170123123
E-Mail versenden mailto:someone@example.com?subject=This%20is%20the%20subject
Geo Tag http://m.ovi.me/?c=,
Nokia MixRadio zu einem Suchbegriff starten nokia-music://search/anything/?term=green%20day
Nokia Drive zum angegebenen Ziel starten ms-drive-to:?destination.latitude=&destination.longitude=
Bluetooth-Einstellungen öffnen ms-settings-bluetooth:
Wi-Fi-Einstellungen öffnen ms-settings-wifi:
Flugzeugmodus-Einstellungen öffnen ms-settings-airplanemode:

Eine komplette Liste der URIs für Windows Phone Apps ist unter folgendem Link zu finden: http://msdn.microsoft.com/en-us/library/windows/apps/jj662937.aspx

7. Beispiel Experience

Zum Empfang von Nachrichten über NFC muss in den Einstellungen NFC (auf Windows Phone 8 Tap+Send) aktiviert werden. Daraufhin wird der NFC-Sensor aktiv geschaltet und reagiert auf Tags, die an der Rückseite des Geräts erfasst werden können. Wird eine Nachricht auf dem Windows Phone empfangen, wird folgender Dialog angezeigt, mit der Möglichkeit die Nachricht zu akzeptieren oder abzulehnen:

Seit Windows Phone 8.1 besteht zudem die Möglichkeit, die Nachrichten zu einem bestimmten Protokoll (z.B. ms-settings-wifi:) automatisch zu akzeptieren. Der Dialog wird somit nicht mehr angezeigt und die Benutzererfahrung wird durchgängiger.

8. Zusammenfassung

In diesem Artikel wurde gezeigt, wie URIs über NFC gelesen und geschrieben werden können. Hierzu wurde die Klasse ProximityDevice der ProximityAPI verwendet. Für Lese- und Schreibvorgänge mit NFC wird immer ein sogenanntes Protokoll angegeben, welches den Typ der Nachrichten angibt. Im Falle der URI war das beim Lesevorgang WindowsUri und beim Schreiben WindowsUri:WriteTag. Im nächsten Artikel der Serie wird gezeigt, welche anderen Protokolle man noch verwenden kann, um Inhalte über NFC bereitzustellen und zu empfangen.

Beispielprojekt: Lesen und Schreiben von Uris auf NFC-Tags

Das Beispielprojekt ist hier auf GitHub zu finden.