我正在使用打印机,试图读取和写入非接触式卡。

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

如果我正确理解的话,对智能卡进行惰性化(读取和写入)的过程为:

  • 使用SCardEstablishContext()建立上下文
  • 使用SCardConnect()通过选定的读取器连接到卡
  • 使用SCardTransmit()与卡对话

  • 那是对的吗?

    点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。

    这些值(value)观有意义吗?

    我读了SCardTransmit api(SCardTransmit),并且我知道我必须使用协议(protocol)T = 0,这是否意味着我必须放置SCARD_PROTOCOL_T0才能工作?在那种情况下,为什么我会收到错误22?我做错了什么?
  • 如果要在块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/

    10-11 23:14