等待连接 HID 读卡器

Posted

技术标签:

【中文标题】等待连接 HID 读卡器【英文标题】:Waiting for HID Card Reader to be Connected 【发布时间】:2014-10-30 19:32:04 【问题描述】:

我正在编写一个需要将 HID 读卡器连接到系统的应用程序。当应用程序启动时已经连接读卡器时,一切正常,所以我知道我可以正确找到设备。 (我正在使用来自 PM> Install-Package hidlibrary 的 HID 类。)

我想添加一个功能,如果找不到读卡器,程序将显示连接读卡器的提示。

这是我的第一次尝试:

public class App : Application

    public static List<HidDevice> HidDeviceList;

    // Block until device is plugged in
    static ManualResetEvent m_WaitForPlugin = new ManualResetEvent(false);

    // WMI Watcher for actual plug-in event
    static ManagementEventWatcher watcher = new ManagementEventWatcher();

    [STAThread()]
    static void Main()
    
        ShowSplashScreen();

        FindCardReader();

        CloseSplashScreen();

        new App();
    

    public App() : base()
    

        StartupUri = new System.Uri("MainWindow.xaml", UriKind.Relative);
        Run();
    

    private static void FindCardReader()
    

        ShowOnSplashScreen("Searching for card reader");

        do
        
            int VendorID = Convert.ToInt32(Settings.Default.ReaderVID, 16); // 0x0801
            int ProductID = Convert.ToInt32(Settings.Default.ReaderPID, 16); // 0x0002
            HidDeviceList = HidDevices.Enumerate(VendorID, ProductID).ToList();

            if (HidDeviceList.Count > 0) 
                break;
            

            ShowOnSplashScreen("Please attach card reader...");
            SetupWatcher();
            m_WaitForPlugin.WaitOne();

         while (HidDeviceList.Count == 0);
    

    private static void SetupWatcher()
    
        WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
        watcher.EventArrived += new EventArrivedEventHandler(delegate(Object sender, EventArrivedEventArgs e)
        
            ShowOnSplashScreen("New device detected!");
            m_WaitForPlugin.Set();
        );
        watcher.Query = query;
        watcher.Start();
    

Main 中的FindCardReader() 按预期阻塞,但插入新设备时似乎从未发出信号。(我在委托中设置了一个断点,它从未被击中。)

我不确定如何自行测试 WMI 观察程序(我在 PowerShell 中测试了查询,它似乎可以工作)。我也尝试在new Thread 中启动它,但结果是一样的。

【问题讨论】:

您能否在定时循环中测试您的WqlEventQuery(例如,每2-3 秒)以查看Win32_DeviceChangeEvent 是否真的出现在WMI 中?之后,您可以尝试使用您知道会定期更改的内容(例如Select * From Win32_LocalTime)来测试ManagementEventWatcher 您是否考虑过不同的查询,可能基于以下查询:***.com/questions/5278860/…? 你有没有看过一些sample apps 处理连接/断开连接? 【参考方案1】:

事实证明,这段代码中有一个非常明显的死锁。我重新设计了整个系统以避免这个问题,而不是添加额外的线程来处理锁定。

【讨论】:

以上是关于等待连接 HID 读卡器的主要内容,如果未能解决你的问题,请参考以下文章

HID 报告请求

使用NFC检测HID感应卡

在 Windows 应用商店应用中读取 HID 代理卡

USB hid采集 (HC-USB-T调试工具)

uID卡和fuID的区别

通过串行连接从智能卡读卡器接收数据(C#)