Привязка Arduino к определемнному порту через udev.
Сделал я исполнительную часть для умного дома на ардуино, которая релюшками клацает, так вот сильно раздражает то, что OpenHAB цепляет этот порт ttyUSB0 например и лочит его. Если перегрузить ардуину или передернуть кабель, то ардуина попадает уже на ttyUSB1, а опенхаб вообще про это не в курсе. Частично удалось решить проблему через правило udev.
Сначала смотрим USB-устройства на предмет идентификаторов:
[root@sf-srv rules.d]# lsusbProtocol spec without prior Class and Subclass spec at line 17406Bus 001 Device 003: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCamBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapterBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubНаходим нашу ардуину, это QinHeng Electronics HL-340 USB-Serial adapter и запоминаем идентификаторы, это 1a86 и 7523. Далее все обычно ищут серийный номер и пишут правило, так вот у меня это никак не работало, тогда я обратил внимание, на то как фильтрует USB VirrtualBox, так вот она использует атрибут product. Узнать его можно так:
[root@sf-srv rules.d]# udevadm info -a /dev/ttyUSB1 | grep product ATTRS{product}=="USB2.0-Serial" ATTRS{product}=="UHCI Host Controller"Наш COM-порт это USB2.0-Serial, теперь можем написать правило для udev:
Создадим файлик 99-usb-serial.rules в каталоге /etc/udev/rules.d с содержимым:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{product}=="USB2.0-Serial", SYMLINK+="arduino"Теперь в не зависимости от того на каком виртуальном порту будет висеть наша ардуина, всегда будет создан верный симлинк /dev/arduino
[root@sf-srv ~]# file /dev/arduino/dev/arduino: symbolic link to `ttyUSB1'Именно его и добавляем в стартовый скрипт openhab:
-Dgnu.io.rxtx.SerialPorts=/dev/ttyS0:/dev/arduinoВот, теперь если передернуть провод, то порт поменяется, но ссылка на него изменится и устройство будет доступно. Однако это полностью не решает проблему, openhab по прежнему не видит это устройство, без перезагрузки.
Но его можно перезагрузить тем же udev, добавляем еще одну строчку в rules.d
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{product}=="USB2.0-Serial", RUN+="/sbin/service openhab restart"Может кто знает как можно перезагрузить только дополнение serial?