繁体   English   中英

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

[英].Net Library and RFID Reader could I use to get NDEF message from NXP ICode SLIX?

我们想使用任何合适的.Net库从生产的标签中读取NDEF记录以及标签ID。 但是据我所见,.Net社区似乎对这种NXP ICode SLIX的支持很差。

以下是我们其中一个标签的几个示例数据屏幕截图,第一个有助于识别标签的类型,第二个以红色下划线显示我们要读取的数据:

在此处输入图片说明 在此处输入图片说明

我们尝试使用Cardwerk的 pcsc-sharpSmart Card API等几个PC / SC库以及UWP的示例代码,但是我们的Identiv Multi-ISO读取器似乎无法对卡执行APDU命令。

编辑:

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

但是,如果您可以分享一些阅读NXP ICode Slix存储标签的经验,尤其是使用任何具有适当RFID读取器的.Net库读取NDEDF消息的经验,将不胜感激。

PS:这是“ 软件推荐”中提出问题的改编版本,在此处发布之前请稍作犹豫,因为它可能太广泛了。

为了完成任务,我直接向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;
    }

使用FEIG Reader API的ISO 15693

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM