AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Smartcard auslesen, Kommandos senden
Thema durchsuchen
Ansicht
Themen-Optionen

Smartcard auslesen, Kommandos senden

Ein Thema von newuser01 · begonnen am 8. Nov 2011 · letzter Beitrag vom 9. Nov 2011
Antwort Antwort
newuser01

Registriert seit: 30. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#1

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 17:17
hmmm ok dann mach ich das mit Abfragen, nicht so schlimm
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 18:51
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 30. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#3

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 18:56
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;

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);
Gruß: Holger

[Hobby-Programmierer]

Geändert von newuser01 ( 8. Nov 2011 um 19:04 Uhr)
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 30. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#4

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 19:44
Noch eine Frage

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:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:String;
begin
ComPort.ReadStr(sEmpfangen, Count);
e_anwer.Text := sEmpfangen;
end;
aber es kommt nur Mist bei raus


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:

ComPort.WriteStr(char(01)+char(02)+char(01)+char(00)+char(00)+char(00)+char(3D));
meckert er "Bezeichner D gefunden"
Gruß: Holger

[Hobby-Programmierer]

Geändert von newuser01 ( 8. Nov 2011 um 20:42 Uhr)
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 21:23
Hallo newuser01,
schaul dir mal den Source im BrainTool an.

Macht das was Du brauchst.

Gruß
totti14
Angehängte Dateien
Dateityp: zip BrainTool-source.zip (67,0 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 30. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#6

AW: Smartcard auslesen, Kommandos senden

  Alt 9. Nov 2011, 07:44
Hallo newuser01,
schaul dir mal den Source im BrainTool an.

Macht das was Du brauchst.

Gruß
totti14

@totti14 Danke, für den Source
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 21:30
Delphi-Quellcode:
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);
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

Delphi-Quellcode:
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;
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 ...
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Smartcard auslesen, Kommandos senden

  Alt 8. Nov 2011, 22:57
SmartCard ... SmartCardLeser ... gibt es da nicht eine API?

CT-API = Card Terminal API (neueste Version von 2001)
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 30. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#9

AW: Smartcard auslesen, Kommandos senden

  Alt 9. Nov 2011, 08:20
Delphi-Quellcode:
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);
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

Delphi-Quellcode:
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;
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 ...
BZW: was soll da rauskommen, wenn Du wieder HexCodes erwartest musst Du diese aus den Bytes extrahieren.
]

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:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:AnsiString;
begin
ComPort.ReadStr(sEmpfangen,Count);
e_answer.Text := StrToHex(sEmpfangen);
end;
Als Antwort kommt aber wieder das selber zurück, was ich gesendet habe.

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;
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: Smartcard auslesen, Kommandos senden

  Alt 9. Nov 2011, 08:28
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 ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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