Не удалось подключиться к USB на Chromebook: разрешение на доступ к устройству было отклонено

Я пишу приложение для Chromebook, которое должно взаимодействовать с определенным USB-устройством. Устройство присутствует в списке найденных устройств, который поступает из обратного вызова:

   var VENDOR_ID = 5824, PRODUCT_ID = 1159;

   document.getElementById("request-permission").addEventListener('click', function() {
    chrome.permissions.request({
            permissions: [{
                'usbDevices': [{
                    'vendorId': VENDOR_ID,
                    "productId": PRODUCT_ID
                }]
            }]
        },
        function(result) {
            if (result) {
                console.log('App was granted the "usbDevices" permission.');
                getDevices();
            }
        }
    });
});


function getDevices() {
    chrome.usb.getDevices({
        vendorId: VENDOR_ID,
        productId: PRODUCT_ID
    }, function(devices) {
        if (chrome.runtime.lastError !== undefined) {
            console.warn('chrome.usb.getDevices error: ' + chrome.runtime.lastError.message);
            return;
        }
        if (devices) {
            if (devices.length > 0) {
                for (var device of devices)
                    openUsbDevice(device);
            }
        }
    }); 
}

Итак, я могу успешно увидеть свое устройство, но когда я пытаюсь его открыть, это не удается:

chrome.usb.openDevice(device, function(handle) {
        if (chrome.runtime.lastError != undefined) {
          console.log('Failed to open device: '+chrome.runtime.lastError.message);
        } else {
          populateDeviceInfo(handle, function () {
              chrome.usb.closeDevice(handle);
            });
        }
      });

И я получаю сообщение об ошибке в консоли: Не удалось открыть устройство: разрешение на доступ к устройству было отклонено

У меня есть все необходимые разрешения USB, объявленные в manifest.js:

  "permissions" : [
    "usb"
  ],
  "optional_permissions" : [{
    "usbDevices" : [
        {
          "productId" : 1159,
          "vendorId" : 5824
        }
      ]
  }],

Я также пробовал другие функции API, такие как chrome.usb.findDevices и chrome.usb.requestAccess , но результат тот же. В то же время мое устройство nexus 7, например. через usb распознается успешно. Любые идеи, почему это может быть, или догадки, как сделать мое USB-устройство доступным? Я сталкивался с этим только на Acer Chromebook c7 (Chrome OS v.44), а на Mac такой проблемы не было.


person gabin    schedule 01.09.2015    source источник


Ответы (1)


Откройте chrome://system и разверните раздел «syslog». Вы найдете серию сообщений от «permission_broker» для каждого устройства, которое вы пытаетесь открыть, и правило, которое заставило его запретить доступ.

Наиболее распространенная причина — «DenyClaimedUsbDeviceRule», которая запрещает доступ к устройствам, на которые претендует другое приложение или драйвер ядра. В этом случае доступ запрещен из соображений безопасности. Chrome OS не хочет, чтобы приложение Chrome могло переопределять любые политики, обычно применяемые ядром для устройств, которые оно поддерживает. Вам следует использовать API более высокого уровня (например, chrome.fileSystem для устройств хранения данных или navigator.getUserMedia для веб-камер и аудиоадаптеров).

person Reilly Grant    schedule 02.09.2015
comment
К сожалению, это похоже на мой случай ... У меня есть следующие журналы, отфильтрованные с помощью разрешения_брокера [6586]: DenyClaimedUsbDeviceRule: DENY Вердикт для /dev/bus/usb/002/028: DENY Диспетчерский вызов метода DBus: RequestPathAccess ProcessPath(/dev/ bus/usb/002/028) AllowUsbDeviceRule: ALLOW AllowTtyDeviceRule: IGNORE DenyClaimedUsbDeviceRule: DENY Вердикт для /dev/bus/usb/002/028: DENY Мое устройство имеет специальные функции, такие как измерение температуры, и нет возможности использовать более высокий уровень API, только необработанная связь USB. - person gabin; 02.09.2015
comment
Можете ли вы добавить больше информации об устройстве? Какие протоколы он поддерживает? Это составное устройство? Возможно, это HID-устройство? - person Reilly Grant; 03.09.2015