Socat: различия между версиями

Материал из Wiren Board
 
(не показано 12 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{Draft}}
{{DISPLAYTITLE: Утилита socat}}
{{DISPLAYTITLE: Утилита socat}}


Строка 24: Строка 23:
===socat в контроллере Wiren Board===
===socat в контроллере Wiren Board===
В контроллере Wiren Board утилиту socat можно использовать для следующих задач:
В контроллере Wiren Board утилиту socat можно использовать для следующих задач:
* обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E,
* [[WB_Modbus_Devices_Firmware_Update#Обновление_прошивки_устройств,_подключенных_к_шлюзам_WB-MGE_и_WB-MIO-E |обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E]],
* конфигурирование устройств, подключенных к шлюзам WB-MGE и WB-MIO-E, через консоль,
* [[Socat#Конфигурирование_устройств_с_помощью_modbus_client |конфигурирование устройств]], подключенных к шлюзам WB-MGE и WB-MIO-E, через консоль,
* доступ к портам RS-485 контроллера из консоли компьютера.
* [[Socat#Получение_доступа_к_порту_RS-485_контроллера_Wiren_Board_с_компьютера |доступ к портам RS-485]] контроллера из консоли компьютера.
 
==Обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E==
 
Для обновления прошивки устройства требуется доступ контроллера к интернету. Поэтому вам придется задействовать оба Ethernet порта контроллера: один со статическим IP-адресом — для подключения шлюза, второй — для доступа к интернету. Порты можно легко сконфигурировать в [[Networks | веб-интерфейсе контроллера]].
[[Image: superport-config.png |350px|thumb|right| Настройки шлюза для обновления прошивки]]
Для обновления прошивки используется утилита  [[Wb-mcu-fw-updater | wb-mcu-fw-updater]]. Она может обновлять прошивки устройств, подключенных к локальному serial-порту со стандартными настройками соединения: '''9600 8N2'''.
 
Поэтому для прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E, придется отобразить сетевой порт в локальный, с помощью утилиты socat.
 
Кроме того, если у вас используются нестандартные настройки соединения, например, '''115200 8N2''', то для обновления прошивок потребуется сначала установить настройки по умолчанию. Потому что загрузчик устройств может работать только на скорости '''9600 8N2'''. Для этого нужно записать нужные значения параметров в Modbus-регистры устройства утилитой [[Modbus-client | modbus-client]].
 
Шлюз должен быть настроен в режим TCP Server/None (для WB-MGE v2, WB-MIO-E v2) или TCP Server (для WB-MGE v1, WB-MIO-E v1).
 
===Пример конфигурации===
Рассмотрим синтетический пример обновления прошивки устройств, в котором используются нестандартные настройки соединения. В вашем случае параметры могут отличаться.
 
Предположим, что есть конфигурация:
*Шлюз WB-MGE (WB-MIO-E), настроенный на Modbus over TCP и имеющий IP-адрес 192.168.0.7, порт 23.
*К шлюзу подключено устройство WB-MDM3 с адресом 58.
*В настройках устройства и шлюза выставлена скорость 115200 кбит/с.
 
===Инструкция===
Чтобы обновить прошивку:
#Дважды подключитесь к контроллеру по SSH, у вас должно быть открыто два окна: первое для создания тоннеля socat, второе для отправки команд устройству.
#Остановите wb-mqtt-serial:
#:<syntaxhighlight lang="bash">
systemctl stop wb-mqtt-serial
</syntaxhighlight>
#В первом окне запустите перенаправление:
#:<syntaxhighlight lang="bash">
socat -d -d -d -x PTY,raw,b115200,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
</syntaxhighlight>
#:если у вас стабильный релиз до wb-2207 включительно, вместо параметра b115200, используйте <code>ispeed=115200,ospeed=115200</code>.
#Во втором окне измените скорость порта устройства на 9600 кбит/с:
#:<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b115200 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 96
</syntaxhighlight>
#В первом окне разорвите соединение socat клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
#В [[socat#Настройка шлюза для обновления прошивки | настройках шлюза]] установите скорость порта 9600 кбит/с.
#В первом окне снова запустите перенаправление socat с новыми параметрами соединения:
#:<syntaxhighlight lang="bash">
socat -d -d -d -x PTY,raw,b9600,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
</syntaxhighlight>
#:если у вас стабильный релиз до wb-2207 включительно, вместо параметра b9600, используйте <code>ispeed=9600,ospeed=9600</code>.
#Во втором окне запустите обновление прошивки устройства, например, утилитой wb-mcu-fw-updater:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-updater update-fw /dev/ttyRS485-5 -a58
</syntaxhighlight>
#После окончания прошивки верните в устройстве старую скорость 115200 кбит/с:
#:<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 1152
</syntaxhighlight>
#В первом окне разорвите соединение socat клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
#В настройках шлюза измените скорость порта с 9600 кбит/с на 115200 кбит/с.
#Подключите шлюз к контроллеру по Ethernet.
#Запустите wb-mqtt-serial
#:<syntaxhighlight lang="bash">
systemctl start wb-mqtt-serial
</syntaxhighlight>
 
Если вам нужно прошить несколько устройств, то вы можете сперва изменить им скорость, перенастроить шлюз, а потом так же поочереди их прошить, вернуть им прежнюю скорость и снова перенастроить шлюз.
 
===Настройка шлюза для обновления прошивки===
 
Самый простой способ изменить настройки шлюза — подключиться к его встроенному веб-интерфейсу. Для этого нужно:
 
#подключить шлюз к компьютеру UTP кабелем напрямую или через роутер,
#присвоить компьютеру статический IP-адрес в сети шлюза, например, 192.168.0.201,
#открыть браузер и ввести IP-адрес шлюза, по умолчанию 192.168.0.7.


== Конфигурирование устройств с помощью modbus_client ==
== Конфигурирование устройств с помощью modbus_client ==

Текущая версия на 15:46, 29 ноября 2023


Общие сведения

socat — утилита, которая может переадресовывать сокеты с хостовой машины, на клиентскую. Работает только с протоколом Modbus over TCP.

Установка

Для установки socat на контроллер Wiren Board выполните в консоли:

apt install socat

С последовательным портом может работать только один процесс, поэтому убедитесь перед запуском socat, что нужный вам порт никто не занимает:

fuser -v /dev/ttyRS485-1

                 	USER    	PID ACCESS COMMAND
/dev/ttyS2:      	root  	32296 F.... wb-mqtt-serial

В нашем случае порт занят драйвером wb-mqtt-serial — остановим его командой:

systemctl stop wb-mqtt-serial

socat в контроллере Wiren Board

В контроллере Wiren Board утилиту socat можно использовать для следующих задач:

Конфигурирование устройств с помощью modbus_client

В последних релизах ПО контроллера конфигурирование Modbus-устройств, подключенных к WB-MGE (WB-MIO-E) по сети RS-485, выполняется из веб-интерфейса контроллера. Настоящая инструкция может быть полезна, если вы используете устаревшую версию контроллера или у вас нет доступа к веб-интерфейсу.

Утилита modbus_client не умеет работать с протоколом Modbus over TCP, который используется для коммуникации с модулями WB-MGE и WB-MIO-E по сети Ethernet. Поэтому для конфигурирования Modbus-устройств, подключенных к WB-MGE и WB-MIO-E по сети RS-485 нужно cоздать виртуальный порт с помощью утилиты socat.

Чтобы создать виртуальный порт:

  1. Остановите сервис wb-mqtt-serial:
    service wb-mqtt-serial stop
    
  2. Запустите перенаправление:
      socat -d -d -d -x PTY,raw,b115200,parenb=0,cstopb=1,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23&
    
    если у вас стабильный релиз до wb-2207 включительно, вместо параметра b115200, используйте ispeed=9600,ospeed=9600.

В системе появится виртуальный порт /dev/ttyRS485-5, с которым можно работать как с локальным.

Теперь можно открыть второй терминал и, с помощью утилиты modbus_client читать и записывать значения в регистры устройств, подключенных к шлюзу по сети RS-485. В качестве адреса используется Modbus-адреса устройств. При этом в первом терминале остается запущенной команда socat.

Получение доступа к порту RS-485 контроллера Wiren Board с компьютера

Внимание! Инструкцию следует выполнять только в закрытой подсети. Не следует давать доступ к RS-485 портам по TCP, если Wiren Board доступен по реальному IP снаружи.

Допустим, контроллер Wiren Board имеет IP 192.168.3.12. Выполните в консоли:

socat -d -d -d -x /dev/ttyRS485-1,raw,b9600,parenb=0,cstopb=1,cs8 TCP-LISTEN:10010&
socat -d -d -d -x /dev/ttyRS485-2,raw,b9600,parenb=0,cstopb=1,cs8 TCP-LISTEN:10011&

если у вас стабильный релиз до wb-2207 включительно, вместо параметра b9600, используйте ispeed=9600,ospeed=9600.

Обратите внимание на кодирование количества стоп-битов: cstopb=1 — 2 стоп-бита, cstopb=0 — 1 стоп-бит. Параметр cstopb имеет булевский тип; подробнее смотрите в интернете man socat. Выполните на компьютере под Linux:

socat -d -d -d -x PTY,raw,b9600,parenb=0,cstopb=1,cs8,link=/dev/ttyRS485-1 tcp:192.168.3.12:10010&
socat -d -d -d -x PTY,raw,b9600,parenb=0,cstopb=1,cs8,link=/dev/ttyRS485-2 tcp:192.168.3.12:10011&
sudo ln -fs /tmp/ttyRS485-{1,2} /dev

если у вас стабильный релиз до wb-2207 включительно, вместо параметра b9600, используйте ispeed=9600,ospeed=9600.

После выполнения этих команд в системе компьютера появляются специальные файлы /dev/ttyRS485-1 и /dev/ttyRS485-2, соответствующие RS-485 портам Wiren Board.

Последняя команда для удобства создаёт в /dev символические ссылки на файлы портов. Опции -d и -x в обоих случаях можно опустить — они нужны для вывода диагностики и шестнадцатеричных дампов передаваемых данных.

Информация по теме на портале