Вопрос или проблема
Я использую Ubuntu 12.04.
Мне нужно отправить команду устройству, которое я подключил к порту моего ПК. Я могу отправить команду, узнав, каковы номер шины и номер устройства.
Например, команда lsusb скажет мне, что у меня есть устройство, подключенное на шине 007 и устройстве 003.
“Bus 007 Device 003: ID 045e:00cb Google Inc.”
Однако номер устройства изменится, если я перезагружу устройство.
“Bus 007 Device 004: ID 045e:00cb Google Inc.”
Существует ли способ убедиться, что я могу отправлять команды на этот USB-порт ПК? Связывая номер устройства с этим физическим USB-портом? Или есть другие решения и способы обойти эту проблему?
Одно из решений — проверить текущую конфигурацию шины/устройства для вашего устройства, так как она также будет переносимой, и я думаю, что контроллер USB выделяет эти номера динамически. Вот как с помощью awk вы можете получить текущую шину и устройство
lsusb | grep "045e:00cb" | tr -d ':'| awk '{print "Bus="$2 " Device="$4}'
Вы можете использовать $2 и $4 любым способом, например: ls -l /dev/bus/usb/$2/$4
Ответ или решение
Для решения задачи ассоциации физического USB-порта с номером устройства USB в операционной системе Ubuntu 12.04, необходимо учитывать несколько важных аспектов. USB-устройства действительно могут менять свои номера Bus и Device при перезагрузке, так как они назначаются динамически хост-контроллером USB. Однако, существуют методы для более постоянной привязки устройств.
Шаги для ассоциации USB устройства с физическим портом
-
Использование
lsusb
для определения устройства:
Как вы уже упомянули, командаlsusb
предоставляет информацию о подключенных USB-устройствах, включая Bus и Device номер. Эта информация полезна для идентификации вашего устройства на данный момент.lsusb
-
Выявление идентификатора устройства:
Каждый USB-устройство имеет уникальный идентификатор в форматеID vendor:product
, например045e:00cb
. Этот идентификатор можно использовать для поиска информации о текущем Bus и Device. Вы можете воспользоваться следующей командой для получения текущих параметров:lsusb | grep "045e:00cb" | tr -d ':' | awk '{print "Bus="$2 ", Device="$4}'
Данная команда извлекает Bus и Device номер из вывода
lsusb
, что позволяет вам динамически определять текущие значения. -
Использование udev для статической привязки:
Чтобы избежать изменения номер Bus и Device, можно использоватьudev
для создания статических правил. Прежде всего, создайте файл правил в/etc/udev/rules.d/
, например,99-usb.rules
:sudo nano /etc/udev/rules.d/99-usb.rules
В этом файле вы можете указать правила, основанные на идентификаторе вашего устройства. Пример правила:
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="00cb", SYMLINK+="my_usb_device"
Это правило создаст символическую ссылку
/dev/my_usb_device
, которая всегда будет указывать на ваше устройство, независимо от назначения номера Bus и Device. -
Использование символической ссылки:
После создания правила, вы можете использовать эту символическую ссылку в своих скриптах, чтобы взаимодействовать с устройством, не задумываясь о том, какой Bus и Device номер у него в текущий момент:ls -l /dev/my_usb_device
-
Тестирование и проверка:
После добавления правил вам нужно перезапустить службу udev, чтобы изменения вступили в силу:sudo service udev restart
Затем подключите или отключите устройство, чтобы убедиться, что символическая ссылка создаётся корректно.
Заключение
Используя описанные методы, вы сможете ассоциировать физический USB-порт вашего устройства с уникальным идентификатором, что значительно упростит взаимодействие с устройством независимо от его текущих номеров Bus и Device. Такой подход обеспечит более стабильную работу вашего программного обеспечения при взаимодействии с USB-устройствами на Ubuntu 12.04.