c++ - SCardTransmit,如何读写智能卡

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

我正在使用打印机,尝试读写非接触式卡片。

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

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

  1. 使用 SCardEstablishContext() 建立上下文
  2. 使用 SCardConnect() 通过选定的读卡器连接到卡
  3. 使用 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/

相关文章:

c# - 与人机接口(interface)设备 (HID) 通信的 VBA 代码

c++ - 奇怪的数字转换 C++

c++ - 如何访问返回 vector 中的系数

java - 从字节数组末尾过滤数据(智能卡响应)

smartcard - 为什么我在尝试更改 JavaCard key 时收到 6A80、6A84 和 6A88?

hardware - 我可以在 RFID 标签上写入或修改数据吗?

java - 如何创建 RFID 应用程序以读取 HID OMNIKEY 5427 CK

c++ - 为什么 `decltype(static_cast<T>(...))` 并不总是 `T` ?

c++ - 检查字符串是否相同C++

cryptography - DESKey 是否保留无效的奇偶校验位?