NFC Magie mit Windows Phone UWP und ein paar Cent

Das Thema NFC ging bisher an mir weitestgehend vorüber. Bis ich bei Amazon einen günstigen 40€ NFC Kartenleser entdeckt habe.

ACR122U NFC Reader/Writer + 5 Bonus NFC Tags NXP NTAG213

Den ACR 122U. Im Paket waren noch 5 Karten dabei. Zusätzlich orderte ich aufklebbare Tags NFC NTAG 213 mit 144Byytes Speicher. Diese wurden dann auch

meine treuen Begleiter im weiteren Tests. Um die Funktionsfähigkeit des Readers zu prüfen, wollte ich erfolglos aus den Windows Universal Samples das NFC Projekt kompilieren. Ein netter Zeitgenosse hat es allerdings im Microsoft Store zum Download angeboten.  Folgende Apps kommen zum Einsatz

NFC Demo App

https://www.microsoft.com/store/productId/9NBLGGH1R8BW

NFC Commander auf dem Lumia 650

https://www.microsoft.com/de-de/store/p/nfc-commander/9wzdncrdmmw0

Andere Apps wie von Andreas Jakl finden den NFC Reader nicht. Wie sich nach längerer Suche herausstellt, weil es keinen Windows 10 proximitry Driver für das ACR122U Device gibt. Der erste Versuch startet also mit diversen Kreditkarten, BUILD Teilnehmer Badge, den Karten und den NFC Tags und der NFC App.

image

Dabei zeigt sich, das Thema NFC ist unendlich. Es gibt ca 10 Verschiedene Kartenstandards, die wiederum in verschieden beschrieben werden können. Außerdem zeigt sich, das es eine kurze Weile dauert, bis die Karte erkannt und gelesen wird. Auch die Kommunikation zwischen Karte und Leser findet auf verschiedenen Arten statt. Da mein Wissen im Bereich NFC endlich ist, beschränke ich mich auf die so erkannte MifareUltraLight. Der Speicher wird in 4 +16 Byte Blöcken organisiert, die allerdings wenn man dem üblichen NDEF Format folgt nicht ganz zur Verfügung stehen. Mein Test ergibt 34 nutzbare Bytes.

Auch mein Microsoft Lumia 650 ist ein NFC Device, sozusagen eine Karte oder ein Leser. Angedacht war von Microsoft auch Zahlungsfunktion an der Supermarktkasse, analog zur Kreditkarte anzubieten. Beim probieren mit der App NFC Commmander auf dem Smartphone erkennt man die unglaubliche Vielfalt an Funktion, die in dem Thema steckt. Mit Annäherung lassen sich Apps Starten oder Anrufe tätigen, wenn der Treiber vorhanden ist. Mein Tag wird also mit einem einfachen Text beschrieben, Location DE, durch Annäherung an mein Telefon.

Die NFC Test App am Notebook zeigt nun auch andere Daten in Block 2-4.

Die WinRT API enthält Low Level Funktionen für Annäherung und lesen schreiben. Mit UWP wäre es also ganz einfach ala   Dim nfcDevice = ProximityDevice.GetDefault() auf ein Device zuzugreifen. Wären da nicht die fehlenden Treiber. Im Weiteren Fortgang habe ich dann versucht aus den Devices die Smartcard zu finden und über eine Smartcardconnection Instanz Low Level APDU Kommandos per  Await connection.TransmitAsync(cmd.AsBuffer) an die Karte zu senden. Nach realistischer Aufwandsschätzung die Erkenntnis, das Problem hat bestimmt schon wer gelöst. Eine Library muss her. Wie immer mehrere zur Auswahl. Da die Redmonder in ihrem UWP SDK ein scheinbar funktionierendes Sample ausprogrammiert haben fällt die Wahl auf pcscsdk. Das gibts als Nuget Paket, was mein UWP Projekt im Compilerlauf verweigert, oder einfach den Source Code aus dem SDK Sample “klauen”.

Es wird also ein leeres UWP Projekt erstellt und der Visual Studio Solution eine UWP Klassenbibliothek hinzugefügt. Dabei kann ich wie in meinem Fall auch die Sprachen mischen. Die C# Source Files werden als nächstes in das Library Projekt kopiert. Im UWP App Projekt muss unter Verweise, auf das Class Library Projekt verwiesen werden.

 

image

Das XAML UI enthält nur eine Textbox Text1. Aus einer Liste von in meinem Fall über 6000 Devices wird das mit einer speziellen GUID (siehe Code) herausgefilter um den Smartcardreader zu identifizieren. Dieser bietet dann zwei Events CardAdded, CardRemoved die wie abonniert werden.

   1:  Dim myNFC As SmartCardReader
   2:   
   3:  ....
   4:  Dim query As String = "System.Devices.InterfaceClassGuid:=""{DEEBE6AD-9E01-47E2-A3B2-A66AA2C036C9}"" "
   5:  Dim devices As DeviceInformationCollection = Await DeviceInformation.FindAllAsync(query)
   6:  myNFC = Await SmartCardReader.FromIdAsync(devices(1).Id)
   7:  AddHandler myNFC.CardAdded, AddressOf CardAdded
   8:  AddHandler myNFC.CardRemoved, AddressOf CardRemoved

Das CardAdded Event erlaubt es eine Verbindung zur neuen NFC Karte aufzubauen. Zeile 3 und 4 nutzen bereits das pcscsdk und geben Informationen über den Kartenstandard wieder. In diesem VB.NET Code Beispiel wird das Ergebnis allerdings verworfen, da wir nur den MifareUltra Light Standard hier nutzen wollen.

Es werden 4 x 16 Byte gelesen und das Byte Array in einen String konvertiert. Da die ersten Bytes nur zur Steuerung sind wird in den beiden IF Zweigen der Nutzanteil gefiltert.

 

   1:  Private Async Sub CardAdded(sender As SmartCardReader, args As CardAddedEventArgs)
   2:          Dim card = args.SmartCard
   3:          Using connection As SmartCardConnection = Await card.ConnectAsync()
   4:          Dim cardIdentification = New IccDetection(card, connection)
   5:          Await cardIdentification.DetectCardTypeAync()
   6:              Dim mifareULAccess As MifareUltralight.AccessHandler = New MifareUltralight.AccessHandler(connection)
   7:   
   8:              Dim s As String
   9:              For i = 0 To 3
  10:                  Dim response = Await mifareULAccess.ReadAsync((4 * i))
  11:                  Await DispatcherHelper.ExecuteOnUIThreadAsync(Sub()
  12:                          if i = 1 Then 'die ersten 14 bytes irgendwas mit Typ 
  13:                               text1.Text += Encoding.UTF8.GetString(response.ToArray().Skip(14).ToArray)
  14:                          End If
  15:                          If i > 1 Then
  16:                                text1.Text += Encoding.UTF8.GetString(response)
  17:                           End If
  18:                                                                End Sub)
  19:              Next

Das CardAddedEvent läuft nicht im Kontext des UI Threads, deswegen Dispatching von Nöten ist. Der DispatcherHelper kommt aus dem Nuget Paket UWPCommunityToolkit.

Kommentare sind geschlossen