我正在尝试为USB设备编写自己的控制器,而不是使用产品附带的SDK(我觉得sdk低于标准杆。)
USB设备已插入运行此应用程序的SAME SERVER中。
所以我决定前往Nuget并抓住HidLibrary
PM> Install-Package hidlibrary
然后我继续按照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设备的一些突破性权限问题。
答案 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。