1

我正在尝试将当前从 ISO 15693 附近 RFID 卡 (TI Tag-it HF) 读取一个安全状态/块的现有 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 智能卡读卡器的获取安全状态命令只能通过每个命令检索一个块的安全状态。因此,无论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 是版本,以下两个字节(0x00 和 0x00)表示按块读取。Convert.ToByte() 之前的字节接缝为起始块的 MSB (0x00)。Convert.ToByte() 是起始块的 LSB。接下来是命令描述中的Le(要读取的块数)。

于 2013-12-20T11:37:36.460 回答