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.

    C# ist nicht C, C ist nicht mal ObjectOrientiert.

    Wie ist dein VB-Projekt eingestellt? NetFramework 4.8, Net6, Net7? Möglicherweise macht das neue NET 7 probleme oder eine Kombo von 6 und 7. Stell mal beide auf NET6 oder beide auf NET7. Beide auf NET6 und das sollte auf jeden Fall funktionieren. Ich bin noch bei Net 6, von daher keine Ahnung ob es mit NET7 Probleme gibt.

    Du kannst aber auch hier die 3 Klassen übersetzen lassen und direkt in einem VB-Projekt verwenden.
    https://icsharpcode.github.io/CodeConverter/




    Edit @Kaypetri
    Wurde die DLL möglicherweise nicht in den Ausgabeordner kopiert? Dann mach das von Hand.
    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“ ()

    Ja, daran lag es wohl. Ich hatte mein ursprüngliches Projekt auf Windows Forms .net Framework gemacht und nicht auf .NET
    Im .net Framework ist bei 4.8 Schluss.

    Aber im neuen Projekt geht es wohl zunächst mal. Ich mache aber morgen weiter weil ich natürlich nun erstmal sehen muss wie sich die anderen Dinge da jetzt hinzufügen lassen Datasets usw.
    Aber Mega Danke für die Hilfe bis hier her. Heute früh hätte ich das noch nicht so gesehen.

    Gruß
    Du kannst auch beides mit FW 4.8 verwenden, weil du den Thread mit NET6 getagt hast, dachte ich du verwendest es auch, beim nächsten mal das richtige wählen. Einer der Gründe warum ich zu WPF umgestiegen bin ist, das unter .NET(nicht FrameWork) das mit dem DataBinding anders ist. Ich war richtig erschrocken als ich das zum ersten mal gesehen hab(Siehe Anhang). Das sieht man im Daten-Quellen-Fenster. Ist nicht mehr mit aus dem DatenQuellen-Fenster auf's Form ziehen ;(

    Da dachte ich mir, wenn ich mich jetzt eh schon umstellen muss, dann kann ich auch gleich auf WPF umsteigen. War eine gute Idee, auch wenn es ein wenig knobelig war.
    Bilder
    • Unbenannt.png

      10,55 kB, 339×373, 49 mal angesehen
    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“ ()

    Ja, das habe ich im Thread erstellen tatsächlich falsch angegeben. Ich habe es aber jetzt zunächst doch nochmal auf FW4.8 erstellt die dll. Verbindung klappt zumindest schon mal. Ich habe noch Probleme die Befehle dann auszuführen wie NFC.ReadBlock()
    Da ist der Rückgabewert ja Byte und kein String. So recht kapiert habe ich es aktuell noch nicht wie ich dann jetzt was schreibe und auslese. Aber ich bin mit Deiner Hilfe schon ein großes Stück weiter.
    Schau mal hier im Forum nach Bytes to String, und/oder auch String to Bytes.

    Wenn du dann was mit System.Text.Encoding.<ENCODING HIER>.GetString(.....) und auch System.Text.Encoding.<ENCODING HIER>.GetBytes(.....) findest, dann bis du vermutlich auf der Zielgeraden.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Also ich kann mich verbinden, die Liste ausgeben und die KartenUID lesen. Bei schreiben und lesen bekomme ich allerdings -202 als Fehlercode zurück. Es werden also auch garkeine Daten zurück geliefert. Der ret code müsste ja "0" sein.
    Acha. Laut der Bibliothek wird eigentlich dort schon in String gewandelt. So verstehe ich das zumindest.

    VB.NET-Quellcode

    1. If AuthBlock(Block) Then
    2. ClearBuffers()
    3. SendBuff(0) = &HFF
    4. SendBuff(1) = &HB0
    5. SendBuff(2) = &H0
    6. SendBuff(3) = CByte(Integer.Parse(Block))
    7. SendBuff(4) = CByte(Integer.Parse("16"))
    8. SendLen = 5
    9. RecvLen = SendBuff(4) + 2
    10. retCode = SendAPDUandDisplay(2) '#############Hier wird der return abgefragt
    11. If retCode = -200 Then
    12. Return New Byte() {}
    13. End If
    14. If retCode = -202 Then
    15. Return New Byte() {}
    16. End If


    VB.NET-Quellcode

    1. Private Function SendAPDUandDisplay(ByVal reqType As Integer) As Integer
    2. Dim indx As Integer
    3. Dim tmpStr As String = ""
    4. pioSendRequest.dwProtocol = Protocol
    5. pioSendRequest.cbPciLength = 8
    6. For indx = 0 To SendLen - 1
    7. tmpStr = tmpStr & " " & String.Format("{0:X2}", SendBuff(indx))
    8. Next
    9. retCode = Card.SCardTransmit(hCard, pioSendRequest, SendBuff(0), SendLen, pioSendRequest, RecvBuff(0), RecvLen) '###########Das läuft offenbar schief
    10. If retCode <> Card.SCARD_S_SUCCESS Then
    11. Return retCode
    12. Else
    13. Try
    14. tmpStr = ""
    15. Select Case reqType
    16. Case 0
    17. For indx = (RecvLen - 2) To (RecvLen - 1)
    18. tmpStr = tmpStr & " " & String.Format("{0:X2}", RecvBuff(indx))
    19. Next
    20. If (tmpStr).Trim() <> "90 00" Then
    21. Return -202 '###### ??????? Warum
    22. End If


    Der Fehler weist wohl auf folgenden Fehler:

    C#-Quellcode

    1. if ((tmpStr).Trim() != "90 00")
    2. { //MessageBox.Show("Return bytes are not acceptable.");
    3. return -202; }

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Kaypetri“ ()

    So, ich habe das Problem nun soweit eingrenzen können das es wohl an der Authentifizierung schon hängen bleibt. Es wird ja vor jedem Read und Write eine Auth-Abfrage gemacht. Ich vermute hier irgendwie dass die SendBuff Deklarationen für den ACR1252U Reader falsch sind oder es eine andere Methode benötigt. Soweit ich das jetzt verstanden habe ist das von Reader zu Reader unterschiedlich.
    Das Problem ist tatsächlich gelöst !!!
    Ich habe mit der DLL aus diesem Packet: nuget.org/packages/NFC-ACR122U/
    sowie den zugehörigen Code für VB: RFID Reader Acr122u, Problem beim Umschreiben.
    das Thema lösen können. Das war im Grunde das einfache was ich gesucht habe. Hat nur sehr lange gedauert um dahinter zu kommen. Aber ich habe viel gelernt.
    Es spielt bei ACR scheinbar keine Rolle ob es sich um den ACR122U oder ACR1252U handelt, es geht mit beiden.
    Aktuell löst das System immer dann aus wenn man eine Karte auflegt. ganz cool wäre noch wenn ich das per Button auslösen könnte, aber da komme ich mit den AddHandlern noch nicht so recht klar.
    Aber bis hier hin schon mal riesen Dank an die Community und die fleißigen Hinweisgeber.

    Also du willst nicht automatisch beim einlegen schreiben/lesen, dann mach das auch nicht in den Event-Subs
    So könnte man das machen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. '..... acr122u = new .....
    3. Private Sub Button1_Clicked(sender As Object, e As EventArgs) Handles Button1.Click
    4. 'senden
    5. End Sub
    6. Private Sub Acr122u_CardInserted(ByVal reader As PCSC.ICardReader)
    7. Button1.Enabled = True
    8. End Sub
    9. Private Sub Acr122u_CardRemoved()
    10. Button1.Enabled = False
    11. End Sub
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. acr122u.Init(False, 50, 4, 4, 200)
    14. AddHandler acr122u.CardInserted, AddressOf Acr122u_CardInserted
    15. AddHandler acr122u.CardRemoved, AddressOf Acr122u_CardRemoved
    16. button1.enabled = false
    17. End Sub
    18. End Class

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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