我该如何在ASP.NET应用程序中连接到服务器端的USB (HID)设备?

8
我正在尝试编写自己的USB设备控制器,而不是使用产品附带的SDK(我认为该SDK低于水平)。 USB设备插入了运行该应用程序的同一台服务器中。 所以我决定前往Nuget并获取HidLibrary:

PM> Install-Package hidlibrary

然后我按照在GitHub上找到的示例进行操作:GitHub
首先,我进入我的控制面板验证供应商ID和产品ID。 VendorID and 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工作进程(和经过身份验证的用户帐户)作为本地管理员帐户运行,以排除权限问题。 - Dai
这个项目的想法是构建一个专用的“设备”(暂时没有更好的术语),在前端公开一个WebUI,并控制硬件以实现自动化目的...类似于Crestron在其AV2硬件上所做的。 - Chase Florell
3个回答

10

尽管你希望它是些傻事,但事实并非如此。你有一些不能克服的权限问题。如果你浏览Mike O'Brien在GitHub上的HID Library的代码,你会发现它调用了Win32 API函数,这些函数位于:kernel32.dll、setupapi.dll、user32.dll、hid.dll(Native.cs)。

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

因此...我认为在具有匿名身份验证的IIS Web应用程序中直接执行kernel32.dll代码是一个安全问题,你不这么认为吗?

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


1
我赞同这种服务方法——这是我一直以来在类似情况下使用的做法。 - LewisBenge
请查看我在原问题上发布的评论。 - Chase Florell
“Appliance”是一个很好的术语,而且有适用于这种场景的Windows 2008嵌入式版本。但即便如此,WebUI也应该与硬件服务隔离开来。 - garzanti
同意。我会研究一下这个问题(过去几天没有机会)。我希望为那些想要使用该项目的人提供简单的部署方式(它将在Github上发布),而不是让最终用户需要部署WebUI和Windows服务,这似乎需要更多的努力...但我想这样做是必要的。 - Chase Florell

5

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

如果是环境问题,请尝试使用“进程监视器”查看是否有任何隐藏的访问错误。此外,尝试枚举所有设备,而不仅仅是寻找您想要的一个设备,以查看是否可以在ASP.NET中完成它。


1
@Chase,除非这是一个实验,最好不要尝试从IIS进程连接到设备。[如果你开始走这条路,那就是一个潘多拉魔盒]。
最好的方法是有另一个(WCF)服务作为代理到设备,并仅公开您需要的服务内容,将其与您的应用程序连接起来。如果您认为这会有所帮助,请随时要求示例。
我+1 @garzanti。

请查看我在原问题上发布的评论。 - Chase Florell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接