delphi对IC卡编程初次者请教

zyp1804 2009-12-25 11:36:47
加精
各位高手:
小弟初次接触IC卡,只看了一些参考书,晕!想请教一些问题,谢谢!(用敏华接触式读卡器)
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
总之,对ic卡的知识极度匮乏,各位费心了!这好象和计算机的读写方式不一样吧
...全文
2980 86 打赏 收藏 转发到动态 举报
写回复
用AI写文章
86 条回复
切换为时间正序
请发表友善的回复…
发表回复
jc6666 2011-11-26
  • 打赏
  • 举报
回复
受益匪浅,我现在做一个ic卡程序,非常有指导价值
alsamsung 2011-04-15
  • 打赏
  • 举报
回复
这个帖子很有营养
r51book 2011-03-08
  • 打赏
  • 举报
回复
好难明,特别是关于存取控制的。
dj2437 2010-03-13
  • 打赏
  • 举报
回复
标记下先晚上看
mp_juan 2010-01-22
  • 打赏
  • 举报
回复
串口通信,建议LZ向厂家所要dll
zyp1804 2010-01-07
  • 打赏
  • 举报
回复
再次感激各位帮助,对IC操作有了一些进步,但还有一些问题,另行提出请再一次指教,现结贴.
FallenCity 2010-01-05
  • 打赏
  • 举报
回复

另外,机械工业出版社出了本书《DELPHI接口技术开发实例解析》,就专讲这个事情,里面的例子用的就是明华的读写器的。很详细,你那里能买到的话找来看看。

我有他的光盘代码资料,需要请联系QQ

4428芯片卡,计数值为0时,卡片就不能被写了,原因是操作不当,将卡片烧坏了哦!就这本书里讲了。

~。~!

强烈推荐你买这本书吧!
FallenCity 2010-01-05
  • 打赏
  • 举报
回复
一般IC卡修改密码过于频繁,或密码不对的情况下强行写卡,错误次数超过8次,卡就被锁死了,基本可以定位这张卡是费卡了!

换一张再测试吧。先用DEMO修改密码为FFFFFF再进行程序测试吧。

USB口的卡,注意它的卡状态检测函数,他同时起上电作用的。看一下开发手册对照一下。

我的读卡器函数是:st := IC_Status(icdev);

每进行读卡写卡修改密码前都强行上电,然后操作结束再下电,用的时候再上电,这样才会减少程序错误的。
wxsan 2010-01-05
  • 打赏
  • 举报
回复
路过,看看!
cmdream 2010-01-05
  • 打赏
  • 举报
回复
厂家有开发文档的
haochin 2010-01-03
  • 打赏
  • 举报
回复
接分咯
qlonsh 2010-01-01
  • 打赏
  • 举报
回复
你首先可以用串口工具进行读写看看,先把你的数据转成16进制的,然后根据产商提供的写命令规则把相关的数据写进卡里,再用读指令读取出来,通常来说,一个扇区能存储的数据量是有限的,所以会有多个扇区,你可以用个循环来把所有的数据都写进去啊,流程就这样,祝你早日成功
  • 打赏
  • 举报
回复
没有那么难,主要是读串口,厂商应给你开发协议。
zyp1804 2009-12-31
  • 打赏
  • 举报
回复
另外,再通过DEMO设卡的密码为'FFFFFF',在程序上测试(程序上设密码值为'B62307'),但却都通过,提示为'
CSC OK',为何?请教大佬
zyp1804 2009-12-31
  • 打赏
  • 举报
回复
感激各位的回复,尤其是FALLENCITY,您的程序我已收录,因为是初次接触IC卡的编程,只能先从基础开始,你的程序容以后仔细研究.再次感谢!先将几次的初步实验中遇到问题讨教各位大佬(明华USB接触式读卡器,几张4442卡).从明华随机DEMO中测得IC卡为未知型,通过供应商知是4442卡,再将随机的4442卡的程序检测确认.
但密码检验通不过,打开源程序,发现程序中设的密码值为'B62307',IC卡出厂的密码为'FFFFFF',再通过DEMO程序将IC卡密码改为'B72307',到程序中测试通过(中间好几次折腾),但现在出现读操作通过,写操作出错,并且提示'rsct ok count=0',打开源程序,是通过下列语句所得
counter:=0;
st:=rsct_4442(icdev,@counter);
这是否意味卡已锁死?
FallenCity 2009-12-30
  • 打赏
  • 举报
回复
搞懂几个字符串函数基本就能看懂了!
FallenCity 2009-12-30
  • 打赏
  • 举报
回复
我也是第一次写IC卡的,本着交流的目的,全部源代码贴出,给您做参考,在我设备上,D7环境下全部调试通过。

所有功能实现了但程序能其实可以做的更精简,有些可以写成函数精炼代码,时间紧程序逻辑上就没下台多功夫,还请同行指正!
a542309593 2009-12-30
  • 打赏
  • 举报
回复
我看不懂啊,哈哈
a542309593 2009-12-30
  • 打赏
  • 举报
回复
学习看
FallenCity 2009-12-30
  • 打赏
  • 举报
回复

// 写卡
procedure TPCH_Write_IC_Card4428.btn_WriteCardClick(Sender: TObject);
var CardMain_temp:string[6];
CardMainNo:string[6];
CardFirstNo:string[4];
CardEndNo:string[2];
M_WriteCardNum:string[22];
A_WriteCardNum:string[24];
begin
CardMain_temp:=IntToStr(StrToInt(edt_CardMainNo.Text)+ClickNum);
if Length(CardMain_temp)=1 then
CardMainNo:='00000'+string(CardMain_temp)
else
begin
if Length(CardMain_temp)=2 then
CardMainNo:='0000'+string(CardMain_temp)
else
begin
if Length(CardMain_temp)=3 then
CardMainNo:='000'+string(CardMain_temp)
else
begin
if Length(CardMain_temp)=4 then
CardMainNo:='00'+string(CardMain_temp)
else
begin
if Length(CardMain_temp)=5 then
CardMainNo:='0'+string(CardMain_temp)
else
CardMainNo:=string(CardMain_temp);
end;
end;
end;
end;

CardFirstNo:=Copy(string(edt_CardFirstNo.Text),1,2)+copy(edt_CardFirstNo.Text,3,2);
CardEndNo:=Copy(string(edt_AttachCardEndNo.Text),1,1)+copy(edt_AttachCardEndNo.Text,2,1);

MainCardNum:=string(CardFirstNo)+string(CardMainNo);


M_WriteCardNum:=Copy(MainCardNum,1,2)+'YN'+copy(MainCardNum,5,10)+' '+
Copy(MainCardNum,1,2)+'YN'+copy(MainCardNum,5,10);
A_WriteCardNum:=string(M_WriteCardNum)+string(CardEndNo);

inbuff:=string(edt_CardPWD.Text); //核对密码
st := IC_CheckPass_4428hex(icdev,pchar(inbuff));
If st <> 0 Then begin
lst_ReadWriteInfo.Items.Add('密码校验失败!');
Exit;
End;
lst_ReadWriteInfo.Items.Add('密码校验成功!');

if rb_IsWriteMainCard.Checked then
begin

RW_MainCardNum:='3'+copy(MainCardNum,1,1)+'3'+copy(MainCardNum,2,1)+'59'+'4e'+'3'
+copy(MainCardNum,5,1)+'3'+copy(MainCardNum,6,1)+'3'
+copy(MainCardNum,7,1)+'3'+copy(MainCardNum,8,1)+'3'+copy(MainCardNum,9,1)+'3'
+copy(MainCardNum,10,1);

RW2_MainCardNum:=string(RW_MainCardNum)+'20'+'20'+string(RW_MainCardNum);
inbuff:=RW2_MainCardNum;

st := IC_Write_hex(icdev, StrToInt(edt_WritePosition_Byte.Text),22,pchar(inbuff)); //写主卡数据
st := IC_Status(icdev);
If st <> 0 Then begin
Windows.Beep(300,600);
ShowMessage('写卡失败,请确认是否正确插入卡,或重新插卡!');
lst_ReadWriteInfo.Items.Add('>>>>>>>>>>>>>>>>>>>>写入失败的主卡号为:'+string(M_WriteCardNum));
Exit;
End;
lst_ReadWriteInfo.Items.Add('成功写入主卡号:'+string(M_WriteCardNum));
ClickNum:=ClickNum+1;
edt_WriteCardNum.Text:=string(M_WriteCardNum);
end
else
begin
if rb_IsWriteAttachCard.Checked then
begin
RW_MainCardNum:='3'+copy(MainCardNum,1,1)+'3'+copy(MainCardNum,2,1)+'59'+'4e'+'3'
+copy(MainCardNum,5,1)+'3'+copy(MainCardNum,6,1)+'3'
+copy(MainCardNum,7,1)+'3'+copy(MainCardNum,8,1)+'3'+copy(MainCardNum,9,1)+'3'
+copy(MainCardNum,10,1);

RW2_MainCardNum:=string(RW_MainCardNum)+'20'+'20'+string(RW_MainCardNum);

RW2_AttachCardNum:=RW2_MainCardNum+'3'+copy(CardEndNo,1,1)+'3'+copy(CardEndNo,2,1);;
inbuff:=RW2_AttachCardNum;
st := IC_Write_hex(icdev, StrToInt(edt_WritePosition_Byte.Text),24,pchar(inbuff)); // 写副卡数据
If st <> 0 Then
begin
Windows.Beep(300,600);
ShowMessage('写卡失败,请确认是否正确插入卡,或重新插卡!');
lst_ReadWriteInfo.Items.Add('>>>>>>>>>>>>>>>>>写入失败的副卡号为:'+string(A_WriteCardNum));
Exit;
end;
lst_ReadWriteInfo.Items.Add('成功写入副卡号:'+string(A_WriteCardNum));
ClickNum:=ClickNum+1;
edt_WriteCardNum.Text:=string(A_WriteCardNum);
End;

end;
end;


// 读卡号
procedure TPCH_Write_IC_Card4428.btn_ReadCardClick(Sender: TObject);
var READ_MainCardNum:string[28];
READ_AttachCardNum:string[32];
begin
if rb_IsWriteMainCard.Checked then
begin
getmem(outbuff,60);
st := IC_Read_hex(icdev, StrToInt(edt_WritePosition_Byte.Text),22,outbuff); //读主卡卡号
READ_MainCardNum:=copy(outbuff,2,1)+copy(outbuff,4,1)+copy(outbuff,5,2)+copy(outbuff,7,2)
+copy(outbuff,10,1)+copy(outbuff,12,1)+copy(outbuff,14,1)+copy(outbuff,16,1)
+copy(outbuff,18,1)+copy(outbuff,20,1)+' '+copy(outbuff,26,1)+copy(outbuff,26,1)
+copy(outbuff,29,2)+copy(outbuff,31,2)+copy(outbuff,34,1)+copy(outbuff,36,1)
+copy(outbuff,38,1)+copy(outbuff,40,1)+copy(outbuff,42,1)+copy(outbuff,44,1);
If st <> 0 Then
begin
Windows.Beep(300,600);
ShowMessage('读主卡卡号失败,请确认是否正确插入卡,或重新插卡!');
lst_ReadWriteInfo.Items.Add('读主卡卡号失败!');
freemem(outbuff);
Exit;
end
else
begin
lst_ReadWriteInfo.Items.Add('读主卡成功!');
outbuff[44]:=chr(0);
lst_ReadWriteInfo.Items.Add('>>>>>>>>>>>>数据为:'+READ_MainCardNum);
end;
end;

if rb_IsWriteAttachCard.Checked then
begin
getmem(outbuff,60);
st := IC_Read_hex(icdev, StrToInt(edt_WritePosition_Byte.Text),24,outbuff); //读副卡卡号
READ_AttachCardNum:=copy(outbuff,2,1)+copy(outbuff,4,1)+copy(outbuff,5,2)+copy(outbuff,7,2)
+copy(outbuff,10,1)+copy(outbuff,12,1)+copy(outbuff,14,1)+copy(outbuff,16,1)
+copy(outbuff,18,1)+copy(outbuff,20,1)+' '+copy(outbuff,26,1)+copy(outbuff,26,1)
+copy(outbuff,29,2)+copy(outbuff,31,2)+copy(outbuff,34,1)+copy(outbuff,36,1)
+copy(outbuff,38,1)+copy(outbuff,40,1)+copy(outbuff,42,1)+copy(outbuff,44,1)
+copy(outbuff,46,1)+copy(outbuff,48,1);
If st <> 0 Then
begin
Windows.Beep(300,600);
ShowMessage('读副卡卡号失败,请确认是否正确插入卡,或重新插卡!');
lst_ReadWriteInfo.Items.Add('读副卡卡号失败!');
freemem(outbuff);
Exit;
end
else
begin
lst_ReadWriteInfo.Items.Add('读副卡成功!');
outbuff[48]:=chr(0);
lst_ReadWriteInfo.Items.Add('>>>>>>>>>>>>数据为:'+READ_AttachCardNum);
end;
end;
end;

//修改密码
procedure TPCH_Write_IC_Card4428.btn_ChangeCardPWDClick(Sender: TObject);
begin
inbuff:=string(edt_CardPWD.Text);
st := IC_ChangePass_4428hex(icdev,pchar(inbuff)); //修改密码
If st <> 0 Then begin
lst_ReadWriteInfo.Items.Add('修改密码失败!');
Exit;
End;
lst_ReadWriteInfo.Items.Add('修改密码成功!');
lst_ReadWriteInfo.Items.Add('卡密码改为'+string(edt_CardPWD.Text));


lst_ReadWriteInfo.Items.Add('读写设备测试通过!');
end;


// 清除记录
procedure TPCH_Write_IC_Card4428.btn_ClearListBoxRecClick(Sender: TObject);
begin
lst_ReadWriteInfo.Items.Clear;
end;
// 仅关闭串口
procedure TPCH_Write_IC_Card4428.btn_ClosePortClick(Sender: TObject);
begin
if icdev>0 then
begin
st := IC_ExitComm(icdev); //关闭串口
icdev:=0;
PCH_Write_IC_Card4428.btn_VerifyCardPwd.Enabled:=False;
PCH_Write_IC_Card4428.btn_WriteCard.Enabled:=False;
PCH_Write_IC_Card4428.btn_ReadCard.Enabled:=False;
PCH_Write_IC_Card4428.btn_ChangeCardPWD.Enabled:=False;
PCH_Write_IC_Card4428.btn_ClosePort.Enabled:=False;
lst_ReadWriteInfo.Items.Add('关闭串口成功!');
end;
end;

//退出,关闭串口
procedure TPCH_Write_IC_Card4428.btn_ExitClick(Sender: TObject);
begin
close;
if icdev>0 then
begin
st := IC_ExitComm(icdev); //关闭串口
icdev:=0;
end;
freemem(outbuff);
end;

procedure TPCH_Write_IC_Card4428.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if icdev>0 then
begin
st := IC_ExitComm(icdev); //关闭串口
icdev:=0;
end;
freemem(outbuff);
Action:=caFree;
end;

procedure TPCH_Write_IC_Card4428.edt_CardMainNoChange(Sender: TObject);
begin
ClickNum:=0;
end;

procedure TPCH_Write_IC_Card4428.edt_AttachCardEndNoChange(
Sender: TObject);
begin
ClickNum:=0;
end;

end.


加载更多回复(63)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧