跳转到内容

分离 USB 捕获中的 RGB 数据

本教程将向您展示如何解码 USB 数据以在 SignalRGB 中实现设备。

在尝试解读 USB 数据捕获之前,我们需要对其进行排序以找到一些特定的数据包。

在 Wireshark 中:

  1. 打开 USB 数据捕获
  2. 点击”Info”标题按数据包类型排序
  3. 滚动直到找到 URB_INTERRUPT OUTSET_REPORT Request 类型

如果您找不到上述任何一种命令,您可能使用的是 RAWUSB 设备,或者您可能没有正确进行捕获。如果您有 RAWUSB 设备,您将看到 URBBULK_OUTURB_CONTROL OUT 命令。如果您有 RAWUSB 设备,请加入此 Discord 服务器获取开发帮助

我们首先要查找的数据包是包含我们在进行 USB 数据包捕获时设置的 RGB 值的数据包。

注意:我们现在暂时忽略设备初始化数据包。稍后可能需要这些数据包。

每个数据包中发送的数据位于所有 USB 协议头信息之后。要查看这些内容,我们需要找到 Data Fragment 部分。

  1. 选择一个数据包
  2. 选择 HID Data 字段,或展开 Setup Data 部分并选择 Data Fragment 字段
  3. 点击该字段还应在 Wireshark 底部以蓝色高亮显示数据部分
  4. 所选字段还将显示不带间距的发送数据。在此视图中,每 2 个字符是一个字节。

注意:我们查看的值将采用 HEX(十六进制,基数 16)格式,这是一种将十进制的 0 到 255 表示为 0x00 到 0xFF 的数据格式。

由于我们在捕获 USB 数据指南中将红色、绿色和蓝色设置为最大值,我们将在数据包捕获中查找 0xFF 的值。如果您在捕获中使用了不同的颜色,您需要知道使用的特定 HEX 颜色,或使用已知颜色重新捕获。

传统上,设备的灯光数据包包含一个标头,表示数据包适用于哪个命令以及我们正在寻址设备的哪个灯光区域,然后是 RGB 数据,很少有像 CRC 校验和这样的页脚数据。

RGB 数据通常遵循几种格式,我们可以通过在捕获中查找设置的颜色来检查:

  • R, G, B, R, G, B, R, G, B(红 -> 绿 -> 蓝 -> 重复)
  • RRR, GGG, BBB(几个红 -> 几个绿 -> 几个蓝 -> 重复)
  • Br, R, G, B(亮度 -> 红 -> 绿 -> 蓝 -> 重复)

注意:某些设备将使用不同的颜色顺序。虽然大多数使用 RGB,但您可能发现您的设备使用 GBR、BGR 或其他组合。

在我们的例子中,我们要查找的值为:

  • 0xff, 0x00, 0x00 | 0x00, 0xff, 0x00 | 0x00, 0x00, 0xff(如果设备使用 R,G,B 数据包顺序)。
  • 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00(如果设备使用 RRR,GGG,BBB 数据包顺序)。
  • 0xff, 0xff, 0x00, 0x00 | 0xff, 0x00, 0xff, 0x00 | 0xff, 0x00, 0x00, 0xff(如果设备使用 Br,R,G,B 数据包顺序)

注意:以上示例只是设备的一些常见数据包结构,并不总是适用。您需要比较并寻找相似之处。

在数据包中向下滚动,我们发现捕获中的数据包 271 包含看起来类似于 R,G,B 数据包结构的字节。

注意:某些设备可能使用多个数据包来设置整个设备的颜色。确保您查看后续数据包,并确保找到初始数据包重复的位置。

我们将通过使用 Wireshark 中的 MARK/UNMARK Packet 功能来标记此数据包,可以通过同时按下 CTRL + M 键或右键点击数据包并点击 MARK/UNMARK Packet 来完成。

为了确认此数据包确实是我们的颜色数据包之一,我们将继续向下滚动以查找更多符合 R,G,B 结构的数据包。我们还将查看这些数据包是否遵循我们在原始软件中设置颜色的顺序。现在也是查看数据包标头并查看它们是否改变的好时机。如果它们按某种规律改变,则很可能需要多个数据包来设置设备上的所有 LED。

并排查看数据包 271、273 和 275,我们可以看到 RGB 数据在数据包 271 上只有红色(0xFF, 0x00, 0x00),在数据包 273 上只有绿色(0x00, 0xFF, 0x00),在数据包 275 上只有蓝色(0x00, 0x00, 0xFF)。查看 RGB 部分上方的标头数据,我们可以看到这三个数据包之间的数据没有变化。这很可能意味着我们正在这些数据包中更改相同的颜色区域。

  • 另外值得注意的是,我们可以使用颜色数据包来确定设备包含多少个区域。我们可以通过检查我们已知的值在 RGB 数据包中出现多少次来找到这一点。查看下面的示例,我们看到该设备有 4 个我们可以明确寻址的区域。

我们将继续浏览数据包,直到找到所有包含颜色数据的数据包并将它们标记。之后,我们将继续创建插件文件。