3

非接触型カードの読み取りと書き込みを試みて、プリンターに取り組んでいます。

これは私が使用しているハードウェアとソフトウェアのマニュアルです: manual contactless

私が正しく理解している場合、スマートカードを操作する (読み取りと書き込み) プロセスは次のとおりです。

  1. SCardEstablishContext() を使用してコンテキストを確立する
  2. SCardConnect() を使用して、選択したリーダーを介してカードに接続します
  3. 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.

    これらの価値観は理にかなっていますか?

    SCardTransmit api ( SCardTransmit ) を読んだところ、プロトコル T=0 を使用する必要があることがわかりました。それは、SCARD_PROTOCOL_T0 を機能させる必要があるということですか? その場合、エラー 22 が表示されるのはなぜですか? 私が間違っていることは何ですか?

  • ブロック 5 に書き込みたい場合は、同じプロセスに従います: SCardEstablishContext、SCardConnect、および SCardTransmit。pbSendBuffer を {(BYTE)0xFC, (BYTE)0xD0,(BYTE)0x05, (BYTE)0x00, 0x10}; に変更しましたが、データがどこにあるのか、SCardTransmit にどのパラメータを設定すればよいのかよくわかりません. この例を教えていただけますか?

どうもありがとうございました!

4

1 に答える 1

-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.
于 2015-08-06T12:45:30.653 に答える