我需要从 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;
}
}
我尝试使用以下代码,但有很多错误。 你能帮我解决错误吗?
我尝试使用以下代码,但有很多错误。 你能帮我解决错误吗?
没有“卡类型是 MiFare DesFire 1K”可用,它是 Mifare Classic 1K 或 Mifare 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