我刚开始研究webusb并尝试使用它打开blink(1) mk2。我能够发现设备,打开它,声明一个界面并致电controlTransferOut
。我现在遇到的麻烦是不知道我应该发送什么数据来使它闪烁或点亮。
我一直在使用this example,有人能够使用chrome.usb
界面使用Chrome扩展程序来控制它,以便尝试让它发挥作用。我写了以下代码:
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
时会继续失败。
如何才能找到数据以及数据需要的格式才能使其正常工作?
答案 0 :(得分:1)
您需要在第一个data
中加入controlTransferOut
。 transferIn
不会向设备发送数据,而是会收到数据。
已编辑添加:遗憾的是,如果没有实现标准设备类,则无法确定正确的格式是否适用于发送到USB设备或从USB设备发送的数据。闪烁(1)mk2使用HID协议,但它发送和接收的功能报告的特定格式是非标准的。