我可以使用 .Net 库和 RFID 阅读器从 NXP ICode SLIX 获取 NDEF 消息吗?

Posted

技术标签:

【中文标题】我可以使用 .Net 库和 RFID 阅读器从 NXP ICode SLIX 获取 NDEF 消息吗?【英文标题】:.Net Library and RFID Reader could I use to get NDEF message from NXP ICode SLIX? 【发布时间】:2018-04-04 09:15:07 【问题描述】:

我们希望使用任何合适的 .Net 库从来自生产的标签中读取 NDEF 记录和标签 ID。但据我所见,这种 NXP ICode SLIX 在 .Net 社区中似乎没有得到很好的支持。

下面是我们的一个标签的几个示例数据截图,第一个帮助识别它是哪种标签,第二个显示我们要读取的数据,用红色下划线:

我们尝试使用多个 PC/SC 库,例如 pcsc-sharp 和 Smart Card API from Cardwerk 以及 sample code from UWP,但我们的 Identiv Multi-ISO 读卡器似乎无法对卡执行 APDU 命令。

编辑:

我们已成功尝试了其他 RFID 阅读器:Cardwerk 工程师和 NXP 支持人员建议的 HID OmnyKey 5022。它工作正常,但仅支持使用pcsc-sharp 读取简单块命令。

但是,如果您能分享一些阅读 NXP ICode Slix 内存标签的经验,特别是使用任何带有适当 RFID 阅读器的 .Net 库的 NDEDF 消息,我们将不胜感激。

P.S.:这是 question asked at Software Recommendations 的改编版本,在发帖之前有点犹豫,因为它可能太宽泛了。

【问题讨论】:

【参考方案1】:

为了完成任务,我直接询问了恩智浦支持。所以他们建议我从他们知名的 RFID 硬件合作伙伴中进行选择。 HID 和 FEIG。

带有 pcsc-sharp 的 HID Ominkey

首先,我使用 HID Omnikey 5022 阅读器和这个 PC/SC .Net Lib from Github 成功实现了读取内存,这意味着对 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;
    

使用 FEIG 阅读器 API 的 ISO 15693

我们成功测试了带有 .Net API 的 Feig RFID reader。即使文档仍处于“初步”阶段,它也可以正常工作。它允许读取多个块命令,但不附带卡检测等事件。因此,目前我们在库存中无限循环以使用他们所谓的“主机模式”产生一种“标签插入事件”。有一个“扫描模式”可以充当事件制作者,但还没有时间深入挖掘它。所以我在一次调用中读取了几个内存块,然后通过代码解析它们。我没有向您展示代码,因为我不确定是否允许我放置此受版权保护的 API 的示例代码,但它与上面的非常相似,当然我没有循环获取多个数据块。

我希望有一天能在某些 API 中出现原生 NDEF 消息,以避免解析代码...

【讨论】:

以上是关于我可以使用 .Net 库和 RFID 阅读器从 NXP ICode SLIX 获取 NDEF 消息吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何开始使用 RFID 阅读器? [关闭]

如何将名称动态分配给 RFID 阅读器连接的串行端口

新零售 — RFID 应用案例

与具有 ASCII 编码的 FM-503 RFID 阅读器通信

与 HID 设备的通信在读/写时挂起(AS3992 RFID 阅读器)

使用蓝牙创建 RFID 标签