【发布时间】:2012-02-26 05:10:23
【问题描述】:
我正在使用Microsoft SmartCard APIs 开发 SCM 非接触式 RFID 读卡器。
我所理解的与智能卡交互的通常过程是:
1. 使用 SCardEstablishContext() 建立上下文
2. 使用 SCardListReaders() 列出所有连接到系统的阅读器
3. 选择读卡器,等待卡插入。
4. 一旦检测到卡片,函数 SCardGetStatusChange() 就会返回。
5. 使用 SCardConnect() 通过选定的读卡器连接到卡
6. 使用 SCardTransmit() 与卡片对话
直到 5 的所有步骤都运行良好,这意味着我得到了正确的卡句柄。可以通过发出 SCardStatus() 函数来进一步验证卡,该函数返回协商的协议和卡的 ATR,这也是正确的。但是当我尝试使用 SCardTransmit() 发送任何 APDU 命令时,它会返回一个错误(错误代码 14,我猜是 SCARD_E_CANT_DISPOSE)。
我不知道出了什么问题或缺少什么。我尝试了不同的 APDU,例如通过发出 {0xFF, 0xCA, 0x00, 0x00, 0x00} 来读取卡 UID 的非常基本的 APDU。我使用 SCM TestResMan 调试工具验证了这个 APDU,它返回了卡的正确 UID。我正在使用 MiFARE 1k 卡和 SCM 非接触式 SCL011 读卡器。
请在下面找到 SCardTransmit() 代码 sn-p(之前的所有函数都返回成功)。
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 = 0x05;
retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
sendbufferLen, NULL, receivebuffer,
&receivebufferLen);
如果有人有任何线索或指示,请告诉我...
蒂亚!!
【问题讨论】:
标签: smartcard rfid smartcard-reader