Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Smartcard auslesen, Kommandos senden (https://www.delphipraxis.net/164316-smartcard-auslesen-kommandos-senden.html)

Micha88 9. Nov 2011 14:41

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Das müssen sie bei der Vorgehensweise sein. Nur wenn man später mal was ändert (umsortiert z.B.), dann kann schnell übersehen werden, dass die Funktion entsprechend anzupassen ist. Daher mein Einwand.
Ach so, ok.

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.

DeddyH 9. Nov 2011 14:43

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.

Bummi 9. Nov 2011 14:57

AW: Smartcard auslesen, Kommandos senden
 
Was passiert wenn Du
auf einem
Button
Delphi-Quellcode:
ComPort.WriteStr(#$99);
hast

auf einem anderen
Delphi-Quellcode:
ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C);
FInBuffer als Klassen oder auch mal als globale Variable

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;

newuser01 9. Nov 2011 15:17

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135310)
Was passiert wenn Du
auf einem
Button
Delphi-Quellcode:
ComPort.WriteStr(#$99);
hast

auf einem anderen
Delphi-Quellcode:
ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C);
FInBuffer als Klassen oder auch mal als globale Variable

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;

FInBuffer: AnsiString; //so als globale variable ?

Wenn ja dann steht bei

Delphi-Quellcode:
ComPort.WriteStr(#$99);
das "$99" im Memo1.Text

und bei

Delphi-Quellcode:
ComPort.WriteStr(#$01#$02#$00#$00#$00#$00#$3C);
das "$01 $02 $00 $00 $00 $00 $3C "

newuser01 9. Nov 2011 15:21

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:
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';
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

Doku dazu hab ich hier http://tpapro.sourceforge.net/Faq.html auch gefunden

bernhard_LA 9. Nov 2011 15:32

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

mquadrat 9. Nov 2011 15:34

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von bernhard_LA (Beitrag 1135321)
welcher Leser (COM oder USB) und welcher Karten Type (Synchron oder Ascychron)

am Besten via PC/SC - Windows Funktionen mit der Karte reden

PC/SC hatte ich auf der ersten Seite schon vorgeschlagen. Scheinbar soll/muss es unbedingt über den COM-Port gehen. Warum auch immer.

bernhard_LA 9. Nov 2011 15:37

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

newuser01 9. Nov 2011 15:52

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von bernhard_LA (Beitrag 1135321)
welcher Leser (COM oder USB) und welcher Karten Type (Synchron oder Ascychron)

am Besten via PC/SC - Windows Funktionen mit der Karte reden


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]

newuser01 9. Nov 2011 18:04

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

Bummi 9. Nov 2011 18:08

AW: Smartcard auslesen, Kommandos senden
 
Dann bau sie aus ...

newuser01 9. Nov 2011 18:50

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135357)
Dann bau sie aus ...

kleiner Tipp?

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);

Bummi 9. Nov 2011 18:56

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

kleiner Tipp?
hier einfach + '$' und gegf. +' ' rausnehmen?
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;
in #21 hatte ich geschrieben

Zitat:

InterpretInbuffer; // Eine Prozedur die den Puffer auswertet, komplette Nachrichten extrahiert, aus dem Puffer entfernt und verarbeitet
so würde ich es machen ...

newuser01 9. Nov 2011 19:18

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135371)
Zitat:

kleiner Tipp?
hier einfach + '$' und gegf. +' ' rausnehmen?
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;
in #21 hatte ich geschrieben

Zitat:

InterpretInbuffer; // Eine Prozedur die den Puffer auswertet, komplette Nachrichten extrahiert, aus dem Puffer entfernt und verarbeitet
so würde ich es machen ...

das mit den '$' hat schon mal geklappt :thumb:

InterpretInbuffer meinst du so?

Delphi-Quellcode:
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;
und dann so

Delphi-Quellcode:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
s:AnsiString;
begin

ComPort.ReadStr(s,Count);
FInBuffer := FInBuffer + s; // globale variable
InterPretInbuffer;

end;
Wird aber dann in im Memo1 blos das:

Delphi-Quellcode:
;Ÿ!IRDETO ACS
;Ÿ!IRDETO ACS„Uÿ€m
angezeigt. Kannst du das ein bischen erklären mit den InterPretInbuffer ?


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;

newuser01 9. Nov 2011 19:49

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 :(

newuser01 9. Nov 2011 20:15

AW: Smartcard auslesen, Kommandos senden
 
ich hab jetzt mal ein ein sleep benutzt

Delphi-Quellcode:
//Kartenreset
ComPort.FlowControl.ControlRTS := rtsEnable;
ComPort.FlowControl.ControlRTS := rtsDisable;
ComPort.FlowControl.ControlDTR := dtrEnable;
ComPort.FlowControl.ControlDTR := dtrDisable;

sleep(500);
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?

totti14 9. Nov 2011 20:25

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 :)

newuser01 9. Nov 2011 20:28

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von totti14 (Beitrag 1135393)
Hi newuser01,
was hast Du vor :?

Soll das so aussehen wir bei mir :)


ja genau, du weist schon was ich will :-D auslesen und CMDs senden

newuser01 9. Nov 2011 20:29

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:
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);
Memo1 Ausgabe

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

newuser01 9. Nov 2011 20:32

AW: Smartcard auslesen, Kommandos senden
 
welche Komponente benutzt du @totti ?

totti14 9. Nov 2011 20:40

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von newuser01 (Beitrag 1135399)
welche Komponente benutzt du @totti ?

CPort benutze ich.
Ist aber egal welche Kompo die laufen alle recht gut.

newuser01 9. Nov 2011 20:44

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.

totti14 9. Nov 2011 20:50

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von newuser01 (Beitrag 1135395)
Zitat:

Zitat von totti14 (Beitrag 1135393)
Hi newuser01,
was hast Du vor :?

Soll das so aussehen wir bei mir :)


ja genau, du weist schon was ich will :-D auslesen und CMDs senden



CMD's senden ganz einfach :)

Delphi-Quellcode:

const
 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);
Nachdem die Karte im richtigen Modus läuft

newuser01 9. Nov 2011 21:09

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.

totti14 9. Nov 2011 21:41

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von newuser01 (Beitrag 1135414)
@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.


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

newuser01 9. Nov 2011 21:53

AW: Smartcard auslesen, Kommandos senden
 
OK, werd ich mir dann mal anschauen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 Uhr.
Seite 2 von 2     12   

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