Я создаю пользовательское USB HID устройство и настольное приложение для него, используя HIDAPI на Lubuntu 16.04.3 LTS. Назовем его myapp
пока.
Видимо, если я делаю $ ./myapp
, libusb_open()
происходит сбой с LIBUSB_ERROR_ACCESS
. (в моем отладчике это отображается как -3
; потребовалось некоторое время, чтобы это выяснить, поскольку перечисление, похоже, не очень хорошо документировано)
Но если я делаю $ sudo ./myapp
, это происходит успешно.
Я действительно не хочу myapp
иметь права root, так как я могу общаться с моим USB-устройством без них?
Я надеялся на ответ.здесь, но, похоже, именно в этот момент его и забросили. Там что-то написано о разрешениях пользователей, но я не могу найти это в своей системе. Я думал, что найду группу под названием usb
или libusb
, в которую я мог бы себя добавить, но не тут-то было.
Этот вопрос на другом сайте SEесть ответ, который использует некоторые строгие текстовые файлы для изменения разрешений либо глобально (вероятно, плохая идея), либо для конкретного устройства, но:
- Это не «магловская хитрость», которую я искал.
- Большинство этих файлов имеют предупреждение против прямого изменения, поскольку они генерируются автоматически. Так как я могу быть уверен, что случайное обновление пакета не сотрет мои изменения и, таким образом, не сломает
myapp
? - Кажется, это ничего не делает. Я следовал этим инструкциям и перезагрузился, но
myapp
с правами пользователя все еще не могу общаться с USB.
решение1
Это все еще не та «магловская хитрость», которую я действительно ищу, но, по крайней мере, это работает:
Судя по всему, для udev существует два каталога (понятия не имею, почему):
/etc/udev/rules.d
/lib/udev/rules.d
Я возился с /lib
одним и ничего не вышло. Я нашел /etc
одинздесь, и это работает:
ПомещатьSUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"
VID
этоИдентификатор поставщика, назначенный USB-IFрассматриваемого устройства *PID
это присвоенный поставщиком идентификатор продукта рассматриваемого устройства *0666
предоставляет универсальный доступ на чтение/запись для всего, что соответствует этой строке*
$ lsusb
чтобы увидеть все подключенные USB-устройства и их идентификаторы.
В /etc/udev/rules.d/xx-my-rule.rules
(могут потребоваться права root/sudo)
xx
любое число > 50 (значение по умолчанию — 50, более высокие числа имеют приоритет)my-rule
как хотите это называйте- должен заканчиваться на
.rules
Затем udevadm control --reload-rules
(также могут потребоваться права root/sudo), и это должно «просто работать» для этой конкретной пары VID/PID.
Другой вариант, чтобы немного ужесточить разрешения, — использовать TAG+="uaccess"
вместо MODE="0666"
. Это ограничивает доступ для текущего вошедшего в систему (физического) пользователя, а не для всех пользователей. Спасибо @Lekensteyn!
решение2
Для тех, кто еще с этим борется - мне нужно было добавитьГРУППА="plugdev"в правило udev в Ubuntu 18.04, чтобы это заработало.
поэтому для моего адаптера BTD-400 файл/etc/udev/rules.d/51-usb-device.rulesчитает:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e8", GROUP="plugdev", TAG+="uaccess"