【问题标题】:Why is chrome.usb.openDevice failing?为什么 chrome.usb.openDevice 失败?
【发布时间】:2014-03-17 04:14:53
【问题描述】:

我正在尝试使用 chrome.usb API 从 Chrome 应用程序与 USB 设备通信。虽然我可以使用chrome.usb.getDevices 找到设备,但我无法使用chrome.usb.openDevice(回调获取未定义的ConnectionHandle)或chrome.usb.findDevices(回调获取ConnectionHandle 的空列表)连接到它。

有什么方法可以找出错误发生的原因吗? USB caveats 部分指出,如果现有驱动程序已声明该设备,则无法打开该设备,但我认为这里不是这种情况。有没有办法进一步调试? USB 指南还说 chrome.extension.lastError 设置为传输错误,但 chrome.extension 未定义,因此帮助不大。

我不认为现有驱动程序正在认领该设备。我在 OSX 上运行 Chrome,该设备是一支包含 Obex 通信接口的笔。

目前,我的代码基本上是USB hello world的摘录:

manifest.json:

{
  "manifest_version": 2,
  "name": "USB Hello world",
  "version": "0.1",
  "minimum_chrome_version": "26",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "usb",
    {"usbDevices": [
      {
        "vendorId": 7419,
        "productId": 4112
      }
    ]}
  ]
}

background.js:

var deviceId = {"vendorId": 7419, "productId": 4112},  // 0x1cfb, 0x1010 Livescribe Pulse(TM) Smartpen
chrome.usb.getDevices(deviceId, onDeviceFound);

function onDeviceFound(devices) {
  console.log("onDeviceFound", devices);
  if (0 !== devices.length) {
    var device = devices[0];
    window.device = device;
    chrome.usb.openDevice(device, onOpenDevice);
  }
}
function onOpenDevice(connectionHandle) {
  if (connectionHandle) {
    console.log("Device opened.");
  } else {
    console.log("Device failed to open.");
  }
}

控制台日志很简单

onDeviceFound [{"device":6,"productId":4112,"vendorId":7419}]
Device failed to open. 

编辑:顺便说一句,该设备在 Linux 上打开时不会出错。

【问题讨论】:

  • 你说“我不认为这里是这种情况。”为什么不?我在搜索引擎中输入了产品名称,发现:github.com/aliendude5300/LibreScribe/issues/10,这表明它是 HID 级设备。这意味着您需要关注 code.google.com/p/chromium/issues/detail?id=290428 以获取新 API(请参阅此处的开发中:code.google.com/p/chromium/codesearch#chromium/src/chrome/…
  • @sowbug,我的笔是 Pulse,它比 LibreScribe 问题中提到的 Echo 还要老。对我来说, lsusb -v(来自 Linux 机器)看起来略有不同,并且没有 HID 信息。 gist.github.com/yonran/9603267
  • 我尝试了 chrome.hid API。显然它不是 HID 设备。 (chrome.hid.getDevices({vendorId:0x1cfb, productId:0x1010}, function(devices){console.log(devices);}) 显示了一个长度为 0 的数组,而chrome.usb.getDevices({vendorId:0x1cfb, productId:0x1010}, function(devices){console.log(devices);}) 给出了一个长度为 1 的数组。)
  • 这个问题可能是相关的。您不能使用 libusb 与 OSX 上的 CDC 接口进行通信。也许 Chrome 和 libusb 有同样的限制。 stackoverflow.com/questions/20253350/…
  • 我在任何地方都找不到 Livescribe SDK。有人有吗?如果需要,我可以支付。 vova@77xy.net

标签: google-chrome-extension google-chrome-app


【解决方案1】:

尝试退出 chrome.runtime.lastError()

在 OS X 上测试 USB 访问时,我们发现 Chrome 在本地客户端应用程序(使用 hidapi)运行并识别设备之前无法访问 USB 设备。

在 Chromebook 上,我发现除非从用户操作调用 chrome.usb.findDevices(),否则我实际上无法访问设备。尝试将链接添加到调用该方法的页面,看看是否能获得更好的结果。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2015-06-19
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多