智能读卡器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiven/article/details/4747084

先放着,等项目完整理

读写流程

一、连接设备
1、建立资源管理器的上下文
if(已有建立上下文)
SCardDisconnect(hCard, SCARD_UNPOWER_CARD);//先注销
SCardEstablishContext(SCARD_SCOPE_USER, 0/NULL, 0/NULL, ref hContext);
2、获得系统中安装的读卡器列表
SCardListReaders(hContext, null, null, ref pcchReaders)
SCardListReaders(hContext, null, ReadersList, ref pcchReaders)//ReadersList[]设备名称
二、读取智能卡
1、建立卡连接
if(已有连接)
SCardDisconnect(hCard, SCARD_UNPOWER_CARD);//关闭已有连接
SCardDisconnect(hCard, SCARD_UNPOWER_CARD)
2、初始化状态
SCardStatus(hCard, cbReader, ref ReaderLen, ref dwState, ref dwActProtocol, ref ATRVal[0],

ref ATRLen)
3、发送命名
SCardTransmit(hCard, ref ioRequest, ref SendBuff[0], SendLen, ref ioRequest, ref RecvBuff

[0], ref RecvLen)

 

 

//首先,建立资源管理器的上下文
 SCARDCONTEXT hSC;
 LONG lReturn;
 lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
 if ( lReturn!=SCARD_S_SUCCESS )
   printf("Failed SCardEstablishContext/n");
//获得系统中安装的读卡器列表
//下面是获得系统中安装的读卡器列表的代码:
 char mszReaders[1024];
 LPTSTR pReader, pReaderName[2];
DWORD dwLen=sizeof(mzsReaders);
int nReaders=0;
lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);
if ( lReturn==SCARD_S_SUCCESS )
{
pReader = (LPTSTR)pmszReaders;
 while (*pReader !='/0' )
{
if ( nReaders<2 ) //使用系统中前2个读卡器
pReaderName[nReaders++]=pReader;
printf("Reader: %S/n", pReader ); //下一个读卡器名 pReader = pReader + strlen(pReader) + 1; }
 }
//与读卡器(智能卡)连接
SCARDHANDLE hCardHandle[2];
 DWORD dwAP;
lReturn = SCardConnect( hContext, pReaderName[0], SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP );
if ( lReturn!=SCARD_S_SUCCESS )
{
printf("Failed SCardConnect/n");
exit(1);
 }
 LONG SCardConnect( SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol );
/*
各个参数的含义:
(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
(5)phCard:输出类型;与智能卡连接的句柄。
(6)PdwActiveProtocol:输出类型;实际使用的协议。
*/

 

展开阅读全文

读卡器读卡器读卡器读卡器读卡器读卡器读卡器读卡器读卡器读卡器

06-15

读卡器提供的接口函数中有如下两个,它们的功能是把密码装到读卡器中rnrnint rf_load_key(int icdev,unsigned char _Mode,unsigned char _SecNr,unsigned char *_NKey);rnrn功 能:将密码装入读写模块RAM中rnrn参 数:icdev:通讯设备标识符rnrn _Mode:装入密码模式,同密码验证模式mode_authrnrn _SecNr:扇区号(M1卡:0~15; ML卡:0)rnrn _Nkey:写入读写器中的卡密码rnrn返 回:成功则返回 0rnrn 例://key A and key Brnrn unsigned char tk[6]=0xa0,0xa1,0xa2,0xa3,0xa4,0xa5;rnrn /* 装入1扇区的0套A密码 */rnrn if((rf_load_key(icdev,0,1,tk))!=0)rnrn rnrn printf("Load key error!");rnrn rf_exit(icdev)rnrn exit(1);rnrn rn---------------------------------------------------------------rnrnrnint rf_load_key_hex(int icdev,unsigned char _Mode,unsigned char _SecNr,char *_NKey);rnrn功 能:向读写器中装入十六进制密码rnrn参 数:icdev:通讯设备标识符rnrn _Mode:密码验证模式rnrn _SecNr:扇区号(0~15)rnrn _Nkey:写入读写器中的卡密码rnrn返 回:成功则返回 0rnrn 例:/* 装入1扇区的A密码|0套 */rnrn if((rf_load_key_Hex(icdev,0,1,"a0a1a2a3a4a5"))!=0)rnrn printf("Load key error!");rnrn rf_exit(icdev);rnrn exit(1);rnrn rnrn现在知道卡密码是12个F,用厂商自带的演示程序读出的,不知是16进制还是字符串,现在我要调用这两个函数中的一个,问他们在C#中应该怎么声明,参数类型应该转变成什么样的.最关心最后一个参数.因为前三个我试的应该没问题rnrn我现在是这样做的rn声明时把最后一个参数声明成ref byte[]型的.rn然后调用时这样的rnbyte[] bt = new byte[]0xf,0xf........一共12个rnrnrf_load_key_hex(...... ,bt);rn可是不好用...返回值不为0,期待高手.................................... 论坛

读卡器的问题

12-22

[code=VB] icdev = auto_init(0, 2400)rnIf icdev < 0 Thenrn If MsgBox("设备连接错误,退出后重试", 52, "提示信息:") = vbYes Thenrn st = ic_exit(icdev)rn Elsern End Ifrn Elsern List1.AddItem ("设备连接 OK")rnend if[/code]rnrn[color=#FF0000]这是第二部分点击读卡[/color]rn'''''''''''''''''''''''''''''''''''''rn[code=VB]10: Dim sssrn sss = get_status(icdev, status)rn If status = 0 Thenrn st = ic_exit(icdev)rn GoTo 10rn Elsern st = chk_4442(icdev)rn If st <> 0 Then '正确rn If MsgBox("未指定卡型,请插入指定卡型,点击重试", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn Exit Subrn End Ifrn Elsern 'password(0) = &HB6rn 'password(1) = &H23rn 'password(2) = &H7rn oldpass = "09011f"rn st = asc_hex(oldpass, password(0), 3) '十六进制转换rn If st < 0 Thenrn If MsgBox("插卡错误,请插入指定卡型,点击重试", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn Exit Subrn End Ifrn Elsern st = csc_4442(icdev, 3, password(0))rn If st < 0 Then '卡片指定的密码错误rn If MsgBox("卡指定密码错误,请插入指定的卡,点击重试", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn Exit Subrn End Ifrn Elsern '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$没调试,计数为 0¥¥¥¥¥¥¥¥¥¥¥¥¥¥rn st = rsct_4442(icdev, counter)rnIf st < 0 Thenrn If MsgBox("此卡无效,点击重试", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn Exit Subrn End IfrnElsernIf Str(counter) <= 0 Thenrn If MsgBox("此卡无效,点击重试", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn Exit Subrn End Ifrn ElsernEnd Ifrn '################################ ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥rn ' List1.AddItem ("密码正确")rn a = 40rn a1 = 6rn st = srd_4442(icdev, a, a1, Data1)rn If st < 0 Thenrn If MsgBox("卡读取错误,请仔细确认后点击重试1", 21, "提示信息:") = vbRetry Thenrn GoTo 10rn Elsern st = ic_exit(icdev)rn End Ifrn Elsern kahao.Caption = Data1rn End Ifrn st = ic_exit(icdev)rn Exit Subrn End Ifrn End Ifrn End Ifrn ' List1.AddItem ("串口关闭 OK")rn End Ifrn End Ifrnrn st = ic_exit(icdev)rn GoTo 10rn Exit Sub[/code]rnrnrnrnrn我只能在第一次读出卡里的数据,第二次则不行,程序完全没响应,有做过读卡程序的朋友吗,能指点一下吗,rn还有第一部分如果读取错误必须把整个vb退出才能重新调试,说是串口被占用,rn忘高手指点· 论坛

没有更多推荐了,返回首页