Утилита socat

Материал из Wiren Board

Это черновик страницы. Последняя правка сделана 28.04.2023 пользователем Matveevrj.


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

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 можно использовать для следующих задач:

  • обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E,
  • конфигурирование устройств, подключенных к шлюзам WB-MGE и WB-MIO-E, через консоль,
  • доступ к портам RS-485 контроллера из консоли компьютера.

Обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E

Для обновления прошивки устройства требуется доступ контроллера к интернету. Поэтому вам придется задействовать оба Ethernet порта контроллера: один со статическим IP-адресом — для подключения шлюза, второй — для доступа к интернету. Порты можно легко сконфигурировать в веб-интерфейсе контроллера.

Настройки шлюза для обновления прошивки

Прошивка обновляется утилитой wb-mcu-fw-updater. Она может обновлять прошивки устройств, подключенных к локальному serial-порту со стандартными настройками соединения: 9600 8N2.

Поэтому для прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E, придется отобразить сетевой порт в локальный, с помощью утилиты socat.

Кроме того, если у вас используются нестандартные настройки соединения, например, 115200 8N2, то для обновления прошивок потребуется сначала установить настройки по умолчанию. Потому что загрузчик устройств может работать только на скорости 9600 8N2. Для этого нужно записать нужные значения параметров в Modbus-регистры устройства утилитой 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 кбит/с.

Инструкция

Чтобы обновить прошивку:

  1. Дважды подключитесь к контроллеру по SSH, у вас должно быть открыто два окна: первое для создания тоннеля socat, второе для отправки команд устройству.
  2. Остановите wb-mqtt-serial:
    systemctl stop wb-mqtt-serial
    
  3. В первом окне запустите перенаправление:
    socat -d -d -d -x PTY,raw,b115200,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
    
    если у вас стабильный релиз до wb-2207 включительно, вместо параметра b115200, используйте ispeed=115200,ospeed=115200.
  4. Во втором окне измените скорость порта устройства на 9600 кбит/с:
    modbus_client --debug -mrtu -b115200 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 96
    
  5. В первом окне разорвите соединение socat клавишами Ctrl+C.
  6. В настройках шлюза установите скорость порта 9600 кбит/с.
  7. В первом окне снова запустите перенаправление socat с новыми параметрами соединения:
    socat -d -d -d -x PTY,raw,b9600,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
    
    если у вас стабильный релиз до wb-2207 включительно, вместо параметра b9600, используйте ispeed=9600,ospeed=9600.
  8. Во втором окне запустите обновление прошивки устройства, например, утилитой wb-mcu-fw-updater:
    wb-mcu-fw-updater update-fw /dev/ttyRS485-5 -a58
    
  9. После окончания прошивки верните в устройстве старую скорость 115200 кбит/с:
    modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 1152
    
  10. В первом окне разорвите соединение socat клавишами Ctrl+C.
  11. В настройках шлюза измените скорость порта с 9600 кбит/с на 115200 кбит/с.
  12. Подключите шлюз к контроллеру по Ethernet.
  13. Запустите wb-mqtt-serial
    systemctl start wb-mqtt-serial
    

Если вам нужно прошить несколько устройств, то вы можете сперва изменить им скорость, перенастроить шлюз, а потом так же поочереди их прошить, вернуть им прежнюю скорость и снова перенастроить шлюз.

Настройка шлюза для обновления прошивки

Самый простой способ изменить настройки шлюза — подключиться к его встроенному веб-интерфейсу. Для этого нужно:

  1. подключить шлюз к компьютеру UTP кабелем напрямую или через роутер,
  2. присвоить компьютеру статический IP-адрес в сети шлюза, например, 192.168.0.201,
  3. открыть браузер и ввести IP-адрес шлюза, по умолчанию 192.168.0.7.

Конфигурирование устройств с помощью 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 в обоих случаях можно опустить — они нужны для вывода диагностики и шестнадцатеричных дампов передаваемых данных.

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