You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取RFID徽章数据跨Windows 10设备适配问题求助

解决方案:跨Windows 10设备读取RFID徽章数据

核心问题分析

你遇到的问题根源在于:

  • 多数RFID工作徽章并非NDEF格式(你用的Proximity API默认监听NDEF标签),仅存储纯UID的ISO14443A类卡片,Proximity API无法识别这类非NDEF标签
  • 不同品牌平板的NFC硬件驱动对Proximity API支持存在差异,而PC/SC(智能卡服务)是Windows统一的读卡器交互标准,兼容性更强
  • 之前的代码未处理UI线程更新问题,回调线程直接操作TextBox会导致数据接收后无法显示

方案一:使用PC/SC API(推荐,兼容性最强)

PC/SC是Windows原生标准,支持几乎所有NFC阅读器,适配WPF和UWP所有Windows 10设备。

1. WPF实现步骤

  • 安装NuGet包:PCSC
  • 代码示例:
using PCSC;
using System;
using System.Linq;
using System.Windows;

public partial class MainWindow : Window
{
    private ISCardContext _cardContext;
    private CardMonitor _cardMonitor;

    public MainWindow()
    {
        InitializeComponent();
        InitCardReader();
    }

    private void InitCardReader()
    {
        _cardContext = new SCardContext();
        _cardContext.Establish(SCardScope.System);

        var readers = _cardContext.GetReaders();
        if (!readers.Any())
        {
            MessageBox.Show("未检测到NFC读卡器");
            return;
        }

        // 监听第一个读卡器的卡片插入事件
        _cardMonitor = new CardMonitor(_cardContext, readers.First());
        _cardMonitor.CardInserted += OnCardInserted;
        _cardMonitor.Start();
    }

    private void OnCardInserted(object sender, CardMonitorEventArgs e)
    {
        using var card = _cardContext.ConnectReader(e.ReaderName, SCardShareMode.Shared, SCardProtocol.T0 | SCardProtocol.T1);
        // 发送ISO14443A标准指令读取UID
        var apduCmd = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x00 };
        var response = card.Transmit(apduCmd);

        if (response.SW1 == 0x90 && response.SW2 == 0x00)
        {
            var uidStr = BitConverter.ToString(response.GetData()).Replace("-", "");
            // 切换到UI线程更新文本框
            Dispatcher.Invoke(() => UIDTextBox.Text = uidStr);
        }
    }

    protected override void OnClosed(EventArgs e)
    {
        _cardMonitor?.Stop();
        _cardContext?.Release();
        base.OnClosed(e);
    }
}

2. UWP实现步骤

  • 在Package.appxmanifest中添加智能卡权限:
<Capabilities>
    <DeviceCapability Name="smartcards" />
</Capabilities>
  • 代码示例:
using Windows.Devices.SmartCards;
using Windows.UI.Core;
using Windows.UI.Xaml;

public sealed partial class MainPage : Page
{
    private SmartCardReader _nfcReader;
    private SmartCardReaderWatcher _readerWatcher;

    public MainPage()
    {
        InitializeComponent();
        InitCardReader();
    }

    private async void InitCardReader()
    {
        _readerWatcher = SmartCardReaderWatcher.Create();
        _readerWatcher.Added += async (s, args) =>
        {
            _nfcReader = args.Reader;
            _nfcReader.CardAdded += OnCardAdded;
            await _nfcReader.ConnectAsync();
        };
        _readerWatcher.Start();
    }

    private async void OnCardAdded(SmartCardReader sender, SmartCardReaderCardAddedEventArgs args)
    {
        using var card = args.SmartCard;
        using var connection = await card.ConnectAsync(SmartCardReaderConnectionMode.Shared);
        
        // 发送读取UID的APDU指令
        var apduCmd = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x00 };
        var response = await connection.TransmitAsync(apduCmd);

        if (response.StatusCode == SmartCardLaunchBehavior.Success)
        {
            var uidStr = BitConverter.ToString(response.ResponseData).Replace("-", "");
            // 切换到UI线程更新文本框
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => UIDTextBox.Text = uidStr);
        }
    }
}

方案二:修复Proximity API问题(仅适用于NDEF格式标签)

如果你的RFID徽章确实是NDEF格式,按以下步骤调整:

  1. 添加UWP权限:在Package.appxmanifest中补充
<Capabilities>
    <DeviceCapability Name="proximity" />
</Capabilities>
  1. 处理UI线程更新:回调函数在后台线程,必须通过Dispatcher更新UI
// UWP版本
private async void messageReceived(ProximityDevice sender, ProximityMessage msg)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        UIDTextBox.Text = msg.DataAsString;
    });
}

// WPF版本
// private void messageReceived(ProximityDevice sender, ProximityMessage msg)
// {
//     Dispatcher.Invoke(() =>
//     {
//         UIDTextBox.Text = msg.DataAsString;
//     });
// }
  1. 尝试订阅通用标签类型:部分设备需切换订阅类型
// 替换原有的"NDEF"订阅
subscribedMessageId = proximityDevice.SubscribeForMessage("Windows:Nfc:Tag", messageReceived);

额外注意事项

  • 部分MPI/加固平板的NFC阅读器需手动切换到「RFID模式」,可查看设备厂商的硬件设置或驱动配置
  • 测试时确保RFID徽章紧贴设备的NFC感应区域(不同设备的感应位置可能不同)

内容的提问来源于stack exchange,提问作者Luigi726

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:05:36