获取内容NFC卡[已关闭]

问题描述 投票:0回答:1

我需要从 NFC 卡读取标签数据,我尝试使用以下代码,但有很多错误,我在 C# 和终端项目上使用 PCSC 库,你有什么提示吗?

我需要从 NFC 卡读取标签数据,我尝试使用以下代码,但有很多错误,我在 C# 和终端项目上使用 PCSC 库,你有什么提示吗?

    using System;
    using PCSC;
    using PCSC.Utils;
    
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (var context = new SCardContext())
                {
                    context.Establish(SCardScope.System);
    
                    string readerName = GetReaderName(context);
                    if (readerName == null)
                    {
                        Console.WriteLine("No NFC reader found.");
                        return;
                    }
    
                    using (var reader = new SCardReader(context))
                    {
                        Console.WriteLine($"Connected to reader: {readerName}");
    
                        var readerStatus = ConnectToReader(reader, readerName);
                        if (readerStatus != SCardError.Success)
                        {
                            Console.WriteLine($"Error connecting to reader: {SCardHelper.StringifyError(readerStatus)}");
                            return;
                        }
    
                        var atr = GetATR(reader);
                        Console.WriteLine($"Card ATR: {BitConverter.ToString(atr)}");
    
                        byte[] tagData = ReadTagData(reader);
                        Console.WriteLine($"Tag Data: {BitConverter.ToString(tagData)}");
    
                        reader.Disconnect(SCardReaderDisposition.Leave);
                    }
    
                    context.Release();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"An error occurred: {ex.Message}");
            }
        }
    
        static string GetReaderName(SCardContext context)
        {
            var readerNames = context.GetReaders();
            return readerNames.FirstOrDefault();
        }
    
        static SCardError ConnectToReader(SCardReader reader, string readerName)
        {
            return reader.Connect(readerName, SCardShareMode.Shared, SCardProtocol.Any);
        }
    
        static byte[] GetATR(SCardReader reader)
        {
            var atr = new byte[64];
            var atrLength = reader.GetAttrib(SCardAttribute.AtrString, atr);
            Array.Resize(ref atr, (int)atrLength);
            return atr;
        }
    
        static byte[] ReadTagData(SCardReader reader)
        {
            const int blockSize = 16;
    
            var command = new byte[] { 0xFF, 0xB0, 0x00, 0x04, (byte)blockSize };
            var receiveBuffer = new byte[blockSize];
            var receiveLength = reader.Transmit(command, receiveBuffer);
    
            var tagData = new byte[receiveLength];
            Array.Copy(receiveBuffer, tagData, receiveLength);
    
            return tagData;
        }
    }

我尝试使用以下代码,但有很多错误。 你能帮我解决错误吗?

我尝试使用以下代码,但有很多错误。 你能帮我解决错误吗?

enter image description here enter image description here

c# nfc
1个回答
0
投票

没有“卡类型是 MiFare DesFire 1K”可用,它是 Mifare Classic 1KMifare DESFire EV1 标签?对于任何使用 NFC 标签的人来说,这都有很大的不同,因为两个命名标签的工作方式完全不同。

例如,您无法直接从 Mifare DESFire EVx 标签读取任何数据。您需要首先选择一个应用程序(一种“文件夹”),然后使用每种文件类型不同的相应命令读取文件。此外,文件可能无法在普通模式下进行通信,而是在 MACed 或完整(“加密”)模式下进行通信,这使得完整的通信变得更加困难。

作为附加功能,DESFire EVx 标签上提供了一些身份验证方案,您需要先使用它们,然后才能读取(或写入)内容。

最后一点:完整的文档(“数据表”)受 NDA(保密协议)约束,您必须先签署该文档,然后才能访问恩智浦的这些文档。幸运的是,有一个“残缺的”DESFire Light 标签,其中完整的数据表和“功能和提示”文档可以为您提供大量如何使用 DESFire EVx 标签的提示和示例:

数据表 – MIFARE DESFire Light:https://www.nxp.com/docs/en/data-sheet/MF2DL_H_x0.pdf

应用说明 – AN12343 MIFARE DESFire 灯功能和提示:https://www.nxp.com/docs/en/application-note/AN12343.pdf

© www.soinside.com 2019 - 2024. All rights reserved.