【问题标题】:How can I connect to a Server Side USB (HID) Device from within an ASP.NET Application?如何从 ASP.NET 应用程序中连接到服务器端 USB (HID) 设备?
【发布时间】:2012-11-05 15:10:10
【问题描述】:

我正在尝试为 USB 设备编写自己的控制器,而不是使用产品随附的 SDK(我觉得 sdk 低于标准)。

USB 设备已插入运行此应用程序的同一服务器。

所以我决定前往 Nuget 并获取 HidLibrary

PM> 安装包库

然后我继续按照GitHub 上的示例进行操作。

首先我进入我的控制面板来验证 VendorID 和 ProductID

然后我把它放到了我的代码中。

然后我在抓取设备的那一行设置了一个断点,可惜总是返回null。

using HidLibrary;
public class MyController : ApiController
{

    private const int VendorId = 0x0BC7;
    private const int ProductId = 0x0001;

    private static HidDevice _device;

    // POST api/<controller>
    public string Post(CommandModel command)
    {

        _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();

        if (_device != null)
        {
            // getting here means the device exists
        }
        else
        {
            // ending up here means the device doesn't exist
            throw new Exception("device not connected");
        }
        return null;
    }

我希望这是一些愚蠢的事情,而不是关于直接从 IIS 工作人员连接到 USB 设备的一些破坏性权限问题。

【问题讨论】:

  • 您可以尝试将 IIS 工作进程(和经过身份验证的用户帐户)作为本地管理员帐户运行,以排除权限问题。
  • 这个项目背后的想法是构建一个目的构建“设备”(因为没有更好的术语),它在前端公开一个 webUI,并控制用于自动化目的的硬件......类似于Crestron 在他们的 AV2 硬件上做了什么。

标签: c# asp.net usb hid


【解决方案1】:

尽管你希望自己变得愚蠢,但事实并非如此。您有一些破坏交易的权限问题。如果您从 Hid 库的 GitHub 浏览 Mike O'Brien 的代码,您会看到它调用位于以下位置的 Win32 API 函数:kernel32.dll、setupapi.dll、user32.dll、hid.dll (Native.cs)。

枚举本身是通过 setupapi.dll 函数完成的。它会浏览所有已安装的设备并过滤需要的设备。

所以...我认为通过匿名身份验证直接从 IIS 中的网络应用程序执行 kernel32.dll 代码是一个安全问题,不是吗?

如果您确实需要与该 HID 通信(谁知道它可能是温度传感器或其他东西),我会做一个单独的 Windows 服务,IIS 托管的 Web 应用程序将通过 WCF 与该服务通信。该服务需要代理。

【讨论】:

  • 我同意服务方式——这是我一直用于此类场景的做法。
  • 请看我在原始问题上发表的评论。
  • “appliance”是个好词,针对这种场景有Windows 2008 Embedded版本。但即便如此,WebUI 也应该与硬件服务隔离。
  • 同意。我会调查一下(过去几天没有机会)。我希望为想要使用该项目的人进行简单的部署(它将在 github 上),并且不得不部署 WebUI 和 Windows 服务对最终用户来说比我想要的要付出更多的努力......但我想它必须是这样的。
【解决方案2】:

将相同的代码放入控制台应用程序并运行它。这将帮助您验证它是您的代码还是环境。

如果是环境,请尝试使用进程监视器查看是否有任何隐藏的访问错误。还可以尝试枚举所有设备,而不仅仅是寻找您所追求的设备,只是看看您是否可以在 ASP.NET 中做到这一点。

【讨论】:

    【解决方案3】:

    @Chase,除非这是一个实验——最好不要尝试从 IIS 进程连接到设备。 [如果你从这条路开始,它就是一个潘多拉的盒子]。

    最好的方法是让另一个 (WCF) 服务作为设备的代理,并从服务中公开您需要的内容,然后将其与您的应用挂钩。如果您认为这有帮助,请随时询问示例。

    我 +1 @garzanti。

    【讨论】:

    • 请看我在原始问题上发表的评论。
    猜你喜欢
    • 2020-12-19
    • 2021-01-24
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多