CT-Api[ERLEDIGT]

  • Allgemein

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von milaim.

    CT-Api[ERLEDIGT]

    Hi Leute,
    ich habe da ein Problem, und zwar mit der CT-Api (Card Terminal Application Programmin Interface)...

    Mein Problem: Ich versuche, aus einer KVK (Krankenversicherungskarte) die Daten über ein Kartenterminal auszulesen...
    Es gibt zwar eine Doku, die einige Befehle beschreibt, wie Reset CT oder Request ICC aber das hilft mir nicht wirklich weiter, denn ich bekomme die Daten nicht ausgelesen.

    Es gibt auch einige Beispiele im Internet, die das beschreiben, die funktionieren aber nicht, denn diese Beispiele sind meist zu alt und mit dem neuen Kartenterminal (ST-2052) von Cherry will das nicht hinhauen...

    Meine Frage: Hat schon jemand erfahrungen damit, wie man ein "Get File" oder "Get Data" Befehl über die CT-Api an das Kartenterminal versenden kann??
    Ich wär über jede Hilfe Dankbar, denn ich sitze schon seit Tagen an diesem Problem und bekomme einfach nicht die Lösung dafür.
    Übrigens: Ich Versuch die Verbindung in Access über VB hinzurichten.
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer

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

    Normaler weise wenn du eine DLL runter saugst muß kompletter Support dabei sein. Damit meine ich alles, beschreibung von Methoden/Eigenschaften, und vieleicht paar kleinere Beispiel Code. Wenn du damit nicht weiter kommst, würde ich an deine stelle andere DLL runter saugen, es gibs in google jede menge anbieter, und vieleicht beim anderen anbieter der support viel besser. Oder du setzt mit dem Hersteller in Verbindung und verlagnst etwas ausfürliche hilfe.
    Doku ist dabei, aber nicht ausreichend, damit ich die Daten von der Chipkarte der KVK hole. An dem Hersteller habe ich mich schon gewandt, die haben mir gesagt ich soll mich per Mail melden und die schicken mir ne neue Doku. Was rauskam ist eine Doku von 1999 -> war ein Downloadlink und nicht von denen.
    Ein Beispiel gibt es auch, ich bin schon viel weiter als das Beispiel.. Ich kann Reseten ich kann Karte verlangen ich kann auch Karte auswerfen (Prozess beenden) aber daten holen geht nicht, weil die Beispiele zu alt sind und weil die Instruktion mir als fehlerhaft angezeigt wird. Übrigens: Die dll war auf der Driverdisk dabei.
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Hey.. Hab das Problem gelöst. Ich bin Stur geblieben und habs irgendwie zusammengeschraubt.

    Da ich nach Hilfe gefragt habe, will ich es auch nicht vorenthalten.


    So sollte es ablaufen:

    VB.NET-Quellcode

    1. Dim lResult As Byte
    2. Dim ctn As Integer
    3. Dim pn As Integer
    4. Dim dad As Byte
    5. Dim sad As Byte
    6. Dim lenc As Integer
    7. Dim command() As Byte
    8. Dim lenr As Integer
    9. Dim response() As Byte
    10. Dim str As String
    11. Dim i As Long
    12. ' CT_init : Verbindung zur SmartCard wird hergestellt
    13. ReDim command(300)
    14. ReDim response(1000)
    15. ctn = 1
    16. pn = 1
    17. lResult = CT_INIT(ctn, pn)
    18. If lResult = 0 Then
    19. 'Reset ICC
    20. dad = 1
    21. sad = 2
    22. command(0) = &H20
    23. command(1) = &H11
    24. command(2) = &H0
    25. command(3) = &H0
    26. command(4) = &H0
    27. ret = CT_DATA(ctn, dad, sad, lenc, command(0), lenr, response(0))
    28. 'End Reset ICC
    29. 'Request ICC
    30. lenc = 7
    31. lenr = 255
    32. dad = 1
    33. sad = 2
    34. command(0) = &H20
    35. command(1) = &H12
    36. command(2) = &H1
    37. command(3) = &H1
    38. command(4) = &H1
    39. command(5) = &HA
    40. command(6) = &H0
    41. ret = CT_DATA(ctn, dad, sad, lenc, command(0), lenr, response(0))
    42. 'END Request ICC
    43. 'Fehlerbehandlungen werden ausgelassen.
    44. 'Get Status
    45. lenc = 5
    46. lenr = 255
    47. ReDim command(300)
    48. ReDim response(1000)
    49. lenc = 5
    50. lenr = 255
    51. dad = 1
    52. sad = 2
    53. command(0) = &H20
    54. command(1) = &H13
    55. command(2) = &H0
    56. command(3) = &H46
    57. command(4) = &H0
    58. ret = CT_DATA(ctn, dad, sad, lenc, command(0), lenr, response(0))
    59. 'END Get Status
    60. 'SELECT FILE
    61. ReDim command(300)
    62. ReDim response(1000)
    63. lenc = 11
    64. lenr = 1000
    65. dad = 0
    66. sad = 2
    67. command(0) = &H0
    68. command(1) = &HA4
    69. command(2) = &H4
    70. command(3) = &H0
    71. command(4) = &H6
    72. command(5) = &HD2
    73. command(6) = &H80
    74. command(7) = &H0
    75. command(8) = &H0
    76. command(9) = &H1
    77. command(10) = &H1
    78. ret = CT_DATA(1, dad, sad, lenc, command(0), lenr, response(0))
    79. 'END SELECT FILE
    80. 'Read Binary
    81. ReDim command(300)
    82. ReDim response(1000)
    83. lenc = 5
    84. lenr = 1000
    85. dad = 0
    86. sad = 2
    87. command(0) = &H0
    88. command(1) = &HB0
    89. command(2) = &H0
    90. command(3) = &H0
    91. command(4) = &H0
    92. ret = CT_DATA(ctn, dad, sad, lenc, command(0), lenr, response(0))
    93. 'END Read Binary
    94. 'EJECT ICC
    95. ReDim response(1000)
    96. lenc = 4
    97. lenr = 255
    98. dad = 1
    99. sad = 2
    100. command(0) = &H20
    101. command(1) = &H15
    102. command(2) = &H1
    103. command(3) = &H0
    104. ret = CT_DATA(ctn, dad, sad, lenc, command(0), lenr, response(0))
    105. 'END EJECT ICC
    106. CT_CLOSE (ctn) 'Verbindung mit der SmartCard auf jedenfall wieder beenden.


    Also:
    - Verbindung herstellen
    - Reset ICC
    - Request ICC
    - Get Status
    - SELECT FILE
    - Read Binary
    - Eject ICC
    - Verbindung trennen

    Das wär dann die Reihenfolge. Evtl könnte man bei SELECT FILE noch einige Änderungen vornehmen, jedoch hat das für mich persönlich gereicht.

    Select File und Read Binary waren die Knackpunkte an der ganzen Sache, da sie eine andere Class (command(0)) hatten und nur wenn man die Werte von sad(Source Address) und dad (Destination Address) verändert, funktioniert das ganze. Das stand eben sehr undeutlich in der Doku.

    //BTW: Nicht über den Code ärgern, ich habs nur so nach der Reihe gemacht bis es funktioniert. Natürlich siehts bei mir jetzt Objektorientierter aus ;)

    //Übrigens: Einige Ausschnitte stammen nicht von mir (Select File und Read Binary)
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Dazu sollte ich nochmal die Funktionen auflisten:

    VB.NET-Quellcode

    1. 'Cherry Kartenleser
    2. 'CTPCSC32KV.dll ist aus dem Selben Verzeichnis wie ctapi.dll, nur für KVK geeignet.
    3. Private Declare Function CT_INIT Lib "CTPCSC32KV.DLL" Alias "CT_init" (ByVal ctn As Integer, ByVal pn As Integer) As Byte
    4. Private Declare Function CT_DATA Lib "CTPCSC32KV.DLL" Alias "CT_data" (ByVal ctn As Integer, ByRef dad As Byte, ByRef sad As Byte, ByVal lenc As Integer, ByRef command As Byte, ByRef lenr As Integer, ByRef response As Byte) As Byte
    5. Private Declare Function CT_CLOSE Lib "CTPCSC32KV.DLL" Alias "CT_close" (ByVal ctn As Integer) As Byte


    Die werden ja als Referenzen übergeben und da wird beim Array nur der erste Index als "Zeiger" an die Funktion übergeben und gibt dann ein Byte-Array zurück. Zumindest hab ichs auf anhieb nicht anders in VB Access hinbekommen.
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer