小编S.K*_*.K.的帖子

SCardTransmit()总是返回错误

我正在使用Microsoft SmartCard API开发SCM非接触式RFID读卡器。

据我所知,惯用智能卡的通常过程是:
1.使用SCardEstablishContext()建立上下文
2. 使用SCardListReaders()列出连接到系统的所有读取器
3.选择一个读取器并等待卡插入其中。
4.一旦检测到卡,函数SCardGetStatusChange()将返回。
5.使用SCardConnect()通过选定的读取器连接至卡。6
.使用SCardTransmit()与卡进行通话

直到5的所有步骤都可以正常工作,这意味着我拥有正确的卡手柄。可以通过发出返回协商协议的SCardStatus()函数和卡的ATR来进一步验证卡。但是,当我尝试使用SCardTransmit()发送任何APDU命令时,它将返回错误(错误代码14,我猜是SCARD_E_CANT_DISPOSE)。

我不知道出什么问题或缺少什么。我通过发出{0xFF,0xCA,0x00、0x00、0x00}尝试了不同的APDU,例如非常基本的APDU来读取卡UID。我使用SCM TestResMan调试工具验证了此APDU,它向我返回了卡的正确UID。我正在使用MiFARE 1k卡和SCM非接触式SCL011读卡器。

请在下面找到SCardTransmit()代码片段(所有先前的函数返回成功)。

SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;

SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;

byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;

sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = …
Run Code Online (Sandbox Code Playgroud)

rfid smartcard smartcard-reader

2
推荐指数
1
解决办法
7786
查看次数

标签 统计

rfid ×1

smartcard ×1

smartcard-reader ×1