与协议t1的智能卡通信

时间:2013-03-28 10:31:46

标签: c# communication smartcard

大家好,我还有另外一个问题:)

我想通过协议t = 1来传达智能卡。我正在使用Windows智能卡api(winscard.dll)和C#。我有

SCardEstablishContext(),SCardListReaders(),SCardConnect(),SCardStatus(),SCardTransmit(),SCardDisconnect(),SCardReleaseContext()函数用于传输数据。

我想用下面的代码

选择主文件(mf)
SCARD_IO_REQUEST sendreq,recvreq;

byte[] sendbuff = { 0x00, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 };

sendreq.protocol = SCARD_PROTOCOL_T1;
sendreq.pciLength = 8;
recvreq.protocol = SCARD_PROTOCOL_T1;
recvreq.pciLength = 8;

byte[] RecvBuff = new byte[258];
int recvbufflen = 2;

SCardTransmit(hCard, ref sendreq, ref sendbuff[0], sendbuff.Length, ref recvreq, ref RecvBuff[0], ref recvbufflen);

成功任务的响应必须为9000但我收到6A86(ins参数无效)。

我的问题是:

1-为什么我收到此回复?

2-如果是,为什么我必须用pts命令更改协议? (该卡仅支持t1)

3-协议t = 1帧必须是序言字段+信息字段+结尾字段。但我没有将序言和结尾字节添加到sendbuff。是否有必要在使用windows api时将它们添加到sendbuff?

谢谢..

1 个答案:

答案 0 :(得分:0)

由于参数p1和p2,我已经解决了问题。尽管收到“无效参数”,我认为参数是正确的。所以我在其他地方搜索错误。

选择文件时,参数必须为0x02和0x0C。

编辑:在guidot的评论之后,我意识到我没有使用这些参数来选择主文件。 (试过但稍后改变)要在MF下选择EF:

byte[] sendbuff = {0x00, 0xA4, 0x02, 0x0C, 0x02, id1, id2}

感谢guidot ..