为了完成任务,我直接询问了 NXP 支持。所以他们建议我从他们知名的 RFID 硬件合作伙伴中进行选择。HID 和 FEIG。
带有 pcsc-sharp 的 HID Ominkey
首先,我使用 HID Omnikey 5022 阅读器和来自 Github 的这个 PC/SC .Net Lib成功地实现了读取内存,这意味着对 winscard.dll 的包装。这种组合效果很好,因为它内置了对卡片检测等事件的支持。唯一不方便的是它只支持读取单个块(4 个字节),所以我不得不编写一种如下的内存解析器:
private const Byte RADIOID_BLOCK_START = 0x03;
private const Byte RADIOID_BLOCK_START_OFFSET = 0x01;
private const Byte RADIOID_LENGHT = 0x08;
private const Byte MACADDRESS_BLOCK_START = 0x07;
private const Byte MACADDRESS_BLOCK_START_OFFSET = 0x00;
private const Byte MACADDRESS_LENGHT = 0x11;
private const String MACADDRESS_EMPTYVALUE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
private String GetRadioId(IIsoReader isoReader)
{
Byte[] radioId = ReadMultipleBlock(isoReader, RADIOID_BLOCK_START, RADIOID_BLOCK_START_OFFSET,RADIOID_LENGHT);
String strData = Encoding.UTF8.GetString(radioId, 0, radioId.Length);
Debug.WriteLine($"RadioId Data :{strData}");
return strData;
}
private String GetMacAdress(IIsoReader isoReader)
{
Byte[] data = ReadMultipleBlock(isoReader,MACADDRESS_BLOCK_START, MACADDRESS_BLOCK_START_OFFSET, MACADDRESS_LENGHT);
String strData = Encoding.UTF8.GetString(data, 0, data.Length);
Debug.WriteLine($"MAC Data :{strData}");
return strData;
}
private Byte[] ReadMultipleBlock(IIsoReader isoReader, Byte blockStart, Byte offset, Byte dataLength)
{
Byte[] dataRead = new Byte[dataLength];
Byte currentBlock = blockStart;
Byte index = 0;
while (index < dataLength)
{
// Build a READ Single Binary Block command
CommandApdu cmdApdu = new CommandApdu(IsoCase.Case2Short, SCardProtocol.Any)
{
CLA = 0xFF,
INS = 0xB0,
P1 = 0x00,
P2 = currentBlock,
Le = 0x04
};
Debug.WriteLine($"<-- { BitConverter.ToString(cmdApdu.ToArray())}");
Response response = isoReader.Transmit(cmdApdu);
if (!response.HasData)
{
Debug.WriteLine(String.Format("No data. (Card does not understand \"ReadBinary\")"));
return dataRead;
}
else
{
Byte[] data = response.GetData();
Debug.WriteLine($"--> {Encoding.UTF8.GetString(data, 0, data.Length)}");
Byte responseIndex = 0;
if (currentBlock == blockStart)
{
responseIndex = offset;
}
while (responseIndex <= 0x03 && index < dataLength)
{
dataRead[index++] = data[responseIndex++];
}
currentBlock++;
}
}
return dataRead;
}
ISO 15693 使用 FEIG 阅读器 API
我们成功测试了带有 .Net API的Feig RFID 阅读器。即使文档仍处于“初步”阶段,它也可以正常工作。它允许读取多个块命令,但不附带卡检测嵌入等事件。因此,目前我们在库存中无限循环以使用他们所谓的“主机模式”产生一种“标签插入事件”。有一个“扫描模式”可以充当事件制作者,但还没有时间深入挖掘它。所以我在一次调用中读取了几个内存块,然后通过代码解析它们。我没有向您展示代码,因为我不确定是否允许我放置此受版权保护的 API 的示例代码,但它与上面的前一个非常相似,当然我没有循环获取多个数据块。
我希望有一天会在某些 API 中出现本机 NDEF 消息,以避免解析代码......