发送数据 blink(1) 设备

Sending data blink(1) device

我刚开始研究 webusb 并尝试用它来打开 blink(1) mk2。我能够发现设备,打开它,声明一个接口并调用 controlTransferOut。我现在遇到的问题是不知道我应该发送什么数据才能使它闪烁或亮起。

我一直在使用 this example,有人可以使用 Chrome 扩展来控制它,使用 chrome.usb 界面作为尝试让它工作的灵感。我写了下面的代码:

const VENDOR_ID = 0x27b8;

navigator.usb.requestDevice({
  filters: [{
    vendorId: VENDOR_ID
  }]
}).then(selectedDevice => {
  device = selectedDevice;
  return device.open();
}).then(() => {
  return device.selectConfiguration(1);
}).then(() => {
  return device.claimInterface(0);
}).then(() => {
  return device.controlTransferOut({
    requestType: 'class',
    recipient: 'interface',
    request: 0x09,
    value: 1,
    index: 0
  });
}).then(() => {
  const r = Math.floor((Math.random() * 255) + 0);
  const g = Math.floor((Math.random() * 255) + 0);
  const b = Math.floor((Math.random() * 255) + 0);
  // not entirely sure what is going on below...
  const fadeMillis = 500;
  const th = (fadeMillis / 10) >> 8;
  const tl = (fadeMillis / 10) & 0xff;

  const data = new Uint8Array([0x01, 0x63, r, g, b, th, tl, 0x00, 0x00]).buffer;
  return device.transferIn(1, data);
}).then(result => {
  console.log(result);
}).catch(error => {
  console.log(error);
});

调用 controlTransferOut 时失败并出现传输错误。但是,如果我将 requestType 更改为标准,则在调用 transferIn.

时它会继续失败

我怎样才能找出要使其正常工作所需的数据和数据格式?

您需要在第一个 controlTransferOut 中包含 datatransferIn 不向设备发送数据,它接收数据。

编辑添加:不幸的是,没有通用的方法来确定发送到 USB 设备或从 USB 设备接收的数据的正确格式,如果它没有实现标准设备的话class。 blink(1) mk2 使用 HID 协议,但它发送和接收的功能报告的特定格式是非标准的。