将即插即用设备映射到 PCI 插槽 ID,C#

Posted

技术标签:

【中文标题】将即插即用设备映射到 PCI 插槽 ID,C#【英文标题】:Mapping Plug N Play Devices to PCI Slot IDs, C# 【发布时间】:2017-06-09 18:18:42 【问题描述】:

我有一定数量的外部设备,我们称它们为事物。 每个事物都通过插入 PCI 插槽的 PnP 卡与计算机连接。 每张卡都有 4 个东西的端口。 我需要为每个持续存在且在重新启动之间保持一致的事物获取一个 UID。 请注意,Things 没有我可以访问的内置 UID。

我解决这个问题的想法是为卡上的每个端口获取一个 UID。在我看来,我只需要弄清楚每张卡插入哪个 PCI 插槽。这不会在重新启动时改变,而且端口肯定会以相同的顺序排列......所以我基本上可以用 UID 标记每个端口并知道每个事物与哪个 UID 相关联。

我进行了相当多的搜索以找出最有用的 C# 对象。我找到的最接近的是来自System.Management 库的ManagementObjectSearcher 对象。这是我编写的一些简单代码,看看这是否能得到我想要的:

static void Main(string[] args)

    IDsearch();
    Console.ReadLine();


static void IDsearch()

    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PnPEntity");

    foreach (ManagementObject queryObj in searcher.Get())
    
        Console.WriteLine("DeviceID: 0", queryObj["DeviceID"]);
        Console.WriteLine("Description: 0", queryObj["Description"]);
    

这会为我计算机上的每个 PnP 设备生成如下输出:

DeviceID: ACPI\GENUINEINTEL_-_INTEL64_FAMILY_6_MODEL_60_-_INTEL(R)_CORE(TM)_I7-4790_CPU_@_3.60GHZ\_1
Description: Intel Processor

DeviceID: USB\VID_0CF3&PID_3004\ALASKA_DAY_2006
Description: Dell Wireless 1535C Bluetooth Device

如果我还可以获得 PCI 插槽号,这将符合我的要求。

我也遇到了Win32_SystemSlot 类,但这似乎并没有给我描述实际插入插槽的内容!所以在这一点上,我可以得到没有 PCI 插槽的描述......和没有描述的 PCI 插槽。我只是无法将它们映射在一起,这正是我所需要的。我一定是忽略了什么或者没有问正确的问题,因为这让我觉得很常见。

感谢您的帮助。

【问题讨论】:

嗨 Keith,我不知道你的问题的答案,但在我看来,你需要找到一种方法来获取设备的 ID 而不是端口。这些东西应该有一些东西可以识别它们……看看这个……msdn.microsoft.com/en-us/windows/hardware/drivers/install/… @GreatJobBob。事实上,事物确实有描述。它们在不同的事物之间并不是唯一的。我正在尝试识别和区分同时连接的多个事物。换句话说,虽然我有一个 ID,但要获得一个 UID,我需要映射到卡和端口。 你的东西连接的卡应该有一个 UID,所以你不能扫描卡 UID 来知道你的卡安装到哪个 PCI 插槽? 你解决过这个问题吗?如果可能的话,我还需要报告设备以及它们所在的 PCI 插槽。 不,我从来没有解决过这个问题。最终为每个“事物”使用单独的计算机而不是单个主板并使用消息队列。无论如何,这实际上对我的特殊需求更有意义。但不,即使经过大量研究,我也从未真正找到答案。 【参考方案1】:

这听起来非常脆弱,如果机器被移动并且设备被插入不同的端口会怎样。是个人项目或您尝试分发的东西。如果是后者,你应该找到另一种方法。是你自己创造的“事物”吗?如果是这样,您需要包括让每个人都拥有唯一标识符的能力。如果不是,您应该联系制造商并询问。试图通过端口识别它可能会让你在路上很头疼

【讨论】:

您的观点是有道理的,但它们对我的特定问题并没有真正的帮助。事实上,我同意你的看法......但我不能只是重新制造内置 UID 的东西。请注意,至少我见过的其他设备(例如显卡)似乎没有特定于单元的 UID……只是特定于型号。 好的,Keith 这很公平,但是对于显卡,我们不需要跟踪在重新启动之间发送给每个显卡的内容。也许您可以提供有关您正在尝试做的事情的更多详细信息:) 这些东西是相机。我需要将每个相机的输出与它所源自的特定相机相关联。不过,我将问题抽象为事物,因为我不明白它为什么重要……只是试图使问题尽可能干净。我正在寻找的解决方案是 PnP 或 PCI 插槽级别......而不是设备级别的类型。 嗨,基思。您能在 Windows 设备管理器中看到摄像头吗?如果可以,请转到详细信息页面,看看是否可以看到端口信息。下拉列表中的详细信息页面上应该有很多信息。如果可以,那么至少您会知道这是可能的。如果 Windows 看不到它,那么输入可能会非常困难。【参考方案2】:

我认为您正在寻找 Win32_BusWin32_DeviceBus 类的组合。

Win32_Bus 表示运行 Windows 操作系统 (Microsoft Docs) 的计算机所看到的物理总线。总线类型可以是 PCI,总线号似乎是不同物理 PCI 总线的枚举。

Win32_DeviceBus 关联系统总线和使用该总线的逻辑设备。此类用于发现哪些设备在哪个总线上 (Microsoft Docs)。在我的平台上,与总线关联的设备始终是 Win32_PnPEntity

使用这些类,您应该能够从给定的Win32_PnPEntity 中找到物理总线属性。

【讨论】:

以上是关于将即插即用设备映射到 PCI 插槽 ID,C#的主要内容,如果未能解决你的问题,请参考以下文章

智能家居通用管理平台 - 即插即用机制的设计

Linux To Go:制作随身携带、即插即用的Linux系统

TYPE-C领夹式麦克风方案,即插即用,外围简单兼容性优秀

P2P 网络核心技术:UPnP 和 SSDP 协议

打包基于 JavaScript 的即插即用应用程序

将Ubuntu18.04安装到U盘,实现即插即用