我正在使用打印机,尝试读写非接触式卡片。
这是我使用的硬件和软件的手册: manual contactless
如果我理解正确的话,与智能卡交互(读取和写入)的过程是:
- 使用 SCardEstablishContext() 建立上下文
- 使用 SCardConnect() 通过选定的读卡器连接到卡
- 使用 SCardTransmit() 与卡片对话
对吗?
第 1 点和第 2 点工作正常并返回 0 (SCARD_S_SUCCESS),但我在使用 SCardTransmit 时遇到问题。
例如,如果我想阅读第 5 block ,这是我使用的代码:
SCARD_IO_REQUEST pioRecvPci; DWORD dwActiveProtocol, dwSendLength, dwRecvLength; BYTE pbRecvBuffer[16]; BYTE pbSendBuffer[] = {(BYTE)0xFC, (BYTE)0xB0,(BYTE)0x05, (BYTE)0x00, (BYTE)0x00}; dwSendLength = sizeof(pbSendBuffer); dwRecvLength = sizeof(pbRecvBuffer); SCARD_IO_REQUEST pioSendPci; pioSendPci.dwProtocol=SCARD_PROTOCOL_T0; pioSendPci.cbPciLength= sizeof(pioSendPci); ret = SCardTransmit(cardHandle, // SCard API &pioSendPci, pbSendBuffer, dwSendLength, NULL, pbRecvBuffer, &dwRecvLength);
它返回错误代码 22。
如果我将 SCARD_PROTOCOL_T0 更改为 SCARD_PROTOCOL_T1,它似乎可以工作(我不知道 pbRecvBuffer 值是否正确):pbRecvBuffer 有 2 个字节,其值:6e 00 和 ret = 0。
这些价值观有意义吗?
我阅读了 SCardTransmit api ( SCardTransmit ),我知道我必须使用协议(protocol) T=0,这是否意味着我必须让 SCARD_PROTOCOL_T0 工作?在那种情况下,为什么我会收到错误 22?我做错了什么?
如果我想在 block 5 中写入,我遵循相同的过程:SCardEstablishContext、SCardConnect 和 SCardTransmit。我将 pbSendBuffer 更改为:{(BYTE)0xFC, (BYTE)0xD0,(BYTE)0x05, (BYTE)0x00, 0x10};,但我不太了解数据在哪里,以及我应该在 SCardTransmit 上放置哪些参数.你能举个例子吗?
非常感谢!
最佳答案
`enter code here` we must check protocol using switch case and transmit like :
switch ( m_dwAP )
{
case SCARD_PROTOCOL_T0:
dwErrorFlags = SCardTransmit(this->m_hCardHandle,
SCARD_PCI_T0,
rgbIN,
bIN,
NULL,
rgbOUTTra,
&uwBufferLen);
break;
case SCARD_PROTOCOL_T1:
dwErrorFlags = SCardTransmit(this->m_hCardHandle,
SCARD_PCI_T1,
rgbIN,
bIN,
NULL,
rgbOUTTra,
&uwBufferLen);
break;
}
here m_dwAP is active protocol.
关于c++ - SCardTransmit,如何读写智能卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24560471/