非接触型カードの読み取りと書き込みを試みて、プリンターに取り組んでいます。
これは私が使用しているハードウェアとソフトウェアのマニュアルです: 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.
これらの価値観は理にかなっていますか?
SCardTransmit api ( SCardTransmit ) を読んだところ、プロトコル T=0 を使用する必要があることがわかりました。それは、SCARD_PROTOCOL_T0 を機能させる必要があるということですか? その場合、エラー 22 が表示されるのはなぜですか? 私が間違っていることは何ですか?
ブロック 5 に書き込みたい場合は、同じプロセスに従います: SCardEstablishContext、SCardConnect、および SCardTransmit。pbSendBuffer を {(BYTE)0xFC, (BYTE)0xD0,(BYTE)0x05, (BYTE)0x00, 0x10}; に変更しましたが、データがどこにあるのか、SCardTransmit にどのパラメータを設定すればよいのかよくわかりません. この例を教えていただけますか?
どうもありがとうございました!