Windows 10 NFC Proximity

Es gibt in UWP zwei relevante Wege mit einem NFC Device Reader zu sprechen, per SmartCardReader Klasse oder per ProximityDevice. In meinen ersten Versuchen mit einem USB NFC Reader musste ich per SmartCard Reader das Device ansprechen. Das ist zu einem relativ aufwändig und zum anderen kommt es wie es kommen muss. Nach einem Deploy auf mein Trekstore TN154W2 ist die Liste der gefunden Devices natürlich leer.

Bildergebnis für trekstore TN154W2

Also ein neuer Versuch mit dem Proximity Device  Klasse Ansatz. Da ich keinen passenden USB Reader habe, wird mein Lumia 650 als Remote Device per USB  in Visual Studio benutzt. Das ist sehr einfach, schnell und komfortabel zu deployen und debuggen. Wichtig ist das das Windows phone mit aktivierten Entwicklermodus betrieben wird.

image

Im VB.NET Code wird aus den Events für Karte da, Karte weg und Daten eingehend  jeweils eine Methode registriert. Nur die ankommende Message wird auscodiert und die eingehende Daten ausgelesen. NDEF ist ein spezielles Datenformat für NFC, das häufig verwendet wird um die Daten in Blöcken zu organisieren, aber eine gewisse Komplexität in Kommandos und Format aufweist.

   1:  Dim nfcDevice As ProximityDevice
   2:   
   3:  Private Sub MainPage_Loading(...
   4:          nfcDevice = ProximityDevice.GetDefault()
   5:          If nfcDevice IsNot Nothing Then
   6:              AddHandler nfcDevice.DeviceArrived, AddressOf NFCDevideArrived
   7:              AddHandler nfcDevice.DeviceDeparted, AddressOf NFCDeviceDeparted
   8:              nfcDevice.SubscribeForMessage("NDEF", AddressOf messagedReceived)
   9:          End If
  10:  End Sub

Da wir uns mit den tiefen von NFC nicht weiter beschäftigen wollen, kommt die NdefLibrary von Andreas Jakl per Nuget im Visual Studio UWP Projekt zum Einsatz. Da in diesem Beispiel nur ein bestimmter Typ von NDEF Daten kann direkt die NdeftextRecord Methode zur Umwandlung in Text verwendet werden. Da NDEF Meldungen auch Url oder App Aktivierung Links enthalten können müsste man dort auf den Typ per If verzweigen. Warum man überhaupt mit foreach Iterieren soll, könnte mit unterschiedlichen Größen der NFC Tags zusammenhängen. Bei den von mir verwendeten Ntag 213 sind 144 Bytes vorhanden, die in beim ersten Durchlauf des Foreach in der txt Variable zugewiesen werden. Da MessageReceived wohl im Background Thread statt findet, muss noch mit dem UI Thread synchronisiert werden. So wird die Textbox letztendlich gefüllt.

 

   1:  Private Function messagedReceived(sender As ProximityDevice, message As ProximityMessage) As Task
   2:     Dim rawMsg = message.Data.ToArray
   3:     Dim ndefmsg = NdefMessage.FromByteArray(rawMsg)
   4:     For Each record In ndefmsg
   5:          Dim typ = Encoding.UTF8.GetString(record.Type, 0, record.Type.Length)
   6:          Dim txt = New NdefTextRecord(record)
   7:          Dispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub()
   8:                                                                     text1.Text = txt.Text
   9:                                                                 End Sub)
  10:          Next
  11:  End Function
Kommentare sind geschlossen