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

时间:2012-11-16 20:55:24

标签: c# asp.net usb hid

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

USB设备已插入运行此应用程序的SAME SERVER中。

所以我决定前往Nuget并抓住HidLibrary

  

PM> Install-Package hidlibrary

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

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

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设备的一些突破性权限问题。

3 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:5)

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

如果是环境,请尝试使用Process Monitor查看是否存在任何隐藏的访问错误。还要尝试枚举所有设备,而不仅仅是寻找你所使用的设备,只是为了看看你是否可以在ASP.NET中实现它。

答案 2 :(得分:1)

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

执行此操作的最佳方法是将另一个(WCF)服务作为设备的代理,并公开您需要的服务,与您的应用程序连接。如果您认为这会有所帮助,请随意提出一个例子。

我+1 @garzanti。