2013-03-28 128 views
0

嗨,大家我還有其他問題給你:)與協議t1的智能卡通信

我想與協議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(無效插件參數)。

我的問題是:

1-爲什麼我收到此回覆?

2-我是否必須使用pts命令更改協議如果是,爲什麼? (該卡只支持t1)

3-協議t = 1幀必須是序言字段+信息字段+結尾字段。但我不添加序言和epilogue字節sendbuff。是否有必要將它們添加到使用Windows API的sendbuff?

謝謝..

回答

0

我已經解決了,因爲參數p1和p2的問題,它的。儘管收到'無效參數',我認爲參數是正確的。所以我在其他地方尋找錯誤。

對於選擇文件,參數必須是0x02和0x0C。

編輯:afer guidot的評論我意識到我沒有使用這些參數來選擇主文件。 (嘗試過,但後來改變)要選擇MF下的EF:

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

感謝guidot ..

+0

其實P1/P2等於零也是正確的(在意義上符合標準的)聲明任意DF/EF被選中,但是一如既往,沒有牌必須支持它。然而,該命令會產生一個響應(與P2 = 0xC相反),並且由於您沒有提供LE字節,因此該不匹配可能會引發錯誤消息。 6A86不會是我的第一個猜測,但也有一些理由。 – guidot 2013-03-29 11:11:13