SCardTransmit,如何读写智能卡

时间:2014-07-03 18:02:09

标签: c++ smartcard rfid smartcard-reader contactless-smartcard

我在打印机上工作,试图读写非接触式卡。

这是我使用的硬件和软件的手册: manual contactless

如果我理解正确的话,使用智能卡(读取和写入)的过程是:

  1. 使用SCardEstablishContext()
  2. 建立上下文
  3. 使用SCardConnect()
  4. 通过选定的阅读器连接到卡
  5. 使用SCardTransmit()
  6. 与卡片对话

    这是对的吗?

    第1点和第2点工作正常并返回0(SCARD_S_SUCCESS),但我的SCardTransmit有问题。

    • 例如,如果我想阅读第5块,这就是我使用的代码:

       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),我知道我必须使用协议T = 0,这是否意味着我必须将SCARD_PROTOCOL_T0用于工作?在那种情况下,为什么我收到错误22?我做错了什么?

    • 如果我想在第5块写,我遵循相同的过程:SCardEstablishContext,SCardConnect和SCardTransmit。我将pbSendBuffer更改为:{(BYTE)0xFC,(BYTE)0xD0,(BYTE)0x05,(BYTE)0x00,0x10};但是我不太清楚数据在哪里,以及我应该放哪些参数在SCardTransmit上。你能举个例子吗?

    非常感谢!

1 个答案:

答案 0 :(得分:-1)

`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.