Delphi读写IC卡数据、修改IC卡认证密钥源码

本示例使用的设备:Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) 

 函数声明

unit declaredll;

interface
     //读卡函数声明
     function piccreadex(ctrlword:byte;pserial:pbyte;area:byte;keyA1B0:byte;picckey:pbyte;piccdata0_2:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //写卡函数声明
     function piccwriteex(ctrlword:byte;pserial:pbyte;area:byte;keyA1B0:byte;picckey:pbyte;piccdata0_2:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //驱动蜂鸣器函数声明
     function pcdbeep(xms:integer):byte;stdcall;external 'OUR_MIFARE.dll';

     //修改单区密码函数声明
     function piccchangesinglekey(ctrlword:byte;pserial:pbyte;area:byte;keyA1B0:byte;piccoldkey:pbyte;piccnewkey:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //修改单区密码改单区AB密码或访问控制位函数声明
     function piccchangesinglekeyex(ctrlword:byte;serial:pbyte;area:byte;keyA1B0:byte;piccoldkey:pbyte;piccdata:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //读出设备编号函数声明
     function pcdgetdevicenumber(pdevicenumber:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //只读取卡号函数
     function piccrequest(pserial:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

     //发送显示
      function lcddispfull(lcdstr:PChar):byte;stdcall;external 'OUR_MIFARE.dll';

     //改写0区0块UID
      function piccwriteserial(ctrlword:byte;pserial:pbyte;keyA1B0:byte;picckey:pbyte;piccdata:pbyte):byte;stdcall;external 'OUR_MIFARE.dll';

      //读7字节卡号
      function  piccrequest_ul(piccdata:pbyte):byte; stdcall;external 'OUR_MIFARE.dll';

      //读身份证UID
      function  sfzrequest(piccdata:pbyte):byte; stdcall;external 'OUR_MIFARE.dll';

      //读iCLass CSN
      function  iso15693iclassreadcsn(piccdata:pbyte):byte; stdcall;external 'OUR_MIFARE.dll';
const
   //以下控制字的含义请查看本公司网站提供的动态库说明
    BLOCK0_EN = $01;  //读块0
    BLOCK1_EN = $02;  //读块1
    BLOCK2_EN = $04;   //读块2
    NEEDSERIAL = $08;  //是否需要只对指定系列号的卡操作
    EXTERNKEY = $10;   //是否使用外部密码
    NEEDHALT = $20;   //是否休眠本卡

implementation

end.

轻松读卡

procedure TForm1.Button9Click(Sender: TObject);
var
    i:integer;
    status:byte;//存放返回值
    myareano:byte;//区号
    authmode:byte;//密码类型,用A密码或B密码
    myctrlword:byte;//控制字
	  mypicckey:array[0..5] of byte;//密码
    mypiccserial:array[0..3] of byte;//卡序列号
    mypiccdata:array[0..47] of byte;//卡数据缓冲
    str:string;
begin

   //控制字指定,控制字的含义请查看本公司网站提供的动态库说明
   myctrlword := BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

    //指定区号
    myareano := 8;//指定为第8区
    //批定密码模式
    authmode := 1;//大于0表示用A密码认证,推荐用A密码认证

    //指定密码
    mypicckey[0] := $ff;
    mypicckey[1] := $ff;
    mypicckey[2] := $ff;
    mypicckey[3] := $ff;
    mypicckey[4] := $ff;
    mypicckey[5] := $ff;

    status := piccreadex(myctrlword,@mypiccserial,myareano,authmode,@mypicckey,@mypiccdata);

        case status of
          0:
          begin
             str:='';
             for i:=0 to 47 do
             begin
                str:=str+IntToHex(mypiccdata[i],2);
             end;
             memo1.Text :=str;
             ShowMessage('读卡操作成功,卡内信息已显示在右栏。');
          end;
          8: ShowMessage('请将卡放在感应区');
          12:ShowMessage('卡密码认证失败!');
        else
          begin
              ShowMessage(IntToStr(status));
          end;

        end;

        //返回解释
        {
        #define ERR_REQUEST 8//寻卡错误
        #define ERR_READSERIAL 9//读序列吗错误
        #define ERR_SELECTCARD 10//选卡错误
        #define ERR_LOADKEY 11//装载密码错误
        #define ERR_AUTHKEY 12//密码认证错误
        #define ERR_READ 13//读卡错误
        #define ERR_WRITE 14//写卡错误

        #define ERR_NONEDLL 21//没有动态库
        #define ERR_DRIVERORDLL 22//动态库或驱动程序异常
        #define ERR_DRIVERNULL 23//驱动程序错误或尚未安装
        #define ERR_TIMEOUT 24//操作超时,一般是动态库没有反映
        #define ERR_TXSIZE 25//发送字数不够
        #define ERR_TXCRC 26//发送的CRC错
        #define ERR_RXSIZE 27//接收的字数不够
        #define ERR_RXCRC 28//接收的CRC错
        }
end;

轻松写卡

procedure TForm1.Button8Click(Sender: TObject);
var
    i:integer;
    status:byte;//存放返回值
    myareano:byte;//区号
    authmode:byte;//密码类型,用A密码或B密码
    myctrlword:byte;//控制字
	mypicckey:array[0..5] of byte;//密码
    mypiccserial:array[0..3] of byte;//卡序列号
    mypiccdata:array[0..47] of byte;//卡数据缓冲
    strls:string;
begin

   //控制字指定,控制字的含义请查看本公司网站提供的动态库说明
   myctrlword := BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

    //指定区号
    myareano := 8;//指定为第8区
    //批定密码模式
    authmode := 1;//大于0表示用A密码认证,推荐用A密码认证

    //指定密码
    mypicckey[0] := $ff;
    mypicckey[1] := $ff;
    mypicckey[2] := $ff;
    mypicckey[3] := $ff;
    mypicckey[4] := $ff;
    mypicckey[5] := $ff;

    strls := StringReplace(memo1.Lines.Text, #13#10, '', [rfReplaceAll])  + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
    for i := 0 to 47 do
    begin
      mypiccdata[i] := strtoint('$'+midstr(strls,i*2+1,2))
    end;

    status := piccwriteex(myctrlword,@mypiccserial,myareano,authmode,@mypicckey,@mypiccdata);

        case status of
          0:
          begin
              pcdbeep(38);
              ShowMessage('将右栏16进制数据写入卡内成功!');
          end;
          8: ShowMessage('请将卡放在感应区');
          12:ShowMessage('卡密码认证失败!');
        else
          begin
              ShowMessage('操作失败,错误代码:'+IntToStr(status));
          end;
        end;
        }
end;

修改卡片密钥

procedure TForm1.Button7Click(Sender: TObject);
var
    status:byte;//存放返回值
    myareano:byte;//区号
    authmode:byte;//密码类型,用A密码或B密码
    myctrlword:byte;//控制字
	  mypiccoldkey:array[0..5] of byte;//新密码
    mypiccserial:array[0..5] of byte;//卡序列号
    mypiccdata:array[0..16] of byte;//旧密码
begin
  //控制字指定,控制字的含义请查看本公司网站提供的动态库说明

  myctrlword := EXTERNKEY;
  myareano := 1;
  authmode := 1;

  //指定旧密码
  mypiccoldkey[0] := $FF;
  mypiccoldkey[1] := $FF;
  mypiccoldkey[2] := $FF;
  mypiccoldkey[3] := $FF;
  mypiccoldkey[4] := $FF;
  mypiccoldkey[5] := $FF;

  //'指定新A密码
  mypiccdata[0] := $FF;
  mypiccdata[1] := $FF;
  mypiccdata[2] := $FF;
  mypiccdata[3] := $FF;
  mypiccdata[4] := $FF;
  mypiccdata[5] := $FF;

  //访问控制位,请慎重,改错可能导致卡做废************************************************************************************
  mypiccdata[6] := $FF;
  mypiccdata[7] := $07;
  mypiccdata[8] := $80;
  mypiccdata[9] := $69;

  //'指定新B密码
  mypiccdata[10] := $FF;
  mypiccdata[11] := $FF;
  mypiccdata[12] := $FF;
  mypiccdata[13] := $FF;
  mypiccdata[14] := $FF;
  mypiccdata[15] := $FF;

  mypiccdata[16] := 3; //为1表示更改访问控制位,为2表示更改B密码,为3表示同时更改访问控制位及B密码,A密码在任何情况下都更改!

  status := piccchangesinglekeyex(myctrlword,@mypiccserial,myareano,authmode,@mypiccoldkey,@mypiccdata);
  If  status = 0 then
  begin
    pcdbeep(100);
    ShowMessage('卡片密钥修改成功!');
  end
  else if status = 8 then
  begin
    ShowMessage('请将卡放在感应区');
  end
  else
  begin
    ShowMessage('错误代码:' + IntToStr(status));
  end;
end;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值