1

現在、ISO 15693 周辺 RFID カード (TI Tag-it HF) から 1 つのセキュリティ ステータス/ブロックを読み取る既存の SCardTransmit() コマンド (C#) を、64 ブロックすべてのセキュリティ ステータスを取得するコマンドに変更しようとしています。カード。既存のコードは次のとおりです。

Byte[] sendHeader = { 0xFF, 0x30, 0x00, 0x03, 0x05, 0x01, 0x00, 0x00, 0x00, Convert.ToByte(blockNum), 0x01 };

Byte[] sendBuffer = new Byte[255]; //Send Buffer in SCardTransmit
int sendbufferlen;                 //Send Buffer length in SCardTransmit

SmartCardData pack = new SmartCardData();

sendHeader.CopyTo(sendBuffer, 0);
sendbufferlen = Convert.ToByte(sendHeader.Length);

SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendbufferlen);

私の理解では、Convert.ToByte(blockNum) の前のバイトは、セキュリティ ステータスを取得するコマンドを表し、その後に問題のブロックと、読み取るブロックの数が続きます。セキュリティ ステータスの読み取りに関して私が見た唯一の参照は、「非接触型スマート カード リーダー開発ガイド」のセクション 10.3.4 にあります。

注: SmartCardTransmit は、正しいカード ハンドルとその他の必要なパラメーターを使用して SCardTransmit を呼び出します。セキュリティ ブロック 0 ~ 63 の要求を表す送信ヘッダーの形式に興味があります。

4

2 に答える 2

2

残念ながら、それは不可能です。HID/Omnikey スマートカード リーダーの Get Security Status コマンドは、各コマンドで 1 つのブロックのセキュリティ ステータスしか取得できません。したがってLe、提供しようとするバイトに関係なく、リーダーは常に で指定したブロックのセキュリティ ステータスのみを返しますblockNum

したがって、すべてのブロックのセキュリティ ステータスを取得する唯一の方法は、すべてのブロックを繰り返し処理し、それぞれに対してコマンドを発行することです。

bool moreBlocks = true;
int blockNum = 0;
while (moreBlocks) {
    byte[] sendBuffer = {
        0xFF, 0x30, 0x00, 0x03,
        0x05,
        0x01,
        0x00, 0x00,
        (byte)((blockNum>>8) & 0xFF), (byte)(blockNum & 0xFF),
        0x00
    };
    SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendBuffer.Length);
    moreBlocks = check_if_rxBuf_ends_with_sw9000(rxBuf);
    ++blockNum;
}
于 2013-12-20T13:07:07.130 に答える
0

このドキュメント: リンクから 、タグは ISO15693 標準に準拠しているようです。提供されたドキュメントから、必要なコマンドは 59 ページにあるようです。コマンドの説明から、0x01 はバージョンであり、次の 2 バイト (0x00 と 0x00) はブロックごとの読み取りを意味します。Convert.ToByte() の前のバイトは、開始ブロック (0x00) の MSB になります。Convert.ToByte() は開始ブロックの LSB です。次はコマンド説明のLe(読み込むブロック数)です。

于 2013-12-20T11:37:36.460 に答える