📄 scdlldemounit.pas
字号:
if iRe<>4 then
Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
,MB_OK+MB_ICONWARNING); Exit; end;
//读卡的物理序列号
GetMem(pSNR,16);
iRe:=SC_GetSnr(rHandle,pSNR);
if iRe <> 0 then
Begin Application.MessageBox('没有读到序列号......','系统提示-读序列号'
,MB_OK+MB_ICONWARNING); Exit; end;
SNRET.Text := String(pSNR);
SNRET.Update;
FreeMem(pSNR,16);
end;
procedure TDemoFrm.WriteBtnClick(Sender: TObject);
var
pSNR:Pchar;
iMode:integer;
iSector:integer;
pKey:Pchar;
iBlock:integer;
pData:Pchar;
begin
WriteBtn.Enabled := False;
//打开通讯口
iRe:=InitPort(ComPortCBB.ItemIndex +1,rHandle);
if iRe <> 0 then
Begin Application.MessageBox('无法打开串口,可能是以下原因造成的,请检查....'+
#13+#13+'1.计算的串口(COM口)被其他设备占,请先关闭其它程序重试......'+#13+#13+
'2.读写机的通讯电缆没有与计算机连接,请检查......','系统提示-串口操作'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end; //打开串口失败,提示后,退出
//查询读写机上是否有卡,有卡继续下一步操作,无卡退出
iRe := SC_Request(rHandle); //寻卡
if iRe<>4 then
Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
//读卡的物理序列号
GetMem(pSNR,32);
iRe:=SC_GetSnr(rHandle,pSNR);
if iRe <> 0 then
Begin Application.MessageBox('没有读到序列号......','系统提示-读序列号'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
SNRET.Text := String(pSNR);
//选择卡
iRe:=SC_SelectSnr(rHandle,pSNR);
if iRe <> 0 then
Begin Application.MessageBox('请重新将卡放入感应区,再进行操作......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
//核对卡密钥,核对正确后,才可进行读写
//GetMem(pSNR,64);
iMode := 60;
iSector := 0;
pKey := Pchar('FFFFFFFFFFFF');
iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
if iRe <> 0 then
Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
iBlock := 1;
//pData := Pchar('11223344556677889900AABBCCDDEEFF');
pData := Pchar(DataET.Text);
iRe:= SC_RFWrite( rHandle,iBlock,pData);
if iRe <> 0 then
Begin Application.MessageBox('写入数据不正确......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
//读卡数据 进行 数据核对
GetMem(pData,64);
iBlock := 1;
iRe:= SC_RFRead(rHandle, iBlock, pData);
if String(pData) = DataET.Text then
Begin
Application.MessageBox('写卡完成','系统提示-写卡',MB_OK+MB_ICONWARNING);
end else Begin
Application.MessageBox('数据核对不正确......','系统提示-数据核对',MB_OK+MB_ICONWARNING);
end;
FreeMem(pData,64);
FreeMem(pSNR,32);
WriteBtn.Enabled := True;
WriteBtn.SetFocus;
iRe:=ClosePort(rHandle);
end;
procedure TDemoFrm.ReadBtnClick(Sender: TObject);
Var
pSNR:Pchar;
iMode:integer;
iSector:integer;
pKey:Pchar;
iBlock:integer;
pData:Pchar;
begin
ReadBtn.Enabled := False;
//打开通讯口
iRe:=InitPort(ComPortCBB.ItemIndex +1,rHandle);
if iRe <> 0 then
Begin Application.MessageBox('无法打开串口,可能是以下原因造成的,请检查....'+
#13+#13+'1.计算的串口(COM口)被其他设备占,请先关闭其它程序重试......'+#13+#13+
'2.读写机的通讯电缆没有与计算机连接,请检查......','系统提示-串口操作'
,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True; Exit; end; //打开串口失败,提示后,退出
//查询读写机上是否有卡,有卡继续下一步操作,无卡退出
iRe := SC_Request(rHandle); //寻卡
//Memo1.Lines.Add( IntToStr(iRe) );
if iRe<>4 then
Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True; Exit; end;
//读卡的物理序列号
GetMem(pSNR,32);
iRe:=SC_GetSnr(rHandle,pSNR);
SNRET.Text := String(pSNR);
SNRET.Update;
//选择卡
iRe:=SC_SelectSnr(rHandle,pSNR);
if iRe <> 0 then
Begin Application.MessageBox('请重新将卡放入感应区,再进行操作......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING);ReadBtn.Enabled := True; Exit; end;
//核对卡密钥,核对正确后,才可进行读写
//GetMem(pSNR,64);
iMode := 60;
iSector := 0;
pKey := Pchar('FFFFFFFFFFFF');
iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
if iRe <> 0 then
Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True; Exit; end;
//读卡数据
GetMem(pData,64);
iBlock := 1;
iRe:= SC_RFRead(rHandle, iBlock, pData);
DataET.Clear;
sleep(1);
DataET.Text := String(pData);
FreeMem(pData,64);
FreeMem(pSNR,32);
iRe:=ClosePort(rHandle);
ReadBtn.Enabled := True;
end;
procedure TDemoFrm.Timer1Timer(Sender: TObject);
Var
pData:Pchar;
idot :integer;
begin
DSPDataET.Text := Format('%-.8d',[StrToInt(DspDataET.Text)+1]);
pData:= Pchar(DSPDataET.Text );
idot := StrToInt(dotEt.Text);
iRe:= SC_LEDDSP( rHandle,pData,idot);
end;
procedure TDemoFrm.Button14Click(Sender: TObject);
begin
DspDataET.Text := '00000001';
Timer1.Enabled := True;
end;
procedure TDemoFrm.Button15Click(Sender: TObject);
begin
iRe := SC_Beep(rHandle,0,StrToInt(Edit2.Text));
sleep(100);
iRe := SC_Beep(rHandle,0,StrToInt(Edit2.Text));
end;
procedure TDemoFrm.Button16Click(Sender: TObject);
begin
iRe := SC_Beep(rHandle,0,25);
sleep(1000); //延时的时间要大于,SC_Beep 的时间,否则会造成只蜂鸣一声
iRe := SC_Beep(rHandle,0,25);
end;
procedure TDemoFrm.Button17Click(Sender: TObject);
var
pSNR:Pchar;
iMode:integer;
iSector:integer;
pKey:Pchar;
iBlock:integer;
pData:Pchar;
sKeyData:String;
begin
//-------------密钥修改流程-------------------------------------------------
//Mifare One 卡为16个扇区,每个扇区共4块,其中最后一个为密钥块。
//
// 000000000000 FF078069 FFFFFFFFFFFF
//密钥块由 KeyA 控制字 KeyB 构成,KeyA和KeyB各12位
// 密钥的修改流程:
// 1.先核对扇区密钥,正确后进行下步操作
// 2.读出扇区整块数据,正确后进行下步操作
// 3将前12位替换成新密钥,后面的数据无需改动,
// 在写回密钥块,写入则正确密钥修改成功
//----------------------------------------------------------------------
//核对卡密钥
iMode := 60;
iSector := StrToInt(SectorCBB.Text);
pKey := Pchar( KeyCBB.Text );
iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
if iRe <> 0 then
Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
//读卡密钥块的
GetMem(pData,64);
iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
iRe:= SC_RFRead(rHandle, iBlock, pData);
sKeyData := String(pData);
Memo1.Lines.Add(sKeyData);
sKeyData := Trim(NewKeyCBB.Text) +Copy(sKeyData,13,20);//将原来前12位密钥替换为新的12位密钥,后面的数据不变
iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
pData := Pchar(sKeyData);
iRe:= SC_RFWrite( rHandle,iBlock,pData);
if iRe <> 0 then
Begin Application.MessageBox('写入数据不正确......','系统提示-选择卡'
,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;
//读卡数据 进行 数据核对
GetMem(pData,64);
//iBlock := 1;
iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
iRe:= SC_RFRead(rHandle, iBlock, pData);
Memo1.Lines.Add(String(pData));
if iRe = 0 then
Begin
Application.MessageBox('更改密钥成功! ','系统提示-写卡',MB_OK+MB_ICONWARNING);
end else Begin
Application.MessageBox('数据核对不正确......','系统提示-数据核对',MB_OK+MB_ICONWARNING);
end;
FreeMem(pData,64);
FreeMem(pSNR,32);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -