Утилита socat

Материал из Wiren Board
Версия от 17:55, 25 апреля 2023; Matveevrj (обсуждение | вклад) (Новая страница: «{{Draft}} {{DISPLAYTITLE: Утилита socat}} ==Общие сведения== '''socat''' — утилита, которая может переадресовывать сокеты с хостовой машины, на клиентскую. Работает только с протоколом Modbus over TCP. ===Установка=== Для установки socat на контроллер Wiren Board выполните в консоли: <syntaxhig...»)

Это черновик страницы. Последняя правка сделана 25.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. Она будет работать, только если выполнены два условия.

  1. Режим шлюза должен быть TCP Server/None (для WB-MGE v2, WB-MIO-E v2) или TCP Server (для WB-MGE v1, WB-MIO-E v1).
  2. Modbus-устройства и шлюз должны иметь следующие настройки обмена по интерфейсу RS-485:
    • скорость — 9600 бит/с,
    • биты данных — 8,
    • бит четности — нет,
    • количество стоп-битов — 2.

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

Пример конфигурации

Для примера возьмём конфигурацию:

  • Шлюз 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
    

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

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