Delphi读写T5557卡、复制HID、ID门禁卡源码

2023-12-10 21:50

本文主要是介绍Delphi读写T5557卡、复制HID、ID门禁卡源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        T5557卡是美国Atmel公司生产的多功能非接触式射频芯片卡,属于125KHz的低频卡,在国内有广大的应用市场,如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块使用,也可以作为保护全部数据的密码(假如在配置块中启用密码功能的话),防止非法改写数据。 第1页的1、2块保存了出厂商信息及唯一出厂ID,只能读取不可更改。T5567、T5577是T5557的升级版。

 

        通过修改T5557卡的参数配置块,可以将t5557卡模拟成ID卡及HID卡,所以被广泛地用于门禁卡的复制。

本示例使用的发卡器:T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com)

一、函数声明 

unit declaredll;interface//ID卡读卡
function idr_read(pserial:pbyte):byte;stdcall;external 'OUR_IDR.dll';//HID卡读卡
function hid_read(pserial:pbyte):byte;stdcall;external 'OUR_IDR.dll';//T5557卡写配置块
function t5557_init(ctrlword:byte;serial:pbyte;key:pbyte;configdata:pbyte;newkey:pbyte):byte;stdcall;external 'OUR_IDR.dll';//T5557卡读卡
function t5557_read(ctrlword:byte;serial:pbyte;key:pbyte;blockflag:pbyte;readdata:pbyte):byte;stdcall;external 'OUR_IDR.dll';//T5557卡写卡
function t5557_write(ctrlword:byte;serial:pbyte;key:pbyte;blockflag:pbyte;writedata:pbyte):byte;stdcall;external 'OUR_IDR.dll';//T5557卡改密码
function t5557_changekey(ctrlword:byte;serial:pbyte;oldkey:pbyte;newkey:pbyte):byte;stdcall;external 'OUR_IDR.dll';//用T5557卡制作ID卡(也就是EM4100及兼容卡)
function t5557_to4100(ctrlword:byte;serial:pbyte;oldkey:pbyte;newkey:pbyte;myuidbuf:pbyte):byte;stdcall;external 'OUR_IDR.dll';//用T5557卡制作HID卡
function t5557_tohid(ctrlword:byte;serial:pbyte;oldkey:pbyte;newkey:pbyte;myuidbuf:pbyte):byte;stdcall;external 'OUR_IDR.dll';//驱动蜂鸣器函数声明
function idr_beep(xms:integer):byte;stdcall;external 'OUR_IDR.dll';
//读出设备序列编号函数声明
function pcdgetdevicenumber(pdevicenumber:pbyte):byte;stdcall;external 'OUR_IDR.dll';const//以下控制字的含义请查看本公司网站提供的动态库说明NEEDSERIAL = $01;   //需要只对指定系列号的卡操作NEEDKEY = $02;      //需要用密码认证LOCKBIT = $04;      //锁定配置块或数据块,仅对   t5557_init,t5557_write ,t5557_changekey函数有效KEYENABLE = $08;    //启用本卡的密码功能RESETCARD = $10;    //操作成功后重启卡片implementationend.

二、读取T5557卡块内数据

procedure TForm1.Button3Click(Sender: TObject);//读卡
varj:integer;status:byte;//存放返回值myctrlword:byte;//控制字oldpicckey:array[0..3] of byte;//密码mypiccserial:array[0..5] of byte;//卡序列号mypiccdata:array[0..49] of byte;//读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据mypiccblockflag:array[0..1] of byte;//指定读哪一块strls:string;strls1:string;beginmyctrlword := $00; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能if CheckBox2.Checked thenbegin//本次操作需要密码验证oldpicckey[0] :=  StrToInt('$' + midstr(Edit5.Text,1,2));oldpicckey[1] :=  StrToInt('$' + midstr(Edit5.Text,3,2));oldpicckey[2] :=  StrToInt('$' + midstr(Edit5.Text,5,2));oldpicckey[3] :=  StrToInt('$' + midstr(Edit5.Text,7,2));myctrlword := myctrlword + NEEDKEY;end;if CheckBox3.Checked thenbegin//仅操作指定卡号的卡if(Length(Edit8.Text) < 12) thenbeginShowMessage('卡号长度不足');Edit8.SetFocus;Exit;end;myctrlword := myctrlword + NEEDSERIAL;//仅操作指定卡号的卡,6个字节卡号如下mypiccserial[0] :=  StrToInt('$' + midstr(Edit8.Text,1,2));mypiccserial[1] :=  StrToInt('$' + midstr(Edit8.Text,3,2));mypiccserial[2] :=  StrToInt('$' + midstr(Edit8.Text,5,2));mypiccserial[3] :=  StrToInt('$' + midstr(Edit8.Text,7,2));mypiccserial[4] :=  StrToInt('$' + midstr(Edit8.Text,9,2));mypiccserial[5] :=  StrToInt('$' + midstr(Edit8.Text,11,2));end;//操作块标志//第0页的块mypiccblockflag[0] := 0;if chkP0B0.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 1;end;if chkP0B1.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 2;end;if chkP0B2.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 4;end;if chkP0B3.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 8;end;if chkP0B4.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 16;end;if chkP0B5.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 32;end;if chkP0B6.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 64;end;if chkP0B7.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 128;end;//第1页mypiccblockflag[1] := 0;if chkP1B1.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 2;end;if chkP1B2.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 4;end;if chkP1B3.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 8;end;if chkP1B4.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 16;end;status := t5557_read(myctrlword,@mypiccserial,@oldpicckey,@mypiccblockflag,@mypiccdata);case status of0:beginstrls := '卡无线转输分频比[';strls := strls + IntToStr(mypiccdata[0]);strls := strls + '],卡号[';strls1 := '';for j := 0 to 5 dobeginstrls1 := strls1 + IntToHex(mypiccserial[j],2);end;strls := strls + strls1;strls := strls + '],卡数据[';strls1 := '';for j := 0 to mypiccdata[1] - 1 dobeginstrls1 := strls1 + IntToHex(mypiccdata[2+j],2);end;strls := strls + strls1;strls := strls + ']';Memo2.Text := strls;ShowMessage('读卡成功');end;8: ShowMessage('请将卡放在感应区');2: ShowMessage('本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY');3: ShowMessage('需要密码才能读卡,函数myctrlword要加入NEEDKEY');5: ShowMessage('密码错误!');23: ShowMessage('机器没连上,或驱动程序未安装!');else ShowMessage('错误代码:' + IntToStr(status));end;end;

三、写数据到T5557卡内 

procedure TForm1.Button1Click(Sender: TObject);//写卡
vari,j:integer;status:byte;//存放返回值myctrlword:byte;//控制字oldpicckey:array[0..3] of byte;//密码mypiccserial:array[0..5] of byte;//卡序列号mypiccdata:array[0..47] of byte;//写入数据缓冲:最多返回12个块的数据mypiccblockflag:array[0..1] of byte;//指定写哪一块strls:string;strls1:string;beginmyctrlword := $00; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能if CheckBox2.Checked thenbegin//本次操作需要密码验证oldpicckey[0] :=  StrToInt('$' + midstr(Edit5.Text,1,2));oldpicckey[1] :=  StrToInt('$' + midstr(Edit5.Text,3,2));oldpicckey[2] :=  StrToInt('$' + midstr(Edit5.Text,5,2));oldpicckey[3] :=  StrToInt('$' + midstr(Edit5.Text,7,2));myctrlword := myctrlword + NEEDKEY;end;if CheckBox3.Checked thenbegin//仅操作指定卡号的卡if(Length(Edit8.Text) < 12) thenbeginShowMessage('卡号长度不足');Edit8.SetFocus;Exit;end;myctrlword := myctrlword + NEEDSERIAL;//仅操作指定卡号的卡,6个字节卡号如下mypiccserial[0] :=  StrToInt('$' + midstr(Edit8.Text,1,2));mypiccserial[1] :=  StrToInt('$' + midstr(Edit8.Text,3,2));mypiccserial[2] :=  StrToInt('$' + midstr(Edit8.Text,5,2));mypiccserial[3] :=  StrToInt('$' + midstr(Edit8.Text,7,2));mypiccserial[4] :=  StrToInt('$' + midstr(Edit8.Text,9,2));mypiccserial[5] :=  StrToInt('$' + midstr(Edit8.Text,11,2));end;//操作块标志j := 0;//第0页的块mypiccblockflag[0] := 0;if chkP0B0.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 1;Inc(j);end;if chkP0B1.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 2;Inc(j);end;if chkP0B2.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 4;Inc(j);end;if chkP0B3.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 8;Inc(j);end;if chkP0B4.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 16;Inc(j);end;if chkP0B5.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 32;Inc(j);end;if chkP0B6.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 64;Inc(j);end;if chkP0B7.Checked thenbeginmypiccblockflag[0] := mypiccblockflag[0] + 128;Inc(j);end;//第1页mypiccblockflag[1] := 0;if chkP1B1.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 2;Inc(j);end;if chkP1B2.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 4;Inc(j);end;if chkP1B3.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 8;Inc(j);end;if chkP1B4.Checked thenbeginmypiccblockflag[1] := mypiccblockflag[1] + 16;Inc(j);end;if j = 0 thenbeginShowMessage('请选择需要写入的块!');Exit;end;//写卡数据准备strls := Memo1.Text;i := Length(strls);i := i div 2;if i < (j * 4) thenbeginShowMessage('数据长度不足,请补足数据!');Memo1.SelStart := Length(Memo1.Text);Memo1.SetFocus;Exit;end;for i := 0 to (j * 4 - 1) dobeginmypiccdata[i] := StrToInt('$' + MidStr(strls,i*2+1,2));    //22232425 26272829end;status := t5557_write(myctrlword,@mypiccserial,@oldpicckey,@mypiccblockflag,@mypiccdata);case status of0:beginstrls := '卡号[';strls1 := '';for i := 0 to 5 dobeginstrls1 := strls1 + IntToHex(mypiccserial[i],2);end;strls := strls + strls1;strls := strls + ']';Memo2.Text := strls;ShowMessage('写卡成功');end;8: ShowMessage('请将卡放在感应区');2: ShowMessage('本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY');3: ShowMessage('需要密码才能写卡,函数myctrlword要加入NEEDKEY');5: ShowMessage('密码错误!');23: ShowMessage('机器没连上,或驱动程序未安装!');else ShowMessage('错误代码:' + IntToStr(status));;end;end;

四、将T5557卡配置成ID卡、HID卡

procedure TForm1.Button7Click(Sender: TObject);//单次制卡(收费功能)
vari,j:Integer;cardnumber:int64;myuidbuf:array[0..6] of byte;//ID卡序列号status:byte;//存放返回值myctrlword:byte;//控制字oldpicckey:array[0..3] of byte;//密码mypiccserial:array[0..5] of byte;//卡序列号newpicckey:array[0..3] of byte;//新密码strls:string;strls1:string;begin//输入检查//卡号tryif RadioButton3.Checked thenbegin//ID卡if ComboBox5.ItemIndex = 1 thenbegin//输入10位十进制码if Length(Edit1.Text) < 10 thenbeginShowMessage('卡号输入长度不足,必须为10位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;if(cardnumber > 4294967295) thenbeginShowMessage('卡号的值不能超过4294967295');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;myuidbuf[4] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;endelse if ComboBox5.ItemIndex = 2 thenbegin//输入韦根34码if Length(Edit1.Text) < 10 thenbeginShowMessage('卡号输入长度不足,必须为10位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelectAll;Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(midstr(Edit1.Text,1,5));if(cardnumber > 65535) thenbeginShowMessage('WG34卡号的前5位字符的值不能超过65535');Edit1.SelStart := 1;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[2] := cardnumber;cardnumber:= StrToInt64(midstr(Edit1.Text,6,5));if(cardnumber > 65535) thenbeginShowMessage('WG34卡号的后5位字符的值不能超过65535');Edit1.SelStart := 6;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[4] := cardnumber;myuidbuf[3] := (cardnumber div 256);endelse if ComboBox5.ItemIndex = 3 thenbegin//输入韦根26码if Length(Edit1.Text) < 8 thenbeginShowMessage('卡号输入长度不足,必须为8位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelectAll;Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(midstr(Edit1.Text,1,3));if(cardnumber > 255) thenbeginShowMessage('WG26卡号的前3位字符的值不能超过255');Edit1.SelStart := 1;Edit1.SelLength := 3;Edit1.SetFocus;Exit;end;myuidbuf[2] := cardnumber;cardnumber:= StrToInt64(midstr(Edit1.Text,4,5));if(cardnumber > 65535) thenbeginShowMessage('WG26卡号的后5位字符的值不能超过65535');Edit1.SelStart := 4;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[4] := cardnumber;myuidbuf[3] := (cardnumber div 256);endelsebegin//输入10位十六进制码if Length(Edit1.Text) < 10 thenbeginShowMessage('卡号输入长度不足,必须为10位十六进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber := StrToInt64('$'+Edit1.Text);myuidbuf[4] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;end;endelsebegin//HID卡if (ComboBox5.ItemIndex = 1) thenbegin//输入10位十进制码if Length(Edit1.Text) < 10 thenbeginShowMessage('卡号输入长度不足,必须为10位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;if(cardnumber > 4294967295) thenbeginShowMessage('卡号的值不能超过4294967295');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;myuidbuf[6] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[5] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[4] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[3] := cardnumber;endelse if ComboBox5.ItemIndex = 2 thenbegin//输入韦根34码if Length(Edit1.Text) < 10 thenbeginShowMessage('卡号输入长度不足,必须为10位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelectAll;Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(midstr(Edit1.Text,1,5));if(cardnumber > 65535) thenbeginShowMessage('WG34卡号的前5位字符的值不能超过65535');Edit1.SelStart := 1;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[4] := cardnumber;myuidbuf[3] := (cardnumber div 256);cardnumber:= StrToInt64(midstr(Edit1.Text,6,5));if(cardnumber > 65535) thenbeginShowMessage('WG34卡号的后5位字符的值不能超过65535');Edit1.SelStart := 6;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[6] := cardnumber;myuidbuf[5] := (cardnumber div 256);endelse if ComboBox5.ItemIndex = 3 thenbegin//输入韦根26码if Length(Edit1.Text) < 8 thenbeginShowMessage('卡号输入长度不足,必须为8位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelectAll;Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(midstr(Edit1.Text,1,3));if(cardnumber > 255) thenbeginShowMessage('WG26卡号的前3位字符的值不能超过255');Edit1.SelStart := 1;Edit1.SelLength := 3;Edit1.SetFocus;Exit;end;myuidbuf[4] := cardnumber;cardnumber:= StrToInt64(midstr(Edit1.Text,4,5));if(cardnumber > 65535) thenbeginShowMessage('WG26卡号的后5位字符的值不能超过65535');Edit1.SelStart := 4;Edit1.SelLength := 5;Edit1.SetFocus;Exit;end;myuidbuf[6] := cardnumber;myuidbuf[5] := (cardnumber div 256);endelse if ComboBox5.ItemIndex = 4 thenbegin//输入4.3H6D码if Length(Edit1.Text) < 6 thenbeginShowMessage('卡号输入长度不足,必须为6位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);myuidbuf[6] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[5] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[4] := cardnumber mod 8;//只取低3个位endelse if ComboBox5.ItemIndex = 5 thenbegin//输入4H5D码if Length(Edit1.Text) < 5 thenbeginShowMessage('卡号输入长度不足,必须为5位十进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber:= StrToInt64(Edit1.Text);if(cardnumber < 0) thenbeginShowMessage('卡号的值不能为负数');Edit1.SelectAll;Edit1.SetFocus;Exit;end;myuidbuf[6] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[5] := cardnumber;endelsebegin//输入12位十六进制码if Length(Edit1.Text) < 11 thenbeginShowMessage('卡号输入长度不足,必须为11位十六进制数值');Edit1.SelStart := Length(Edit1.Text);Edit1.SetFocus;Exit;end;cardnumber := StrToInt64('$'+Edit1.Text);myuidbuf[6] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[5] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[4] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[1] := cardnumber;end;if ComboBox2.ItemIndex = 0 thenbegin//H10301(韦根26)myuidbuf[0] := 26 - 2;//有效位bitendelse if ComboBox2.ItemIndex = 1 thenbegin//H10302(韦根37)myuidbuf[0] := 37 - 2;//有效位bitendelse if ComboBox2.ItemIndex = 2 thenbegin//H10304(韦根37)myuidbuf[0] := 37 - 2;//有效位bitendelse if ComboBox2.ItemIndex = 3 thenbegin//企业1000格式(韦根35)myuidbuf[0] := 35 - 2;//有效位bitendelsebeginmyuidbuf[0] := ComboBox2.ItemIndex + 4;//韦根10有效位bit为8位end;end;exceptShowMessage('卡号输入错误,必须为没有负数的数字');Edit1.SelectAll;Edit1.SetFocus;Exit;end;if RadioButton3.Checked thenbegin//ID卡try//版本号if Length(Edit10.Text) = 0 thenbeginShowMessage('请先输入版本号,为0至15的数值');Edit10.SetFocus;Exit;end;if ComboBox5.ItemIndex = 0 thenbegini := StrToInt('$'+ Edit10.Text);endelsebegini := StrToInt(Edit10.Text);end;if i < 0 thenbeginShowMessage('版本号不能为 负数');Edit10.SelectAll;Edit10.SetFocus;Exit;end;if i > 15 thenbeginShowMessage('版本号不能大于 15 ');Edit10.SelectAll;Edit10.SetFocus;Exit;end;exceptShowMessage('版本号输入错误,必须为数字');Edit10.SelectAll;Edit10.SetFocus;Exit;end;//客户代码tryif Length(Edit11.Text) = 0 thenbeginShowMessage('请先输入客户代码,为0至15的数值');Edit11.SetFocus;Exit;end;if ComboBox5.ItemIndex = 0 thenbeginj := StrToInt('$'+ Edit11.Text);endelsebeginj := StrToInt(Edit11.Text);end;if j < 0 thenbeginShowMessage('客户代码不能为负数 ');Edit11.SelectAll;Edit11.SetFocus;Exit;end;if j > 15 thenbeginShowMessage('客户代码不能大于 15 ');Edit11.SelectAll;Edit11.SetFocus;Exit;end;exceptShowMessage('客户代码输入错误,必须为数字');Edit11.SelectAll;Edit11.SetFocus;Exit;end;myuidbuf[0] := i * 16 + j;end;if RadioButton3.Checked thenbegin//ID卡//前缀码tryif ComboBox5.ItemIndex = 0 thenbeginif Length(Edit13.Text) = 0 thenbeginShowMessage('请先输入前缀码,为十六进制00至FF的数值');Edit13.SetFocus;Exit;end;i := StrToInt('$'+ Edit13.Text);endelsebeginif Length(Edit13.Text) = 0 thenbeginShowMessage('请先输入前缀码,为0至255的数值');Edit13.SetFocus;Exit;end;i := StrToInt(Edit13.Text);end;if i < 0 thenbeginShowMessage('前缀码不能为负数 ');Edit13.SelectAll;Edit13.SetFocus;Exit;end;if i > 255 thenbeginShowMessage('前缀码不能大于 255 ');Edit13.SelectAll;Edit13.SetFocus;Exit;end;exceptShowMessage('前缀码输入错误,必须为数字');Edit13.SelectAll;Edit13.SetFocus;Exit;end;myuidbuf[1] := i;endelsebegin//HID卡if (ComboBox5.ItemIndex > 0) thenbegin//前缀码tryif Length(Edit13.Text) = 0 thenbeginShowMessage('请先输入前缀码,为十进制数值');Edit13.SetFocus;Exit;end;cardnumber := StrToInt64(Edit13.Text);if cardnumber < 0 thenbeginShowMessage('前缀码不能为负数 ');Edit13.SelectAll;Edit13.SetFocus;Exit;end;if (ComboBox5.ItemIndex = 1) or (ComboBox5.ItemIndex = 2) thenbegin//输入10位十进制码 或 输入韦根34码myuidbuf[2] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[1] := cardnumber;endelse if ComboBox5.ItemIndex = 3 thenbegin//输入韦根26码myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[1] := cardnumber;endelse if ComboBox5.ItemIndex = 4 thenbegin//输入4.3H6D码myuidbuf[4] := myuidbuf[4] + ((cardnumber mod 32) * 8);//只取高5个位cardnumber := cardnumber div 32;myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[1] := cardnumber;endelse if ComboBox5.ItemIndex = 5 thenbegin//输入4H5D码myuidbuf[4] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[3] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[2] := cardnumber;cardnumber := cardnumber div 256;myuidbuf[1] := cardnumber;end;exceptShowMessage('前缀码输入错误,必须为数字');Edit13.SelectAll;Edit13.SetFocus;Exit;end;end;end;myctrlword := $00; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能if CheckBox2.Checked thenbegin//本次操作需要密码验证oldpicckey[0] :=  StrToInt('$' + midstr(Edit5.Text,1,2));oldpicckey[1] :=  StrToInt('$' + midstr(Edit5.Text,3,2));oldpicckey[2] :=  StrToInt('$' + midstr(Edit5.Text,5,2));oldpicckey[3] :=  StrToInt('$' + midstr(Edit5.Text,7,2));myctrlword := myctrlword + NEEDKEY;end;if CheckBox3.Checked thenbegin//仅操作指定卡号的卡if(Length(Edit8.Text) < 12) thenbeginShowMessage('卡号长度不足');Edit8.SetFocus;Exit;end;myctrlword := myctrlword + NEEDSERIAL;//仅操作指定卡号的卡,6个字节卡号如下mypiccserial[0] :=  StrToInt('$' + midstr(Edit8.Text,1,2));mypiccserial[1] :=  StrToInt('$' + midstr(Edit8.Text,3,2));mypiccserial[2] :=  StrToInt('$' + midstr(Edit8.Text,5,2));mypiccserial[3] :=  StrToInt('$' + midstr(Edit8.Text,7,2));mypiccserial[4] :=  StrToInt('$' + midstr(Edit8.Text,9,2));mypiccserial[5] :=  StrToInt('$' + midstr(Edit8.Text,11,2));end;if CheckBox14.Checked thenbegin//修改卡号保护密码newpicckey[0] :=  StrToInt('$' + midstr(Edit14.Text,1,2));newpicckey[1] :=  StrToInt('$' + midstr(Edit14.Text,3,2));newpicckey[2] :=  StrToInt('$' + midstr(Edit14.Text,5,2));newpicckey[3] :=  StrToInt('$' + midstr(Edit14.Text,7,2));myctrlword := myctrlword + KEYENABLE;endelsebeginnewpicckey[0] :=  $00;newpicckey[1] :=  $00;newpicckey[2] :=  $00;newpicckey[3] :=  $00;end;myctrlword := myctrlword + RESETCARD;//操作后重启卡片,否则在制卡后,需要拿开卡片重放才能成功读ID卡if RadioButton3.Checked thenbegin//ID卡status := t5557_to4100(myctrlword,@mypiccserial,@oldpicckey,@newpicckey,@myuidbuf);endelsebegin//HID卡status := t5557_tohid(myctrlword,@mypiccserial,@oldpicckey,@newpicckey,@myuidbuf);end;case status of0:beginstrls := '卡号[';strls1 := '';for i := 0 to 5 dobeginstrls1 := strls1 + IntToHex(mypiccserial[i],2);end;strls := strls + strls1;strls := strls + ']';Memo2.Text := strls;ShowMessage('写卡成功');end;8: ShowMessage('卡不在感应区或密码不正确');2: ShowMessage('本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY');3: ShowMessage('需要密码才能制卡,函数myctrlword要加入NEEDKEY');5: ShowMessage('密码错误!');23: ShowMessage('机器没连上,或驱动程序未安装!');else ShowMessage('错误代码:' + IntToStr(status));;end;end;

五、T5557卡初始化

  1. 01、初始配置块取值:00 08 80 E8,表示AOR请求应答模式=0、PWD密码有效=0、MAXBLK自动发送最大块=7,无需密码可读卡,自动发送0页的1-7块;
  2. 02、配置块取值:00 08 82 F8,表示AOR应答模式=1、PWD密码有效=1,卡片为密码保护模式,需要认证密码才能读、写卡;
  3. 03、配置块取值:00 08 80 F8,表示AOR应答模式=0、PWD密码有效=1,读卡(自动发送)不需要密码,写卡要带密码操作。
procedure TForm1.Button6Click(Sender: TObject); //设定卡配置
varstatus:byte;//存放返回值myctrlword:byte;//控制字oldpicckey:array[0..3] of byte;//密码mypiccserial:array[0..5] of byte;//卡序列号mypiccdata:array[0..3] of byte;//卡数据缓冲newpicckey:array[0..3] of byte;//新密码beginmyctrlword := $00; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能if CheckBox2.Checked thenbegin//本次操作需要密码验证oldpicckey[0] :=  StrToInt('$' + midstr(Edit5.Text,1,2));oldpicckey[1] :=  StrToInt('$' + midstr(Edit5.Text,3,2));oldpicckey[2] :=  StrToInt('$' + midstr(Edit5.Text,5,2));oldpicckey[3] :=  StrToInt('$' + midstr(Edit5.Text,7,2));myctrlword := myctrlword + NEEDKEY;endelsebeginnewpicckey[0] :=  $00;newpicckey[1] :=  $00;newpicckey[2] :=  $00;newpicckey[3] :=  $00;end;if CheckBox1.Checked thenbegin//启用密码功能newpicckey[0] :=  StrToInt('$' + midstr(Edit3.Text,1,2));newpicckey[1] :=  StrToInt('$' + midstr(Edit3.Text,3,2));newpicckey[2] :=  StrToInt('$' + midstr(Edit3.Text,5,2));newpicckey[3] :=  StrToInt('$' + midstr(Edit3.Text,7,2));myctrlword := myctrlword + KEYENABLE;endelsebeginnewpicckey[0] :=  $00;newpicckey[1] :=  $00;newpicckey[2] :=  $00;newpicckey[3] :=  $00;end;//配置值:mypiccdata[0] :=  StrToInt('$' + midstr(Edit6.Text,1,2));mypiccdata[1] :=  StrToInt('$' + midstr(Edit6.Text,3,2));mypiccdata[2] :=  StrToInt('$' + midstr(Edit6.Text,5,2));mypiccdata[3] :=  StrToInt('$' + midstr(Edit6.Text,7,2));status := t5557_init(myctrlword,@mypiccserial,@oldpicckey,@mypiccdata,@newpicckey);case status of0: ShowMessage('操作成功');8: ShowMessage('卡不在感应区或密码不正确');1: ShowMessage('写入配置的值不正确,请重新写入');2: ShowMessage('本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY');3: ShowMessage('需要密码才能重新设定,函数myctrlword要加入NEEDKEY');5: ShowMessage('密码错误!');23: ShowMessage('机器没连上,或驱动程序未安装!');else ShowMessage('错误代码:' + IntToStr(status));;end;end;

本示例源码下载:https://download.csdn.net/download/zhangjin7422/85467226

这篇关于Delphi读写T5557卡、复制HID、ID门禁卡源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478485

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动