![]() |
Smartcard auslesen, Kommandos senden
Hallo,
ich möchte ein kleines Tool schreiben, um eine Smartcard auszulesen. Es solln also einfach nur Kommandos zur Karte gesendet werden und dann wird das "Answer" der Karte ausgewertet. Die Kommandos hab ich und wie ich die Antworten der Karte auswerte weis ich auch. Mir fehlen aber infos wie ich das in Delphi realisieren könnte. Vielleicht gibt es ja Free Komponenten die auf den (Comport, Cardreader) zugreifen, sich also verbinden können und dann sowas wie SerialPort1.Write(kommando) oder der gleichen machen. Ich will also nicht direkt auf die Karte schreiben sondern nur Kommandos senden und das Answer anzeigen lassen, mehr nicht. Vielleicht könnt Ihr ja weiterhelfen. |
AW: Smartcard auslesen, Kommandos senden
|
AW: Smartcard auslesen, Kommandos senden
|
AW: Smartcard auslesen, Kommandos senden
Ok thx, also ich versuch mich dann mal an die Kompo "TComPort" und stoß schon auf das erste Problem :-D Naja bin halt Hobby Programmierer und lang lang ist her, wo ich mal was gemacht habe :-D
Also die Eigenschaften von ComPort bei BaudRate im Objektinpektor sind mit (br9600, br115200) usw. angegeben. Wenn ich jetzt also versuche mit:
Code:
zu übergeben, kommt die Meldung "Inkompatible Typen: TBaudRate und TCaption"
ComPort.BaudRate := 'br'+combo_baudrate.Text;
Kann ich da irgendwie Konvertieren? Auch wenn ich direkt die BaudRate setzen will mit:
Code:
kommt die Meldung, "Undefinierter Bezeichner br9600"
ComPort.BaudRate := br9600;
|
AW: Smartcard auslesen, Kommandos senden
Es ist zwar eine blöde Frage, aber die Unit CPort ist eingebunden? Eigentlich muss sie das ja sein, sonst könntest Du auf TComPort ja auch nicht zugreifen.
|
AW: Smartcard auslesen, Kommandos senden
Ich habe gerade herrausgefunden das man mit
Code:
einen Setup Dialog aufruft, wo alle Einstellungen gesetzt werden können, nur möchte ich das so nicht sondern selbst eine Settings Form machen wo ich dann die Settings in einer Ini speicher. Das hab ich ja schon alles fertig und die Werte werden ja dann zb. aus der INI wie oben zu sehen in "combo_baudrate" geladen, müssen halt nur noch übergeben werden. Aber scheinbar kann man nur über diesen "ShowSetupDialog" Einstellungen tätigen.
ComPort.ShowSetupDialog
|
AW: Smartcard auslesen, Kommandos senden
Alles was du im Objektinspektor setzen kannst, kannst du auch im Code setzen
|
AW: Smartcard auslesen, Kommandos senden
Das kann aber nicht sein.
Zitat:
|
AW: Smartcard auslesen, Kommandos senden
Code:
kann ich setzen aber die anderen Sachen nicht oder ich mach fehler dabei
ComPort.Port := 'COM1';
|
AW: Smartcard auslesen, Kommandos senden
Anscheinend Letzteres, bei mir klappt das (getestet unter Delphi 7 Pro) ohne Probleme.
[edit] Hier meine komplette Unit (ich habe die Komponente nicht installiert, sondern erzeuge sie dynamisch):
Delphi-Quellcode:
Ich bekomme lediglich eine Warnung, dass Win32Check plattformspezifisch ist, ansonsten lässt sich das Programm ohne Weiteres starten. [/edit]
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, CPort; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FComPort: TComPort; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FComPort := TComPort.Create(self); FComPort.BaudRate := br9600; FComPort.Port := 'COM1'; end; end. |
AW: Smartcard auslesen, Kommandos senden
wie setz ich denn die BaudRate richtig?
|
AW: Smartcard auslesen, Kommandos senden
Schau noch einmal mein letztes Edit an. Ich weiß nicht, was Du anders machst, dass es bei Dir nicht gehen will.
|
AW: Smartcard auslesen, Kommandos senden
Ok hattest Recht, ich hab den Wald lauter Bäume nicht gesehen lol
CPort unter uses vergessen einzubinden, ich TROTTEL |
AW: Smartcard auslesen, Kommandos senden
Aber kann man nun sowas wie:
Zitat:
|
AW: Smartcard auslesen, Kommandos senden
Nicht ohne Weiteres, Du müsstest Dir schon eine Funktion dazu schreiben.
|
AW: Smartcard auslesen, Kommandos senden
hmmm ok dann mach ich das mit Abfragen, nicht so schlimm
|
AW: Smartcard auslesen, Kommandos senden
ist doch alles in CPort drin
Delphi-Quellcode:
function StrToBaudRate(Str: string): TBaudRate;
function StrToStopBits(Str: string): TStopBits; function StrToDataBits(Str: string): TDataBits; function StrToParity(Str: string): TParityBits; function StrToFlowControl(Str: string): TFlowControl; function BaudRateToStr(BaudRate: TBaudRate): string; function BaudRateToInt(BaudRate: TBaudRate): Integer; function StopBitsToStr(StopBits: TStopBits): string; function DataBitsToStr(DataBits: TDataBits): string; function ParityToStr(Parity: TParityBits): string; function FlowControlToStr(FlowControl: TFlowControl): string; |
AW: Smartcard auslesen, Kommandos senden
Zitat:
ok danke muss ich das dann mit dem zusatz "br" machen oder ohne also:
Code:
so?:
sBaudrate := 9600; ComPort.BaudRate := StrToBaudRate('br'+sBaudrate); oder so?:
Code:
sBaudrate := 9600;
ComPort.BaudRate := StrToBaudRate(sBaudrate); |
AW: Smartcard auslesen, Kommandos senden
Noch eine Frage :-D
Wenn ich zb. einen Hexwert zur Karte senden will, wie mach ich das Hexwert: 01 02 01 00 00 00 3D Ich verusch es derzeit so:
Code:
ComPort.WriteStr('01 02 01 00 00 00 3D'); Und fürs Answer der Karte hab ich bei "RxChar" folgendes drin:
Code:
aber es kommt nur Mist bei raus :-D
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var sEmpfangen:String; begin ComPort.ReadStr(sEmpfangen, Count); e_anwer.Text := sEmpfangen; end; sowas: Âü~>ÂüÂüÂü Mach ich es so:
Code:
Function StrToHex(s: String): String; Var i: Integer; Begin Result:=''; If Length(s)>0 Then For i:=1 To Length(s) Do Result:=Result+IntToHex(Ord(s[i]),2); End; procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer); var sEmpfangen:String; begin ComPort.ReadStr(sEmpfangen, Count); e_anwer.Text := StrToHex(sEmpfangen); end;
Code:
meckert er "Bezeichner D gefunden"ComPort.WriteStr(char(01)+char(02)+char(01)+char(00)+char(00)+char(00)+char(3D)); |
AW: Smartcard auslesen, Kommandos senden
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo newuser01,
schaul dir mal den Source im BrainTool an. Macht das was Du brauchst. Gruß totti14 |
AW: Smartcard auslesen, Kommandos senden
Delphi-Quellcode:
Beim Lesen solltest Du immer im Hinterkopf haben dass die Daten in Portionen kommen können bis sie komplett sind, also Puffern und den Puffer auswerten
ComPort.WriteStr(char($01)+char($02)+char($01)+char($00)+char(00)+char($00)+char($3D));
// oder wenn es eh fix ist ComPort.WriteStr(#01#02#01#00#00#00#$3D);
Delphi-Quellcode:
Das was bei Dir ankommt sollte wenn Du wirklich Delphi7 verwendest, also kein Unicodeproblem haben kannst, an falschen Einstellungen für Baudrate, Stopbit, Parity oder ähnlichem liegen ...
procedure TwasAuchImmer.Comport1RxChar(Sender: TObject; Count: Integer);
var s:AnsiString; begin BaseSerial1.ReadStr(s,Count); FInBuffer := FInBuffer + s; // FPuffer ist hier eine Klassenvariable InterpretInbuffer; // Eine Prozedur die den Puffer auswertet, komplette Nachrichten extrahiert, aus dem Puffer entfernt und verarbeitet end; BZW: was soll da rauskommen, wenn Du wieder HexCodes erwartest musst Du diese aus den Bytes extrahieren.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Const Test='Âü~>ÂüÂüÂü'; var s:AnsiString; HexOut:String; i:Integer; begin s := Test; for I := 1 to Length(test) do HexOut := HexOut +'$' +IntToHex(Byte(s[i]),2); Showmessage(HexOut); end; |
AW: Smartcard auslesen, Kommandos senden
SmartCard ... SmartCardLeser ... gibt es da nicht eine API?
![]() Und Microsoft hat da auch eine SmartCard API Bevor ich da mit den ComPorts kämpfen würde, würde ich eher diese APIs bemühen. |
AW: Smartcard auslesen, Kommandos senden
Zitat:
@totti14 Danke, für den Source |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Also ich versuch gerade den festen Wert zu senden, so wie du es beschrieben hast:
Delphi-Quellcode:
procedure Tfrm_main.btn_readcardClick(Sender: TObject);
begin ComPort.WriteStr(#01#02#01#00#00#00#$3D); end;
Delphi-Quellcode:
Als Antwort kommt aber wieder das selber zurück, was ich gesendet habe.
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var sEmpfangen:AnsiString; begin ComPort.ReadStr(sEmpfangen,Count); e_answer.Text := StrToHex(sEmpfangen); end; 0102010000003D Die Karte läuft ja mit 6 MHz Kann es sein, das die Mhz noch irgendwo in "ComPort.???" eingestellt werden müssen? oder reicht es wenn ich bei meinem Cas3 auf "POENIX 6.00 MHz" eingestellt habe ? Oder ich hab die ganze Sache mit dem Answer noch nicht verstanden. Wie würde denn zb. ein Reset aussehen um den ATR in "e_answer.Text" zu bekommen? Aus den Sourcen vom TBrain Tool werd ich nicht ganz schlau, sind aber sicher auf die Komponente "ComPort" zu portieren oder? hier mal ein Auszug aus den Sourcen (Brain.pas) (Einstellungen MHz)
Delphi-Quellcode:
procedure TBrain.InitComPortParams(const Mode: TBrainResetModes); begin Port.Handshaking := hsCustom; Case FFrequency Of Frequency357MHz: begin Port.PortCustom.dcb.XonLim := 1024; Port.PortCustom.dcb.XoffLim := 1024; Port.PortCustom.TimeOuts.ReadIntervalTimeout := DWORD(-1); Port.PortCustom.TimeOuts.ReadTotalTimeoutMultiplier := DWORD(-1); Port.PortCustom.TimeOuts.ReadTotalTimeoutConstant := 500; Port.PortCustom.TimeOuts.WriteTotalTimeoutMultiplier := DWORD(-1); Port.PortCustom.TimeOuts.WriteTotalTimeoutConstant := 500; Port.PortCustom.InSize := 4096; Port.PortCustom.OutSize := 2048; end; Frequency6MHz: begin Port.PortCustom.dcb.XonLim := 2048; Port.PortCustom.dcb.XoffLim := 512; Port.PortCustom.TimeOuts.ReadIntervalTimeout := DWORD(-1); Port.PortCustom.TimeOuts.ReadTotalTimeoutMultiplier := 0; Port.PortCustom.TimeOuts.ReadTotalTimeoutConstant := 0; Port.PortCustom.TimeOuts.WriteTotalTimeoutMultiplier := 0; Port.PortCustom.TimeOuts.WriteTotalTimeoutConstant := 5000; Port.PortCustom.InSize := 10000; Port.PortCustom.OutSize := 10000; end; end; Und hier die Reset Funktion sowie GetCardATR
Delphi-Quellcode:
function TBrain.Reset(const Mode: TBrainResetModes): TAnswerToReset;
var reset1: TAnswerToReset; buffer1: array Of Byte; begin Try SetBasicPortParams(Mode); Port.SetState; Port.DtrEnable := true; Port.RtsEnable := false; While (Port.BytesToRead > 0) do Port.ReadByte; Port.RtsEnable := True; Port.RtsEnable := False; If (Mode = ResetModeCerebro) Then Port.WriteByte($99); // Port.BaseStream.WriteByte($99) Delay(400); If (Mode = ResetModeCerebro) Then Port.ReadByte; If (Port.BytesToRead > 0) Then begin SetLength(buffer1, Port.BytesToRead); Port.Read(buffer1[0], 0, Length(buffer1)); result := TAnswerToReset.Create(buffer1); Exit; end; reset1 := TAnswerToReset.Create; except reset1 := TAnswerToReset.Create; End; result := reset1; end; function TBrain.GetCardATR(Mode: TBrainResetModes): TAnswerToReset; begin result := nil; //Port.PortCustom.Mask := EV_RXCHAR or EV_RXFLAG or EV_CTS or EV_DSR or EV_RLSD or EV_BREAK or EV_ERR or EV_RING; If OpenComPort(Mode) then begin result := Reset(Mode); If Mode <> ResetModeCerebro then begin result.CardLang := GetIrdetoLanguage; result.CardType := GetIrdetoType; result.CardSerial := GetIrdetoSerial; result.CardHexSerial := GetIrdetoHexSerial; end; CloseComPort; end; Port.PortCustom.Mask := 0; If not Assigned(result) then result := TAnswerToReset.Create; end; |
AW: Smartcard auslesen, Kommandos senden
Du könntest ja alles direkt an der Komponente einstellen, den "NON-VCL-Overhead" brauchst Du ja nicht.
Im Moment, es kommt etwas definiertes zurück, würde ich vermuten dass Du Dir das Protokoll erarbeiten musst ... |
AW: Smartcard auslesen, Kommandos senden
Naja eingestellt ist alles richtig eingestellt so wie in der Brain.pas für diese karte auch
Brain.pas
Delphi-Quellcode:
meine Einstellungen:
ResetModeNormal, ResetModeCerebro:
begin Port.BaudRate := 9600; Port.Parity := EvenParity; Port.DataBits := 8; Port.StopBits := OneStopBit; end; end; end;
Delphi-Quellcode:
comport.Port := combo_port.Text;
ComPort.BaudRate := br9600; ComPort.DataBits := dbEight; ComPort.Parity.Bits := prEven; ComPort.StopBits := sbOneStopBit;
Delphi-Quellcode:
diese einstellungen finde ich nicht in ComPort
Frequency6MHz:
begin Port.PortCustom.dcb.XonLim := 2048; Port.PortCustom.dcb.XoffLim := 512; |
AW: Smartcard auslesen, Kommandos senden
die sind in der Komponente enthalten und werden über Buffer.Inputsize gesetzt
Delphi-Quellcode:
Smartcard ist ein derart butterweicher Begriff, da Du nicht erwarten kannst dass ein Programm das bei irgendjemandem mit irgendeiner Karte bei Dir mit einer anderen Karte etwas sinnvolles produziert.
DCB.DCBlength := SizeOf(TDCB);
DCB.XonLim := FBuffer.InputSize div 4; DCB.XoffLim := DCB.XonLim; DCB.EvtChar := TCPortChar(FEventChar); Was sollte den beim Senden des von Dir genanntes Strings von der Karte zurückkommen? |
AW: Smartcard auslesen, Kommandos senden
Zitat:
Hex Serial abfragen 01 02 01 00 00 00 <3D> Antwort der Karte 01 02 00 00 01 00 00 10 00 17 00 00 02 00 17 00 00 03 04 80 xx xx xx 1A <68> Im übrigen handelt es sich wie bei dem BrainTool um die selbe Karte die ausgelesen werden soll, eine alte S02 Karte :-D @Bummi mir würde zum Anfang das anzeigen des ATR schon mal reichen. Um zu sehen obs überhaupt richtig passt. |
AW: Smartcard auslesen, Kommandos senden
|
AW: Smartcard auslesen, Kommandos senden
Ganz ehrlich? Ich habe nicht die leiseste Ahnung. Ich hatte nur die Frage nach kostenlosen Komponenten für die serielle Schnittstelle gelesen und die ersten beiden verlinkt, die mir einfielen. Das heißt aber nicht, dass ich mich je damit beschäftigt hätte.
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
Wieso machst du nicht einfach:
Delphi-Quellcode:
var bRate: TBaudRate;
begin case combo_baudrate.ItemIndex of 0: bRate := br9600; 1: bRate := br115200; // usw. end; ComPort.BaudRate := bRate; end; |
AW: Smartcard auslesen, Kommandos senden
Gute Idee @Micha und thx für den Tipp, werd ich mal so umbasteln aber im Moment ist dies, dass kleinste Problem was ich hab ;-)
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
|
AW: Smartcard auslesen, Kommandos senden
Wenn der Braincode für Deine Karte passt wäre IMHO $99 ein Reset
#$01#$02#$00#$00#$00#$00#$3C die Seriennummernabfrage #$01#$02#$02#$00#$00#$00#$3E der Typ und das was Du versucht hast ist die Sprache |
AW: Smartcard auslesen, Kommandos senden
Zitat:
was ich versuche hast die Sprache? was meinst du hehe |
AW: Smartcard auslesen, Kommandos senden
Zitat:
|
AW: Smartcard auslesen, Kommandos senden
Ich hatte mich verguckt :oops:
Hex Serial abfragen #01#02#01#00#00#00#$3D sieht ähnlich aus wie Brainauszug
Delphi-Quellcode:
function TBrain.GetIrdetoLanguage(): String;
const buffer0: TIrdetoCommandBuffer = ( Data: ($01, $02, $02, $03, $00, $00, $3D) ); Den Code den Du versuchst habe ich nicht gefunden .... |
AW: Smartcard auslesen, Kommandos senden
Ach so.
Ich dachte die Werte wären immer Fix und an der selben Stelle. |
AW: Smartcard auslesen, Kommandos senden
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.
|
AW: Smartcard auslesen, Kommandos senden
Zitat:
@brummi könntest du mir bitte anhand der von mir verwendeten Komponente kurz und verständlich zeigen, wie ich den ATR auslese? Also meine Einstellungen sind jetzt:
Delphi-Quellcode:
Das dürfte also passen für die Karte. Die Antwort der Karte soll dazu einfach mal in ein answer.text Feld
ComPort.BaudRate := br9600;
ComPort.DataBits := dbEight; ComPort.Parity.Bits := prEven; ComPort.StopBits := sbOneStopBit; WriteByte($99) gibt es ja nicht, ich hab ja nur ComPort.WriteStr und was genau in ComPortRxChar rein muss, weis ich auch nicht
Delphi-Quellcode:
oder muss es gar in ComPortRxBuf ?
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var sEmpfangen:AnsiString; begin ComPort.ReadStr(sEmpfangen,Count); answer.Text := StrToHex(sEmpfangen); end; Das ganze bringt mir nichts, wenn ich nicht von Anfang an Schritt für Schritt aufbaue, Code kopieren ist einfach aber verstehen will ich Ihn auch. Und die genauen Abläufe ebenso. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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