![]() |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Ich regel so etwas normalerweise immer mit Arrays. Ich habe mehrere Arrays, welche ineinander greifen. Ändere ich mein erstes Array (String-Array, Inhalt von einer ComboBox z.B.), so ändert sich durch Bedingungen im Code alles bei den anderen Arrays mit. Mies erklärt, ich weiß, aber anders kann ich es nicht erklären. |
AW: Smartcard auslesen, Kommandos senden
Vielleicht sollten wir dafür einen eigenen Thread eröffnen, das hat ja mit dem eigentlichen Problem höchstens am Rande zu tun.
|
AW: Smartcard auslesen, Kommandos senden
Was passiert wenn Du
auf einem Button
Delphi-Quellcode:
hast
ComPort.WriteStr(#$99);
auf einem anderen
Delphi-Quellcode:
FInBuffer als Klassen oder auch mal als globale Variable
ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C);
Delphi-Quellcode:
Function Hexit(const s:AnsiString):String;
var i:Integer; begin Result := ''; for I := 1 to Length(s) do Result := Result +'$' +IntToHex(Byte(s[i]),2) +' '; end; procedure TwasAuchImmer.Comport1RxChar(Sender: TObject; Count: Integer); var s:AnsiString; begin BaseSerial1.ReadStr(s,Count); FInBuffer := FInBuffer + s; Memo1.Text := Hexit(FInBuffer ); end; |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Wenn ja dann steht bei
Delphi-Quellcode:
das "$99" im Memo1.Text
ComPort.WriteStr(#$99);
und bei
Delphi-Quellcode:
das "$01 $02 $00 $00 $00 $00 $3C "
ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C);
|
AW: Smartcard auslesen, Kommandos senden
Bevor wir hier weiter machen, hab ich mal die andere Komponente ASYNC PRO (API) mir angeschaut, da gibt es Sachen wie
ApdComPort1 kann man über die Eigenschaften verbinden mit ApdTapiDevice1 ApdTapiStatus1 kann man verbinden mit ApdTapiDevice1 ApdTapiLog1 kann man verbinden mit ApdTapiStatus1 und so weiter.......... senden kann man dann zb. so
Delphi-Quellcode:
Ist es mit diesen API Komponenten vielleicht einfacher ? die ganze Sache zu realisieren? Ich hab nur noch nicht rausgefunden was ich noch fürs Answer brauch
ApdComPort1.ComNumber := 2;
ApdComPort1.Baud := 9600; ApdComPort1.Parity := pNone; ApdComPort1.DataBits := 8; ApdComPort1.StopBits := 2; ApdComPort1.Open := true; ApdComPort1.Output := 'Inhalt was man senden will'; Doku dazu hab ich hier ![]() |
AW: Smartcard auslesen, Kommandos senden
welcher Leser (COM oder USB) und welcher Karten Type (Synchron oder Ascychron)
am Besten via PC/SC - Windows Funktionen mit der Karte reden |
AW: Smartcard auslesen, Kommandos senden
Zitat:
|
AW: Smartcard auslesen, Kommandos senden
alte Telfonwertkarten und COM Port mag noch OK sein, bei den Controller Karten (Geldkarte, SIM, Ausweis, ....) exterm viel Arbeit die Protokolle(T=1, T=0, ....) zu implementieren
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
Reader ist ein Cas3, angeschlossen (Strom USB) + Serielles Kabel an Com1. Über "Cas Interface Studio" kann ich dann auf PHOENIX Modus 6 MHz einstellen, was ich ja bei der Karte auch brauch. (Synchron oder Ascychron) kann ich nicht beantworten, ist ne alte S02 Karte ATR: 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 03 84 55 FF 80 6D [;.!.IRDETO ACS..U..m] |
AW: Smartcard auslesen, Kommandos senden
@Bummi
mit:
Delphi-Quellcode:
procedure Tfrm_main.btn_readcardClick(Sender: TObject);
begin ComPort.Port := 'COM2'; ComPort.BaudRate := br9600; ComPort.DataBits := dbEight; ComPort.Parity.Bits := prEven; ComPort.StopBits := sbOneStopBit; //Kartenreset ComPort.FlowControl.ControlRTS := rtsEnable; ComPort.FlowControl.ControlRTS := rtsDisable; ComPort.FlowControl.ControlDTR := dtrEnable; ComPort.FlowControl.ControlDTR := dtrDisable; end; und dem:
Delphi-Quellcode:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var s:AnsiString; begin ComPort.ReadStr(s,Count); FInBuffer := FInBuffer + sEmpfangen; e_atr.Text := Hexit(FInBuffer); end; bekomm ich schon mal den richtigen ATR: $3B $9F $21 $0E $49 $52 $44 $45 $54 $4F $20 $41 $43 $53 $03 $84 $55 $FF $80 $6D Allerdings stören mich noch die $ Zeichen in der Ausgabe :-D |
AW: Smartcard auslesen, Kommandos senden
Dann bau sie aus ...
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
Und zwei mal hinternander erst atr und dann serial übergeben geht nicht in ComPortRxChar. Wie kann ich das realisieren? Kann ich nicht ComPort.ReadStr im Button verwenden und erst das eine zb. ATR dann das andere zb. Serial ausgeben? usw.
Delphi-Quellcode:
ComPort.ReadStr(s,Count); FInBuffer := FInBuffer + s; // globale variable e_atr.Text := Hexit(FInBuffer); ComPort.ReadStr(s,Count); FInBuffer := FInBuffer + s; // globale variable e_serial.Text := Hexit(FInBuffer); |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Delphi-Quellcode:
in #21 hatte ich geschrieben
Function Hexit(const s:AnsiString):String;
var i:Integer; begin Result := ''; for I := 1 to Length(s) do Result := Result +'$' +IntToHex(Byte(s[i]),2) +' '; end; Zitat:
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
InterpretInbuffer meinst du so?
Delphi-Quellcode:
und dann so
procedure Tfrm_main.InterpretInbuffer;
var i:Integer; part:AnsiString; begin i := Pos(#10,FInBuffer); Memo1.Lines.Add(FInBuffer); while i>0 do begin Part := Copy(FInBuffer,1,i-1); FInBuffer := Copy(FInBuffer,i+1,Length(FInBuffer)); Memo2.Lines.Add(Part); i := Pos(#10,FInBuffer); end; end;
Delphi-Quellcode:
Wird aber dann in im Memo1 blos das:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var s:AnsiString; begin ComPort.ReadStr(s,Count); FInBuffer := FInBuffer + s; // globale variable InterPretInbuffer; end;
Delphi-Quellcode:
angezeigt. Kannst du das ein bischen erklären mit den InterPretInbuffer ?
;Ÿ!IRDETO ACS
;Ÿ!IRDETO ACS„Uÿ€m Nachtrag: Hexausgabe hab ich berichtigt, wenns so korrekt ist ;-)
Delphi-Quellcode:
procedure Tfrm_main.InterpretInbuffer;
var i:Integer; part:AnsiString; begin i := Pos(#10,Hexit(FInBuffer)); Memo1.Lines.Add(Hexit(FInBuffer)); while i>0 do begin Part := Copy(Hexit(FInBuffer),1,i-1); FInBuffer := Copy(Hexit(FInBuffer),i+1,Length(Hexit(FInBuffer))); Memo1.Lines.Add(Part); i := Pos(#10,Hexit(FInBuffer)); end; end; |
AW: Smartcard auslesen, Kommandos senden
jetzt wird im Memo1 der ATR so ausgegeben
3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 03 84 55 FF 80 6D Ich bekomm noch graue Haare. Und wenn ich noch ein ComPort.WriteStr nach dem Kartenreset hinzugüge dann würfelt der mir alles durcheinander :( |
AW: Smartcard auslesen, Kommandos senden
ich hab jetzt mal ein ein sleep benutzt
Delphi-Quellcode:
jetzt wird der ATR in Memo1 in der ersten zeile Memo.Lines.strings[0]angezeigt. Das Sleep bewirkt bestimmt sowas wie ein Delay damit die Karte genug Zeit hat zum antworten denn ComPortRxCharist ja nehme ich zumindest mal an, ständigg auf die Lauer ob was rein kommt. Und wenns zu schnell kommt, kommen die nächsten Daten zack in die nächste zeile oder? liege ich da falsch?
//Kartenreset
ComPort.FlowControl.ControlRTS := rtsEnable; ComPort.FlowControl.ControlRTS := rtsDisable; ComPort.FlowControl.ControlDTR := dtrEnable; ComPort.FlowControl.ControlDTR := dtrDisable; sleep(500); |
AW: Smartcard auslesen, Kommandos senden
Liste der Anhänge anzeigen (Anzahl: 1)
Hi newuser01,
was hast Du vor :? Soll das so aussehen wir bei mir :) |
AW: Smartcard auslesen, Kommandos senden
Zitat:
ja genau, du weist schon was ich will :-D auslesen und CMDs senden |
AW: Smartcard auslesen, Kommandos senden
Bei ComPort.WriteStr sieht egal ob ich sleep eintrage oder nicht die Ausgabe immer so auch in Memo1 = 4 Zeilen
Delphi-Quellcode:
Memo1 Ausgabe
procedure Tfrm_main.btn_readcardClick(Sender: TObject);
begin ComPort.Port := 'COM2'; ComPort.BaudRate := br9600; ComPort.DataBits := dbEight; ComPort.Parity.Bits := prEven; ComPort.StopBits := sbOneStopBit; sleep(500); ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C); 01 02 00 00 00 00 3C 01 02 00 00 00 00 3C 01 02 00 00 00 00 00 14 30 32 36 37 32 32 01 02 00 00 00 00 3C 01 02 00 00 00 00 00 14 30 32 36 37 32 32 32 34 31 35 00 00 00 00 00 00 00 00 00 00 01 02 00 00 00 00 3C 01 02 00 00 00 00 00 14 30 32 36 37 32 32 32 34 31 35 00 00 00 00 00 00 00 00 00 00 29 |
AW: Smartcard auslesen, Kommandos senden
welche Komponente benutzt du @totti ?
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
Ist aber egal welche Kompo die laufen alle recht gut. |
AW: Smartcard auslesen, Kommandos senden
CPort benutze ich auch, vielleicht kannst du mir ja weiterhelfen. Wie machste denn das, also erst ATR abfragen dann Serial dann HexSerial usw. Es muss doch eine bestimmte Reihenfolge oder Ablauf stattfinden oder? Und das mit den Answer klappt ja auch noch nicht so recht, siehste ja in meinen Postings. Punkte Smartcard Programmierung hab ich NULL Erfahrung.
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
CMD's senden ganz einfach :)
Delphi-Quellcode:
Nachdem die Karte im richtigen Modus läuftconst sc_GetHEXSerial: Array [0 .. 4] Of byte = ($02, $01, $00, $00, $00); //------------------------------------------------------------------------ Function ICC_Async_CardWrite(Var reader: treader; command: Pbyte; command_len: Word; rsp: Pbyte; Var lr: Word): Boolean; Const resync: Array [0 .. 3] Of byte = ($21, $C0, $00, $E1); Var try1: Integer; a: byte; Begin a := command[0]; lr := 0; // will be returned in case of error Case (reader.protocol_type) Of ATR_PROTOCOL_TYPE_T0: Protocol_T0_Command(reader, command, command_len, rsp, lr); ATR_PROTOCOL_TYPE_T1: Begin try1 := 1; While (try1 <= 3) Do Begin If Protocol_T1_Command(reader, command, command_len, rsp, lr) = OK Then break; Inc(try1); // try to resync Protocol_T1_Command(reader, @resync, sizeof(resync), rsp, lr); reader.ifsc := DEFAULT_IFSC; End; End; ATR_PROTOCOL_TYPE_T14: Protocol_T14_ExchangeTPDU(reader, command, command_len, rsp, lr); Else Log.cs_log('Error, unknown protocol type %i', [reader.protocol_type]); Result := false; exit; End; If debug Then Begin Dump.cs_dump(rsp, lr, 'answer from cardreader %s:', [reader.alabel]); End; Result := True; End; //------------------------------------------------------------------------- Function reader_cmd2icc(Var reader: tReader; buf: PByte; l: Word; cta_res: PByte; Var cta_lr: Word): Boolean; Var rc: Boolean; Begin If debug Then Begin Dump.cs_dump(buf, l,'write to cardreader %s:', [reader.alabel]); End; rc := ICC_Async_CardWrite(reader, buf, l, cta_res, cta_lr); end; ------------------------------------------------------------------------------ // * Ascii/Hex-Serial reader_cmd2icc(reader, @sc_GetASCIISerial, SizeOf(sc_GetASCIISerial), @cta_res, cta_lr); |
AW: Smartcard auslesen, Kommandos senden
Liste der Anhänge anzeigen (Anzahl: 1)
@totti
was bedeutet ATR_PROTOCOL_TYPE_T1: und ATR_PROTOCOL_TYPE_T14: und was ist das Dump.cs_dump @totti hab mein Projekt mal mit angehangen, vielleicht hast ja Lust mir unter die Arme zu greifen. |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Dump ist nur ein LoggerThread der mir was ins Memo schreibt. Besser Du schreibst mir mal ne PM mit Deiner MailAddr dann schicke ich Dir mein Projekt zu. Ist aber nicht einfach zu lesen da ich es teilweise von C übersetzt habe. Das kannst Du dann Step by Step mal durchgehen. T1 und T14 usw. sind die verschieden Protokolle der jeweilegn Karten. Irteto, Nagra .... googeln Und wenn Du dann bei SSL und BigNum Typen angekommen bist :P |
AW: Smartcard auslesen, Kommandos senden
OK, werd ich mir dann mal anschauen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz