编写一个监听 USB 端口的小实用工具,需要建议

2023-12-25

我有一个可以循环工作的硬件。它配备了专有的软件工具,让用户可以通过 USB 从 PC 控制它。用户定义每个周期的长度。在每个周期开始时,软件工具通过 USB 快速向硬件发出一系列命令,然后进入空闲模式,等待下一个周期。

还有第二个硬件需要与第一个硬件同步。基本上,当向硬件 #1 发出上述一系列命令时,硬件 #2 也应该执行其操作。

硬件 #2 附带 API 和 SDK 等。硬件 #1 没有 - 只有这个工具可以让您定义周期的长度。

鉴于这一切,我们决定实现这一目标的最简单方法是监听硬件 #1 使用的 USB 端口,以便每次检测到硬件 #2 上的流量时也会发出其指令。我在硬件 #1 的 USB 端口上使用了一个监控应用程序,其流量看起来非常简单:在一个周期开始时是快速而短暂的连续数据包,然后在下一个周期之前什么也没有。

这个想法是编写一个基于 Windows 的小型实用程序应用程序,该应用程序将侦听硬件 #1 的 USB 端口,并在每次检测到周期时向硬件 #2 发出 API 调用。理想情况下,它应该是一个 .NET 应用程序,因为就编写 Windows 代码而言,我最熟悉它。

困难的部分是编写用于监听硬件 #1 的 USB 端口的代码。另外,我无法始终访问硬件 #1,因此我使用普通 USB 键盘和鼠标作为替代品。此时的目标是简单地检测键盘或鼠标 USB 端口上的流量。

到目前为止,我已经尝试了在网上找到的两个库 - LibUsbDotNet 和 Usb.Net。两者中的任何一个我都无法实现目标。

我什至无法让 Usb.Net 读取数据包...

LibUsbDotNet 似乎劫持了流量 - 因此,如果我在记事本或 Word 中的键盘上键入,字母不会出现在那里,而我的应用程序会成功读取数据包。将拦截的数据包写回到端口没有帮助。

这是我与 LibUsbDotNet 一起使用的代码。它基本上是库的示例,稍加修改即可与我的键盘一起使用。

// 1118 = Vendor Id, 1872 = Product Id
UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(1118, 1872);

ErrorCode ec = ErrorCode.None;

try
{
    // Find and open the usb device.
    MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

    // If the device is open and ready
    if (MyUsbDevice == null) throw new Exception("Device Not Found.");

    // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
    // it exposes an IUsbDevice interface. If not (WinUSB) the 
    // 'wholeUsbDevice' variable will be null indicating this is 
    // an interface of a device; it does not require or support 
    // configuration and interface selection.
    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
    if (!ReferenceEquals(wholeUsbDevice, null))
    {
        // This is a "whole" USB device. Before it can be used, 
        // the desired configuration and interface must be selected.

        // Select config #1
        wholeUsbDevice.SetConfiguration(1);

        // Claim interface #0.
        wholeUsbDevice.ClaimInterface(0);
    }

    // open read endpoint 1.
    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);

    // keyboard communicates in packets of size 8
    byte[] readBuffer = new byte[8];
    while (ec == ErrorCode.None)
    {
        int bytesRead;

        // If the device hasn't sent data in the last 5 seconds,
        // a timeout error (ec = IoTimedOut) will occur. 
        ec = reader.Read(readBuffer, 5000, out bytesRead);

        if (bytesRead == 0) throw new Exception(string.Format("{0}:No more bytes!", ec));
        Console.WriteLine("{0} bytes read", bytesRead);

        // Write that output to the console.
        foreach (byte b in readBuffer) Console.Write("{0} ", b);
        Console.WriteLine();
    }

    Console.WriteLine("\r\nDone!\r\n");
}
catch (Exception ex)
{
    Console.WriteLine();
    Console.WriteLine((ec != ErrorCode.None? ec + ":" : String.Empty) + ex.Message);
}
finally
{
    if (MyUsbDevice != null)
    {
        if (MyUsbDevice.IsOpen)
        {
            // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
            // it exposes an IUsbDevice interface. If not (WinUSB) the 
            // 'wholeUsbDevice' variable will be null indicating this is 
            // an interface of a device; it does not require or support 
            // configuration and interface selection.
            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
            if (!ReferenceEquals(wholeUsbDevice, null))
            {
                // Release interface #0.
                wholeUsbDevice.ReleaseInterface(0);
            }

            MyUsbDevice.Close();
        }
        MyUsbDevice = null;

        // Free usb resources
        UsbDevice.Exit();

    }

    // Wait for user input..
    Console.ReadKey();
}

我如何修改它,以便它不拦截数据包,而只是检测它们,同时让它们传递到预期目的地?

欢迎对 Usb.Net 或 LibUsbDotNet 提出任何建议。或者,也许有一个更适合我需求的不同库?


USB 流量嗅探不如实际的端到端 USB 设备控制那么常见,因此可用于帮助完成此类事情的库数量有点少。您可能需要做一些调整以适应可用的选项。

一种看起来简单的方法是https://desowin.org/usbpcap/ https://desowin.org/usbpcap/:命令行版本可以实时输出到stdout,如下面的屏幕截图所示(来自链接页面):

这种方法的一个重要问题是需要实现 Pcap 数据格式,我强烈怀疑您最终将不得不自己完成所有 Pcap 解析实现do存在(包括.NET)都是为了(再次)更流行的使用 Pcap 捕获网络数据的案例场景。

However,在你惊慌失措之前,我建议这是一个潜在可行的解决方案,因为entire格式文档似乎适合两个一点点的 A4 页面(我检查了打印预览:D):https://desowin.org/usbpcap/captureformat.html https://desowin.org/usbpcap/captureformat.html- 此外,官方 Pcap 格式参考位于https://wiki.wireshark.org/Development/LibpcapFileFormat https://wiki.wireshark.org/Development/LibpcapFileFormat(由 USBPcap 站点链接)也明显不是特别密集。

您可以使用 USBPcap 从文件中输出测试数据,然后只需花时间迭代正确解析文件即可。

同样,您还可以访问该设备并保存一些流量转储,以便以后按照您自己的节奏进行解析,我怀疑这可能非常实用。

我发现了几个(有点烂:))C# 链接,它们可能有助于帮助您编写自己的 Pcap 解析器:https://github.com/ryrychj/PcapngUtils https://github.com/ryrychj/PcapngUtils and https://formats.kaitai.io/pcap/csharp.html https://formats.kaitai.io/pcap/csharp.html.


在搜索过程中,我还偶然发现了其他一些线索。

第一个是https://sourceforge.net/projects/usbsnoop/ https://sourceforge.net/projects/usbsnoop/,我发现它已经转移到https://github.com/SnoopWare/usbsnoop/ https://github.com/SnoopWare/usbsnoop/。这实际上非常有趣,因为它实现了自己的内核驱动程序来进行捕获。我很高兴我发现了这一点 - Server 2003 之前的 Windows 没有 USB 嗅探支持,但这可以追溯到 Windows 2000(当然还有最近的 Windows 10),了解这一点很有趣,即使只是琐事。 (我曾经想在设备和一些旧软件之间进行一些我自己的 USB 嗅探,并且认为 Win2K VM 将是最轻量级的方法,直到我了解了限制。)对于您的目的来说可能不太实用;前端 UI 似乎不支持记录到文件。

发生的另一件有趣的事情是发现https://www.codeproject.com/Questions/204396/USB-Sniffer-protocol https://www.codeproject.com/Questions/204396/USB-Sniffer-protocol- 第 3 篇文章产生了投诉“你为什么要回答这个问题,这篇文章已经有两年了”,其中包含一个指向不再解析的域的链接。网络档案馆只有一份链接页面的副本,位于http://web.archive.org/web/20140127164835/www.tellmeword.com/dh9ic/usb_sniffer_(source_code) http://web.archive.org/web/20140127164835/www.tellmeword.com/dh9ic/usb_sniffer_(source_code)- 下载(镜像的)也被存档了!哈!我不知道它们是否有用,或者它们使用的技术是否已被弃用等。

虽然我认为以上都是 C 语言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写一个监听 USB 端口的小实用工具,需要建议 的相关文章

  • “反序列化操作回复消息正文时出错...” - 对于我调用的每个方法

    我正在尝试为我们的波兰拍卖服务 Allegro 创建非常简单的客户端应用程序 他们提供 SOAP 架构中的 API 问题是 每次我尝试调用任何方法时 我都会收到 反序列化操作 方法名称 的回复消息正文时出错 一般来说 我对网络服务不熟悉 所
  • 绑定 WebForms TextBox 上的千位分隔符的逗号

    我正在尝试如下格式化数据绑定值 但我不断得到一个空格作为千 位分隔符 即显示的文本始终是 12 340 00 而它应该是 12 340 00 我缺少什么
  • 使用.NET 访问Windows 注册表?

    我发现一个奇怪的行为 NET http en wikipedia org wiki NET Framework模块访问Windows注册表 http en wikipedia org wiki Windows Registry使用Regis
  • 从 GUID 获取类型

    由于种种原因 我需要在C 中实现类型缓存机制 幸运的是 CLR 提供了Type GUID来唯一标识一个类型 不幸的是 我找不到任何方法来根据此 GUID 查找类型 有Type GetTypeFromCLSID 但根据我对文档 和实验 的理解
  • 无法从 List 转换为 List

    我有这样的设置 abstract class Foo class Bar Foo 以及其他地方的这种形式的方法 void AddEntries List
  • 什么是 System.ContextBoundObject?

    What is 上下文绑定对象 http msdn microsoft com en us library system contextboundobject aspx用于 该文档提到了 上下文 它似乎是以编程方式定义的 但未能给出任何解释
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何更改字体的元数据(特别是标题)?

    我需要一种动态更改字体名称的方法 但在 net 中找不到这样做的方法 我不关心字体文件类型 所以otf fon ttf都打开 我尝试过的事情 使用 dsofile dll OleDocument 属性读取器 这些与访问字体名称的任何内容所使
  • 自动夹具和起订量 v4

    我使用 Nuget 安装了 Autofixture 和 Moq 所以我有 moq 版本 4 当运行以下代码时 var fixture new Fixture Customize new AutoMoqCustomization fixtur
  • 是否可以“缩放”WPF RichTextBox 中的文本?

    我注意到 WinForms RichTextBox 有一个ZoomFactor我认为这正是我想要的属性 不幸的是 WPF 变体似乎完全缺少此属性 有什么方法可以实现相同的功能 增加 减少整个文档的可见文本大小而不实际更改底层 RTF Upd
  • 更改 ListView 中列标题的字体样式和颜色

    我搜索了更改我们使用的 ListView 的标题颜色 private void listView1 DrawColumnHeader object sender DrawListViewColumnHeaderEventArgs e e G
  • csc.exe 引用外部 .dll 文件

    我正在尝试做一个简单的c 程序使用Growl C API 我尝试用两种不同的方式编译我的程序 我保留了我的 dll文件与我的在同一目录中 cs文件 比我跑的 csc r Growl Connector dll Growl CoreLibra
  • 当前有哪些 USB 设备(友好名称)连接到 PC?

    我可以获得当前连接到计算机的设备列表吗 我检查了this https stackoverflow com q 3331043 75500 and this https stackoverflow com questions 3685615
  • 循环内声明的变量在循环的每次迭代中保持值

    我无法确定这是一个错误还是一个功能 For i 0 To 4 Dim strTest As String If i 0 Then strTest test value End If Console WriteLine strTest Nex
  • 实施 INotifyPropertyChanged - 是否存在更好的方法?

    微软应该实施一些快速的措施INotifyPropertyChanged 就像在自动属性中一样 只需指定 get set notify 我认为这样做很有意义 或者这样做有什么并发症吗 我们自己可以在我们的属性中实现类似 通知 的功能吗 有没有
  • .NET - 用户控件拖放 - 子控件

    我有 FlowLayoutPanel 和用户控件 可以拖放重新排序 这种作品 但问题是子控件阻止拖动实际的父 UserControl 所以我的问题是如何启用包含子控件的 UserControl 的拖动 如果我理解正确的话 我遇到了与您相同的
  • Portable 和 win-x64 在部署时有什么区别?

    我将代码部署到 Windows Server 2016 上的 IIS 我试图了解选择之间的有效区别Portable vs win x64在发布 设置 目标运行时下拉列表中 由于 JIT 需要将代码编译到特定的体系结构 站点在 Portabl
  • 以编程方式运行 T4 文本模板

    有没有一种方法可以通过代码以编程方式运行 T4 文本模板 我正在制作一种自定义域特定语言 我希望相关的文本模板在用户每次保存时运行 目前 这就是我在 DSL 模型中所做的事情 protected override void OnDocume
  • 如何使用完全空的类型使 Activator.CreateInstance 运行速度减慢约 20 倍

    Given NET 程序集命名expression host NET 程序集命名CreateInstanceTest CreateInstanceTest 在其配置文件中启用 NetFx40 LegacySecurityPolicy exp

随机推荐

  • 如何区分不同类型的 Perl 测试,这样我就不必运行所有测试?

    我注意到 Perl 中的习惯是将所有测试放入t目录 如何将单元测试与功能测试分开 或者 为了使问题更简单 更明显 如何将快速运行的测试与运行速度慢的测试分开 当所有测试一起运行时 测试花费的时间太长 无法在开发中常规使用 这是遗憾的 我想我
  • Metro APP - BitmapImage 到 Byte[] 或从 Web 下载图像并将其转换为 Byte[] 数组

    有没有办法将 BitmapImage Windows UI Xaml Media BitmapImage 转换为 Byte 数组 我没有尝试过任何工作 另一种可能的情况 如果 BitmapImage 无法转换为字节数组 是从网络下载图像 然
  • 角度目录光滑执行

    我正在使用以下插件 http vasyabigi github io angular slick http vasyabigi github io angular slick 我也在使用 ng repeat 所以我发现它在 ng repea
  • 在宏中使用“else”

    我看过下面的代码 define QL REQUIRE condition message if condition std ostringstream ql msg stream ql msg stream lt lt message th
  • 如何以编程方式指定replyUrlsWithType

    我想设置replyUrlsWithType以编程方式在应用程序上manifest https learn microsoft com en us azure active directory develop reference app ma
  • Eclipse 在调试 java 时跳过断点

    我使用 Eclipse 已经很多年了 并且一直使用调试器 但最近我知道它可以在调试时跳过断点 我什至已经在 println 上设置了一个断点 我会看到文本出来 但不会到达断点 另外 有时我会在代码的一个区域一致地遇到断点 但在其他区域却不会
  • default(Type) 的编程等效项

    我正在使用反射来循环Type的属性并将某些类型设置为其默认值 现在 我可以切换类型并设置default Type 明确地 但我宁愿在一行中完成 是否存在与默认值等效的编程方式 如果是值类型使用激活器 CreateInstance http
  • SET NOCOUNT ON 使用情况

    灵感来自这个问题 https stackoverflow com questions 1483383 is this stored procedure thread safe or whatever the equiv is on sql
  • 如果数据包含撇号,如何插入?

    实际上 我的任务是使用 C 将 csv 文件加载到 sql server 中 所以我用逗号将其拆分 我的问题是某些字段的数据包含撇号 并且我正在触发插入查询以将数据加载到 sql 中 所以它给出了我的编码错误 using System us
  • 如何按列对文本文件进行排序并保持原始顺序

    我有一个非常大的数据文件 有 15 列 我需要根据特定列 例如第 11 列 对所有行进行排序 我在 Linux 中使用以下命令 sort k11 d myfile txt gt sortedfile 问题是排序命令不保留文件的原始顺序 例如
  • FILTER_VALIDATE 与 Preg_match。使用哪一个?

    要验证输入日期 无论是表单 URL 还是表单 您通常使用哪种技术 我一直在看PHP 过滤器 http www w3schools com php php ref filter asp但我很少在任何代码上看到它们 我平时见过preg mach
  • PHP大量内存用于SQL查询

    我在优化 Apache PHP 内存使用时偶然发现了一个奇怪的问题 基本上 当尝试绑定 MySQLi 查询的结果时 代码会崩溃 并显示错误消息 致命错误 允许的内存大小 16777216 字节耗尽 试图分配 50331646 字节 相关表格
  • 我什么时候可以激活/停用布局约束?

    我在 IB 中设置了多组约束 并且我想根据某些状态以编程方式在它们之间切换 有一个constraintsA所有出口集合均标记为从 IB 安装 并且constraintsB出口集合全部在IB中卸载 我可以通过编程方式在两组之间切换 如下所示
  • Spring Boot 中用于模块化应用程序的插件系统

    我在编译后寻找在 Spring Boot 中动态加载 jar 例如 我将 jar 放在某个文件夹中 当 Spring Boot 启动时 该文件夹中的所有 jar 将被注入到 Spring Boot 应用程序中 我不知道如何使用 Spring
  • 从powershell执行msbuild任务

    我正在关注这个博客 http sedodream com 2010 04 26 ConfigTransformationsOutsideOfWebAppBuilds aspx http sedodream com 2010 04 26 Co
  • Microsoft onedrive:无需登录即可使用 API 密钥创建文件夹

    我可以使用以下命令在 onedrive 中创建文件夹和文件Graph API 但是第一次我必须登录微软帐户 以下是我需要登录的链接 https login microsoftonline com common oauth2 v2 0 aut
  • Angular 2 (keydown.enter) 无法阻止Default()

    the event preventDefault 我使用时不起作用 keydown enter 在模板中 这是演示 https plnkr co edit GZrVt7l6BEO2uHfWFoTQ p preview https plnkr
  • Spring-data-cassandra 1.3.4 与 Cassandra 3.x 不兼容

    我尝试使用 Spring data cassandra 1 3 4 以及最新的 cassandra driver core 3 0 0 在 Cassandra 2 1 12 作为 DSE 4 8 4 的一部分 上 一切正常 因为相同的 sp
  • React 是否保证“props”对象引用保持稳定?

    最近我看到类似于以下人为示例的代码 const MyComp props gt const prevProps setPrevProps useState props if props prevProps setPrevProps prop
  • 编写一个监听 USB 端口的小实用工具,需要建议

    我有一个可以循环工作的硬件 它配备了专有的软件工具 让用户可以通过 USB 从 PC 控制它 用户定义每个周期的长度 在每个周期开始时 软件工具通过 USB 快速向硬件发出一系列命令 然后进入空闲模式 等待下一个周期 还有第二个硬件需要与第