Microsoft SmartCard APIを使用して SCM 非接触 RFID カード リーダーに取り組んでいます。
私が理解したところでは、スマート カードを操作する通常のプロセスは次の
とおり
です
。挿入する必要があります。
4. カードが検出されると、関数 SCardGetStatusChange() が戻ります。
5. SCardConnect() を使用して、選択したリーダーを介してカードに接続します
6. SCardTransmit() を使用してカードに話しかけます
5 までのすべてのステップは正常に機能しています。つまり、正しいカード ハンドルを取得したことを意味します。ネゴシエートされたプロトコルとカードの ATR を返す SCardStatus() 関数を発行することで、カードをさらに検証できます。これも正しいものです。しかし、SCardTransmit() を使用して APDU コマンドを送信しようとすると、エラーが返されます (エラー コード 14、SCARD_E_CANT_DISPOSE と推測されます)。
何がうまくいかないのか、何が欠けているのかわかりません。{0xFF、0xCA、0x00、0x00、0x00} を発行してカード UID を読み取る非常に基本的な APDU など、さまざまな APDU を試しました。SCM TestResMan デバッグ ツールを使用してこの APDU を検証したところ、カードの正しい UID が返されました。MiFARE 1k カードと SCM コンタクトレス SCL011 リーダーを使用しています。
以下の SCardTransmit() コード スニペットを見つけてください (以前の関数はすべて成功を返しました)。
SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;
SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;
byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;
sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = 0x05;
retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
sendbufferLen, NULL, receivebuffer,
&receivebufferLen);
誰か手がかりや指針があれば教えてください...
TIA !!