![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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