Re[3]: Как надежно различать два одинаковых USB-устройства в Window
От: velkin Удмуртия https://kisa.biz
Дата: 09.01.25 16:44
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>То есть, у Вас таки получилось надежно адресовать устройство по расположению разъема?


Да, именно по расположению разъёма, но не на USB хабе, а на материнской плате.

ЕМ>А сколько в системе встроенных USB-хабов?


Давай определимся с терминологией.

USB разъёмы на материнской плате.



USB Hub (концентратор, разветвитель)




Преобразователь USB на RS-232 (ttyUSB, COM-port)



ЕМ>У меня под рукой только ноутбуки, в каждом по одному хабу, поэтому у себя я тоже не вижу изменений при перезагрузке. А у юзера десктоп, хабов несколько, и они, судя по всему, при перечислении определяются в случайном порядке.


У меня путь ttyUSB#, то есть ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3 и так далее всё время скакал от устройства к устройству. Это как в Windows был бы COM1, а после перезагрузки стал COM2, а после перевтыкания разъёма опять COM1 или COM3 и так далее. Да, все аналогии с Windows очень условны.

Потому я вместо ttyUSB#, то есть ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3 создал псевдонимы прибитые к разъёмам USB на материнке и использую для обращения именно псевдонимы ttyUSB_1_2, ttyUSB_1_4, ttyUSB_1_3, ttyUSB_1_5. Причём я мог бы назвать псевдонимы как угодно. И даже мог бы сделать проверку пути вместе с проверкой идентификатора вендора и продукта, просто мне это не нужно.
/etc/udev/rules.d/10-local.rules

SUBSYSTEM=="tty", ATTRS{devpath}=="1.2", SYMLINK+="ttyUSB_1_2", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.4", SYMLINK+="ttyUSB_1_4", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.3", SYMLINK+="ttyUSB_1_3", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.5", SYMLINK+="ttyUSB_1_5", OWNER="velkin", GROUP="dialout", MODE="0666"

Фактически я исключил ту часть пути, которая идёт после выделенного

looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0'

Там может быть случайно назначаемый ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3, ttyUSB4, ttyUSB5, ttyUSB6 и так далее, но мне нужен псевдоним только на.

looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2


У меня была идея использовать ещё и USB Hub, но в принципе хватило и разъёмов на материнской плате. Метод которым я действовал тоже изложил. Создаёшь листинги по известным параметрам, потом сравниваешь kdiff3, которая так же есть в Windows.

Смысл в том, что ttyUSB# воткнутого устройства всё время меняется, но путь разъёма на материнской плате не меняется, это ATTRS{devpath}. А вот с путём USB Hub надо ещё провести опыты.

В мире программирования очень много абстракций. Это надо конкретно сесть за твой код и твои устройства. И даже не только твои, нужно ещё симулировать ситуацию как у твоего пользователя. А дальше по науке логике, анализ (разбор), синтез (сбор) и сравнение.

И повторюсь, всё это чисто для размышления. Потому что сразу готового программного решения как на stackoverflow у меня конкретно для Windows и его библиотек нет. А людей, которые уже решили эту задачу в комментариях можно ждать очень долго.

Ещё есть такое обстоятельство, что если программист решает, что что-то сделать невозможно, он это и не делает. Иногда нужна мотивация, что хотя бы чисто теоретически такое возможно. Я, конечно, за это не поручусь, но тем не менее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.