8

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

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

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

PM> Install-Package hidlibrary

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

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

供应商 ID 和产品 ID

我把它放到我的代码中。

然后我在抓取设备的行上设置了一个断点,但不幸的是它总是回来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 设备的一些破坏性权限问题。

4

3 回答 3

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 与该服务进行通信。该服务需要一个代理。

于 2012-11-28T15:20:46.643 回答
5

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

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

于 2012-11-28T00:00:14.870 回答
1

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

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

我 +1 @garzanti。

于 2012-12-03T21:20:59.560 回答