2

我在 usbmon3 上使用 Wireshark 来分析进出 USB 的数据包。因此,当我插入设备时,Wireshark 会向我显示发送的内容和接收的内容。

发送发送USB设备描述请求

已收到: 在此处输入图像描述

我正在尝试做同样的事情,但使用 Webusb。这是我在javascript中的代码:

navigator.usb.requestDevice({ filters: [{ vendorId: 0x0403 }] })
    .then(selectedDevice => {
        device = selectedDevice;
        return device.open(); // Begin a session.
    })
    .then(() => device.selectConfiguration(1)) // Select configuration #1 for the device.
    .then(() => device.claimInterface(0)) // Request exclusive control over interface #0.
    .then(() => device.controlTransferOut({
        requestType: 'standard',
        recipient: 'device',
        request: 0x06,
        value: 0x00,
        index: 0x00}))
    .then(() => device.transferIn(1, 64))
    .then(result => {
        let decoder = new TextDecoder();
        console.log('Received: ' + decoder.decode(result.data));
    })
    .catch(error => {
         console.log(error); 
    });

我在控制台日志中得到的是:什么都没收到我认为这完全没有。

当然,我知道如果我只是console.log(device)在我的控制台中收到设备描述。但我试图了解函数本身,主要是requestType, recipient, request, value, index通过发送相同的GET DESCRIPTOR (0x06)命令(如第一张图片)并接收该console.log('Received: ' + decoder.decode(result.data));部分中的设备描述来了解应该进入字段的内容。我尝试做这么简单的事情的原因是因为我将沿着连接到此 USB 设备的其他设备进行更多传输,所以我需要了解在这些参数中发送什么。

使用该功能后,我再次查看 Wireshark 以了解为什么我没有得到任何东西,然后我得到了这个:在此处输入图像描述

我假设这Broken pipe (-EPIPE) (-32)是我没有收到任何回复的原因。我不知道我在哪里做错了,我完全迷失了。

谢谢 !!

4

1 回答 1

1

您的代码不能完全重现您在 Wireshark 中看到的请求。为此,您需要,

device.controlTransferOut({
    requestType: 'standard',
    recipient: 'device',
    request: 0x06,
    value: 0x0100,
    index: 0x0000})).then(result => {
  // Parse the device descriptor from result.data.
});

对于 GET_DESCRIPTOR 请求,第一个字节value是描述符类型,第二个字节是描述符索引。这记录在 USB 规范中,您可以从usb.org下载:

USB 1.1 规范第 9.4.3 节的屏幕截图

您拨打的transferIn()电话是不必要的。控制转移的结果在 中提供result。呼叫transferIn()将在指定端点上启动新的传输。

描述符请求返回的数据不是文本,因此您将无法使用 TextDecoder 对其进行解析。result.data是一种DataView方便的方法,可以从任何索引读取各种大小的值。设备描述符的结构也包含在规范中:

USB 1.1 规范中表 9-7 的屏幕截图 USB 1.1 规范中表 9-7(续)的屏幕截图

于 2019-11-20T23:52:11.413 回答