SmartCard ACR1252U in vb.net ansprechen und auslesen

  • VB.NET
  • .NET 5–6

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Kaypetri.

    SmartCard ACR1252U in vb.net ansprechen und auslesen

    Hallo Leute. Nach laaanger Zeit habe ich mir mal wieder was in den Kopf gesetzt das zumindes dort zunächst einfach klang.

    Ich hatte ein Idee für unseren Verein und möchte SmartCards beschreiben und auslesen. Das beschreiben geht ja ziemlich simple über ne App am Handy z.B.:
    Ich muss die Daten aber an einem Laptop entsprechend auslesen. Dafür habe ich ein Gerät von ACS gekauft. Das Gerät wurde allerdings komplett ohne irgendwelche Software API oder sowas ausgeliefert.
    Ich habe schon herausgefunden dass es auf das normale winscard.dll von windows geht und diese Funktionen genutzt werden.

    Da ich in solchen Dingen überhaupt nicht fit bin wie ich sowas nun einbinde wollte ich hier in der Community mal nach Hilfe fragen.
    Im Grunde habe ich auf der Karte dann einfach nur ein Text in zwei Zeilen gespeichert welche ich einfach nur in einer RTB ausgeben will.

    Also
    1. Karte auf Reader
    2. Inhalt der Karte in RTB einlesen

    Wir ich Inhalt dann weiter verarbeit ist klar.
    Evtl. hat jemand schon was simples zur Verfügung und könnte mir hier helfen. Man muss das Rad ja nicht neu erfinden.
    Wäre super wenn hier jemand unterstützen könnte.

    Gruß
    Mach eine UWP-Anwendung, da steht dir die Klasse SmartCard zur Verfügung, auf Github gibt es auch Beipsiele, auch in C# das kannst du zu VB übersetzen.
    learn.microsoft.com/de-de/uwp/…martcard?view=winrt-22621
    github.com/microsoft/Windows-u…ee/main/Samples/SmartCard
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ich bin noch auf Windows 10 unterwegs. Studio gibt mir allerdings nur die Möglichkeit Win11 als Ziel zu definieren. Daher kommt hier im Projekt jetzt dann eine Fehlermeldung wenn ich die MainPage.xaml öffne:

    Visual Studio erfordert eine neuere Version von Windows, um Inhalte anzeigen zu können. Bitte führen Sie ein Update auf Windows 11 oder höher aus.
    Das werde ich nicht tun, ich noch andere Programme nutzte die damit ein Problem haben könnten.

    Simple in normalen Form Anwendungen ist das nicht Sinnvoll?
    Ich weis das man das auch mir der WindowsAPI machen kann, aber weis ich nichts drüber, hab das noch nie gebraucht.
    Als ich eben mal so durchs WWW schaute bin ich auf mehrere Projekte gestoßen das hier z.B.
    codeproject.com/Articles/16653…rt-Card-Framework-for-NET

    Aber auch auf Github war was, einfach mal Google fragen, bei Github und auch nuget suchen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ich habe mich fast den ganzen Tag gestern damit beschäftigt. Ehrlich gesagt hätte ich im Leben nicht gedacht dass das so derart komplex ist.
    Hier geht es um das erfassen von Bytes und Hex und dann wieder wandeln, sortieren usw.
    Das sind für mich alles komplett neue Dinge und erscheinen für meinen Wissensstand zu hoch.
    Ich probiere heute nochmal paar Dinge welche ich wohl schon halbwegs verstanden habe.
    Ich habe es jetzt so verstanden man muss zunächst die verfügbaren Reader listen, dann Connecten, einen transmit durchführen ( das scheint mir am komplexesten), Connect und Communication schließen.
    Die meisten Projekte die ich gefunden habe sind auf c oder c++ geschrieben. Da fällt mir das lesen dann sehr schwer um zu verstehen. Ich mache gerade einen Python Kurs und bedienen zahlreiche andere Programme. Jetzt noch C beibringen ist Zuviel des Guten. Es wird allerdings mit sichert Gründe haben warum die meisten in c gemacht sind.
    @DTF -> "Mach eine UWP-Anwendung, da steht dir die Klasse SmartCard zur Verfügung"

    Die entsprechende(n) UWP-Klasse(n), kannst Du auch in WinForms verwenden. Das Stichwort ist WinRT. Bei den UWP/WinRT-Klassen handelt es sich um ganz normale COM-Interfaces.

    @Kaypetri Voraussetzung bei Verwendung dieser WinRT COM-Interfaces ist, das Du die C++ Header-Files lesen können müsstest um das ganze nach .NET übersetzen zu können.
    Mfg -Franky-
    OK, das ist eine nützliche Information. :thumbsup:

    Jetzt habe ich mal bei direkt bei MS geschaut, geht auch ohne die COM-Interface direkt. Pur mit der API.
    learn.microsoft.com/de-de/wind…card-resource-manager-api

    Ob es einen Grund gibt, warum das viele mit C-Sprachen gemacht haben, weiß ich nicht. Ich fand jedenfalls so eine Projekte. Warum nicht einfach so ein Projekt nehmen? Du kannst auch mit C# erstellte DLLs direkt in deinem VB-Projekt verwenden. Sogar C++ Dlls kannst du mit etwas mehr Aufwand nehmen. Evtl. suchst du falsch, schau auf nach RFID oder NFC.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Das Thema ist so ein bisschen dass ich das was ich eigentlich möchten auch mit nem QR Code und einer Kamera erledigen könnte. Dort bin ich schon viel weiter, da behaupte ich mal das würde ich hinbekommen. Über SmartCard hätte ich aber evtl.mehr möglichkeiten später.

    Aktuell habe ich zumindest mal was in vb. was mir den Leser erkennt und verbindet. Dann kann ich ein Text eingeben. Dieser wird dann in Hex gewandelt. Ab da kommen die Probleme bei denen ich mich halt auch garnicht auskenne. Ich laufe hier in einen Fehler bei folgender Zeile:

    "An unhandled exception of type 'System.OverflowException' occurred in 301 Sample Demo.exe
    Additional information: Die arithmetische Operation hat einen Überlauf verursacht."

    VB.NET-Quellcode

    1. [/i] Public Function StringToHex(ByVal str As String, ByRef byteRet As Byte()) As Boolean
    2. Dim descBytes() As Byte = System.Text.Encoding.ASCII.GetBytes(str)
    3. If (descBytes.Length Mod 2) = 1 Then '########## Hier läuft er auf Return False wenn es nur 1 Zeichen ist. Z.B.: A oder 1 oder sowas. Ab Zwei zeichen läuft er da drüber.
    4. Return False
    5. End If
    6. Dim length As Integer = CInt(descBytes.Length / 2)
    7. For column As Integer = 0 To descBytes.Length - 1
    8. If descBytes(column) >= &H30 And descBytes(column) <= &H39 Then 'Zahl 0-9
    9. descBytes(column) = descBytes(column) - &H30
    10. ElseIf descBytes(column) >= &H41 And descBytes(column) <= &H5A Then 'GROß-Buchstaben A-Z
    11. descBytes(column) = descBytes(column) - &H41 + 10
    12. ElseIf descBytes(column) >= &H61 And descBytes(column) <= &H7A Then 'Kleinbuchstaben a-z
    13. descBytes(column) = descBytes(column) - &H61 + 10
    14. Else
    15. Return False
    16. End If
    17. Next
    18. Dim lastBytes(0 To length - 1) As Byte
    19. For column As Integer = 0 To length - 1
    20. lastBytes(column) = descBytes(2 * column) * 16 + descBytes(2 * column + 1) '##### Hier kommt Fehler mit Überladung.
    21. Next
    22. ReDim byteRet(0 To length - 1)
    23. Array.Copy(lastBytes, byteRet, length)
    24. Return True
    25. End Function[i]​


    Bytes und Co, da kenn ich mich halt nicht aus und kann demnach nicht erkennen woran es habert.
    Ja, beim 2. Durchlauf läuft er auf 345. Da ich von diesen Dingen schlichtweg nichts verstehe werde ich den Weg über QR Code gehen. Das ist einfach viel zu tief in der Materie als das es für mich Sinn machen würde hier weiter Zeit zu investieren. Das ist dann schon was für fitte Leute in diesem Thema.
    Ich habe mir das wohl viel zu einfach vorgestellt, weil ich nicht davon ausgegangen bin dass das einfache lesen einer Textzeile von einer Smartcard so komplex ist.
    So komplex ist das nicht. Ich sagte ja, schau nach Nuget Packeten, schau bei Github nach OpenSource DLL-Projekten welche in C# geschrieben sind(für .Net/.NetFx), erstelle die DLL und nutze die in deinem VB-Projekt. Wenn das zu viel ist, 1-2 Projekt runterzuladen und damit zu probieren, ja dann nimm QR-Codes. Ich kann leider kein Projekt empfehlen weil ich kein USB-RFID/NFC Device habe und deswegen nichts testen kann, hab mit RFID/NFC Karten nur am Mikrokontroller gearbeitet.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Kaypetri schrieb:

    (...) Bytes und Co, da kenn ich mich halt nicht aus (...)

    Sich mit „Bytes & Co.” nicht auszukennen ist wahrlich keine gute Grundlage, um so ein Stück Programm zu schreiben – ich würde sogar so weit gehen und behaupten, dass es die Grundlage überhaupt oder die Grundlage aller Grundlagen ist, das Binär- und/oder Hexadezimalsystem gehören dann einfach dazu – das eine ist mit dem anderen quasi für immer und ewig verheiratet. Beim Hantieren mit Bytes kann man sich in vb.NET manchmal mit Integern helfen, aber ich vermute mal, dass das Chaos damit noch größer werden könnte... und am Ende muss man dann trotzdem entsprechend prüfen, was auf dem Teller liegt, und casten, um wieder auf den Bereich des Bytes zurückzukommen. Gut, dass das mit dem „Byte” hier ohne Vorzeichen geht, denn es gibt tatsächlich noch das SByte – damit wäre das Chaos dann bestimmt perfekt. Sich damit so schnell wie möglich - zumindest in Grundlagen - auseinanderzuersetzen und sich das anzueignen ist essenziell, um sich an die Tastatur setzen und programmieren zu können, denn es wird einem immer wieder begegnen und einen gnadenlos verfolgen, falls man es nicht kennt. Man muss da nichts auswendig kennen, das kommt später quasi von selbst, wenn man es oft genug gebraucht hat – das hier ist einfach nur Wissen. Halbwissen ist in der Regel nie gut – egal, ob es sich dabei um Geschichte, Politik, Religion oder Programmierung handelt.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Gregor Jasinski“ ()

    DTF schrieb:

    So komplex ist das nicht. Ich sagte ja, schau nach Nuget Packeten, schau bei Github nach OpenSource DLL-Projekten welche in C# geschrieben sind(für .Net/.NetFx), erstelle die DLL und nutze die in deinem VB-Projekt. Wenn das zu viel ist, 1-2 Projekt runterzuladen und damit zu probieren, ja dann nimm QR-Codes.


    Ich habe jetzt schon einiges heruntergeladen getestet usw. An irgendeiner Stelle geht es dann zumeist nicht weiter. Offt gehen auch schon die Programme selber nicht. Es fehlen DLLs oder laufen dann selber auf Fehler. Vielleicht weil viele schon älter sind, kann ich mir aber schwer vorstellen.
    Ich kann diese Fehler aber natürlich auch nicht sinnvoll beheben wenn ich nicht verstehe warum es Probleme gibt. Siehe mit dem Überlauf oben. Ich bleibe dennoch irgendwie drann. Mal sehen wie weit ich komme, aber vorerst werde ich dann wohl auf QR gehen müssen.
    Das Projekt hier sieht sehr, sehr viel versprechend aus. Ich habe bereits erwähnt das es auch mit WindowsAPI pur geht, hier ist so ein Projekt. Lade runter, erstelle es und binde die DLL in dein Projekt ein.
    github.com/h4kbas/nfc-reader
    Anwendungsbeispiel ist auch zu sehen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Kaypetri schrieb:

    VB.NET-Quellcode

    1. Dim length As Integer = CInt(descBytes.Length / 2)
    machst Du Integer-Division:

    VB.NET-Quellcode

    1. Dim length As Integer = descBytes.Length \ 2
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort. Schau ich mir auf jeden Fall mal an. Ich habe es aber dennoch nicht sein lassen können mich weiter damit zu beschäftigen. Ich habe jetzt zumindest schonmal einen eigen Fehler gefunden den ich soweit nicht beachtet hatte. Ich habe viel am Laptop der Arbeit getestet. Dort habe ich aber heute gesehen dass hier ein altes Framework drauf ist und ich es selber gar nicht updaten darf. Da habe dann unten im Fenster ein paar codes gemeckert, sind aber dennoch gestartet. Das Problem ist zumindest schonmal behoben. Am Rechner daheim habe ich jetzt alle Test die ich so hatte mal rüber genommen. Ich konnte nun zumindest mit dem NFC TagWriter Code eine Karte beschreiben und wieder auslesen. Das ganze ist in C. Ich werde mal schauen wie ich damit nun weiter komme.
    Ich danek auf alle Fälle schon für die ganze Unterstützung. Ich höre raus ich soll weiter machen.

    Kaypetri schrieb:

    Das ganze ist in C


    Ich versteh echt nicht warum du nicht die DLL nimmst(das Projekt auf Github), naja ich habe genug gesagt bin dann erstmal raus aus dem Thema. Wenn du es dir schwerer machen willst als nötig, selbst schuld.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DTF schrieb:

    Kaypetri schrieb:

    Das ganze ist in C


    Ich versteh echt nicht warum du nicht die DLL nimmst(das Projekt auf Github), naja ich habe genug gesagt bin dann erstmal raus aus dem Thema. Wenn du es dir schwerer machen willst als nötig, selbst schuld.


    Ich bin schlichtweg noch nicht dazu gekommen. Ich schaue mir das auf jeden Fall an. Ich bin jetzt schon wieder um einiges schlauer. Bis dato war mir auch nicht so recht klar was das mit dem APDU ist. Da musste ich mich jetzt erstmal grob belesen.
    Ich habe vorhin mal jemandem mit einem USB-NFC Writer herzitiert(Nachbar), das Projekt dort sind nur klassen, hatte ich nicht drauf geachetet, erstell einfach ein C# DLL Projekt kopiere die Klassen rein, kompiliere und verweise in einem VB Projekt auf die DLL. Ich konnte damit auf das Lesegerät und Karten zugreifen. Kannst aber auch versuchen das durch einen C#-VB Converter übersetzen zu lassen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Genau so habe ich das gemacht. Ich hab in VS eine c Klassenbibliothek erstellt und dort alle Klassen rein gemacht. also Card.cs NFCReader.cs und die Helper.cs. Die habe ich dann alle in eine NFCreader.dll erstellen lassen. Diese habe ich dann in mein VB Projekt als verweis dazu geholt. Ich kann die Funktionen auch entsprechend eingeben ohne Fehler. Ich bekomme hier jetzt allerdings schon beim Aufruf von

    VB.NET-Quellcode

    1. ​Dim NFC As NFCReader = New NFCReader()
    einen Fehler:

    System.IO.FileNotFoundException: "Die Datei oder Assembly "System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden."

    Ich vermute mal ich habe da was beim erstellen der DLL falsch gemacht.