Q&A

  • 신용카드 리더기능 구현에 관한 질문
이지체크 같이 신용카드로 긁으면 그 신용카드에 대한 정보를

받아오고 싶은데 어떻게 접근하고 구현해야할지 고수님들의 도움 부탁드립니다..



3  COMMENTS
  • Profile
    델파이 탐 크르즈 2001.11.08 19:51
    김지호 wrote:

    > 이지체크 같이 신용카드로 긁으면 그 신용카드에 대한 정보를

    > 받아오고 싶은데 어떻게 접근하고 구현해야할지 고수님들의 도움 부탁드립니다..

    >

    ==============================================================================



    안녕하세요...

    제가 알고있는 바로는

    보통의 카드리더기는 PC와 RS232통신을하며 기계끼리는 422또는 485통신을

    하는것으로 알고 있습니다...



    컴퓨터에 232통신 포트가 있으므로 여기에 물려서 리더기 값을 가지고 오는

    방법이죠...



    보통 리더기에서 받은 값은 텍스트형식으로 PC에 쌓이게 됩니다.



    통신프로그램은 리더기마다 프로토콜값이 있습니다.

    요즘나오는 것들은 롬에서 다 명령어를 사용하도록 하지만

    간혹다가다 옛날것들은 16진수로 되어있어 변환하여

    명령어를 실행해야하는 것들도 있습니다.



    예) read 명령이나 write명령들이 있죠...

    대게 리더기 들은 바코드나, 마그네틱, RF 가 있죠...

    그들의 형식은 대게 이렇습니다.



    날짜시간+평션값+카드번호+.....등 이렇게 나가죠...



    일단 신용카드리더기 기능에 대해서는 별다른것이 없구여

    기계에대한 프로토콜의 값만 알면 모든걸 구현하는데는

    별 무리 없을거라 생각 됩니다.

    제가 해본 바로는 그렇습니다.



    혹시 하시다가 더 의문사항이 생기시면 Q/A에 올리시면

    제가 한 소스라도 드리죠...

    물론 다른 리더기지만..

    도움이 될것 같군요..

    그럼 ...

    즐코하세요...

  • Profile
    김지호 2001.11.08 18:18
    답변 감사합니다.

    말씀하신 소스좀 보내주셨으면 합니다.

    제가 통신프로ㅡ램을 처음 만들어 보는것이라..^^;

  • Profile
    델파이 탐 크르즈 2001.11.08 19:36
    김지호 wrote:

    > 답변 감사합니다.

    > 말씀하신 소스좀 보내주셨으면 합니다.

    > 제가 통신프로ㅡ램을 처음 만들어 보는것이라..^^;

    ===================================================

    제가 보내드리는 소스는 그냥 참조만 하시고 리더기가

    틀리므로 거기에 맞는 프로토콜로 이용하시기 바람니다.

    또한 이것은 제가 했던 리더기에 현재 돌아가고 있는

    소스 입니다.

    만약 리더기가 같다면 상용으로 쓰시면 저작권법에 접촉이되오니

    알아서 쓰시기 바랍니다.



    저도 이것 짜면서 맨땅에 헤딩하면서 어렵게 만든것이거든요..

    제가 수고한것도 알아주셨으면 하네요.. ^^;



    그럼...잘 쓰세요...

    참..이것을 쓰실려면 통신 컴퍼넌트를 인스톨해야 합니다.

    그냥 참고만 하세요...

    방법론을 제시하는 것이니까요.. ^^;

    그리고 이건 16진수로 되어있는 것을 Char형으로 변환하여 만든 것입니다.

    보시고 욕하지 마세요...



    procedure Treadingform.FormActivate(Sender: TObject);

    var

    port,baud : string;

    begin

    path := ExtractFilePath(ParamStr(0))+'comm.ini';

    ini_file := Tinifile.create(path);

    port := ini_file.readstring('port','port','1');

    baud := ini_file.readstring('baud','baud','9600');

    ini_file.free;



    case strToint(port) of

    1 : comm1.DeviceName := 'com1';

    2 : comm1.DeviceName := 'com2';

    end;



    case strToint(baud) of

    9600 : comm1.baudrate := br9600;

    4800 : comm1.baudrate := br4800;

    2400 : comm1.baudrate := br2400;

    1200 : comm1.baudrate := br1200;

    end;



    comm1.open;

    end;



    procedure Treadingform.BitBtn2Click(Sender: TObject);

    begin

    close;

    end;



    procedure Treadingform.FormClose(Sender: TObject;

    var Action: TCloseAction);

    begin

    comm1.close;

    end;



    procedure Treadingform.BitBtn1Click(Sender: TObject);

    var mess : array [0..2] of char;

    begin

    //===통신상태확인====================//

    for j := 1 to 1 do

    begin

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($61);

    buff[3] := chr($50);

    buff[4] := chr($23);

    buff[5] := chr($03);

    chk := intTohex(((j+$20)+$61+$50+$23+$03),2);



    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);





    buff[6] := chr(dat1);

    buff[7] := chr(dat2);



    comm1.Write(buff,8);



    for i:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,30);



    if byte(buff[4]) = $24 then

    mess[j] := 's'

    else

    mess[j] := 'e';

    end;



    { if (mess[1] = 'e') then or (mess[2] = 'e') or

    (mess[3] = 'e') then or (mess[4] = 'e') then

    begin

    showmessage('리더기의 통신상태에 이상이 있습니다.'+#13+

    '통신상태를 확인후, 다시 시도하십시오..');

    exit;

    end}

    if (mess[1] = 'e') then //or (mess[2] = 'e') then

    begin

    showmessage('리더기의 통신상태에 이상이 있습니다.'+#13+

    '통신상태를 확인후, 다시 시도하십시오..');

    exit;

    end

    else

    button1.click;

    end;



    procedure Treadingform.Button1Click(Sender: TObject);

    var

    kunsu,s,sFileName : string;

    sum_kunsu,z : integer;

    F : TextFile;



    begin

    path := ExtractFilePath(ParamStr(0))+'comm.ini';

    ini_file := Tinifile.create(path);

    ea := ini_file.readstring('reader','reader','');

    ini_file.free;



    BitBtn1.Enabled := false;

    BitBtn2.Enabled := false;

    Screen.cursor := crhourglass;



    sum_kunsu := 0;

    for j := 1 to strToint(ea) do

    begin

    //실제건수 확인

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($54);

    buff[4] := chr($33);

    buff[5] := chr($03);

    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);



    if dat1 > $39 then

    dat1:=(dat1-55)+$20

    else

    dat1:=(dat1-$30)+$20;



    if dat2 > $39 then

    dat2:=(dat2-55)+$20

    else

    dat2:=(dat2-$30)+$20;



    buff[6] := chr(dat1);

    buff[7] := chr(dat2);

    comm1.Write(buff,8);



    for k:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,23);



    kunsu := intTohex((byte(buff[5])-$20),2)+intTohex((byte(buff[6])-$20),2)+

    intTohex((byte(buff[7])-$20),2);

    sum_kunsu := sum_kunsu + strToint(kunsu);

    end;

    //--------------------------------------------------------------//

    Gauge1.visible := true;

    Gauge1.Maxvalue := sum_kunsu;

    z := 0;

    for j := 1 to strToint(ea) do

    begin



    //실제건수 확인

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($54);

    buff[4] := chr($33);

    buff[5] := chr($03);

    chk := intTohex(((j+$20)+$63+$54+$33+03),2);

    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);



    if dat1 > $39 then

    dat1:=(dat1-55)+$20

    else

    dat1:=(dat1-$30)+$20;



    if dat2 > $39 then

    dat2:=(dat2-55)+$20

    else

    dat2:=(dat2-$30)+$20;



    buff[6] := chr(dat1);

    buff[7] := chr(dat2);

    comm1.Write(buff,8);



    for k:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,23);



    kunsu := intTohex((byte(buff[5])-$20),2)+intTohex((byte(buff[6])-$20),2)+

    intTohex((byte(buff[7])-$20),2);

    su := strToint(kunsu);

    //---------------------------//



    //--자료수신 시작----------//

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($50);

    buff[4] := chr($23);

    buff[5] := chr($03);

    chk := intTohex(((J+$20)+$63+$50+$23+$03),2);

    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);



    buff[6] := chr(dat1);

    buff[7] := chr(dat2);



    comm1.Write(buff,8);



    for k:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,20);

    //-----------------------------//

    //----자료수신-----------------//

    for i:=1 to su do

    begin

    Gauge1.progress := Gauge1.progress + 1;

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($51);

    buff[4] := chr($33);

    buff[5] := chr($03);



    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);





    buff[6] := chr(dat1);

    buff[7] := chr(dat2);



    comm1.write(buff,8);



    for k:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,25);



    s :=

    intTohex((byte(buff[1])-$20),2)+'-'+ //기기번지

    intTohex((byte(buff[14])-$20),2)+intTohex((byte(buff[15])-$20),2)+

    intTohex((byte(buff[16])-$20),2)+intTohex((byte(buff[17])-$20),2)+

    intTohex((byte(buff[18])-$20),2)+intTohex((byte(buff[19])-$20),2)+'-'+

    intTohex((byte(buff[13])-$20),2)+'-'+

    intTohex((byte(buff[8])-$20),2)+intTohex((byte(buff[9])-$20),2)+

    intTohex((byte(buff[10])-$20),2)+intTohex((byte(buff[11])-$20),2)+

    intTohex((byte(buff[12])-$20),2);



    sFileName := intTohex((byte(buff[1])-$20),2)+

    intTohex((byte(buff[14])-$20),2)+intTohex((byte(buff[15])-$20),2)+

    intTohex((byte(buff[16])-$20),2)+intTohex((byte(buff[17])-$20),2);



    assignFile(F, 'dat'+sFileName+'.dat');

    if FileExists('dat'+sFileName+'.dat') then

    append(F)

    else

    rewrite(F);



    Writeln(F, s);

    CloseFile(F);



    z := z + 1;

    if z > 1000 then

    begin

    memo1.clear;

    z := 0;

    end;

    memo1.lines.add(s);

    end;



    //---자료수신 끝------------//

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($52);

    buff[4] := chr($33);

    buff[5] := chr($03);



    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);





    buff[6] := chr(dat1);

    buff[7] := chr(dat2);

    comm1.Write(buff,8);



    for i:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,23);



    //----------------------------//

    //---Event 삭제---------------//

    buff[0] := chr($02);

    buff[1] := chr(j+$20);

    buff[2] := chr($63);

    buff[3] := chr($53);

    buff[4] := chr($33);

    buff[5] := chr($03);



    if length(chk) = 3 then

    begin

    ch1 := copy(chk,2,1);

    ch2 := copy(chk,3,1);

    end

    else if length(chk) = 2 then

    begin

    ch1 := copy(chk,1,1);

    ch2 := copy(chk,2,1);

    end;



    dat1:=Byte(ch1[1]);

    dat2:=Byte(ch2[1]);



    buff[6] := chr(dat1);

    buff[7] := chr(dat2);

    comm1.Write(buff,8);



    for i:=0 to 9999999 do

    begin



    end;



    comm1.Read(buff,23);



    //------------------------------//

    end;



    Gauge1.progress := 0;

    Gauge1.visible := false;

    // Panel2.visible := true;



    // Button2.click; //자료변환

    BitBtn1.Enabled := true;

    BitBtn2.Enabled := true;

    Screen.cursor := crdefault;



    // panel2.visible := false;







    end;