Подключение RS-232/422/485 устройств через Ethernet к серверу с FreeBSD
В этом топике я хотел бы поделиться своим опытом использования конвертеров RS-232/422/485 в Ethernet Moxa nPort для подключения удаленного устройства с Serial портом (RS-232/422/485) через Ethernet к ПК. Для примера будет произведено подключение аналогового модема U.S.Robotics Courier V.Everything к виртуальному серверу, под управление ОС FreeBSD 8.0 при помощи Moxa NPort 5110A. К слову сказать, Moxa один из немногих производителей оборудования, который выпускает драйвера для своих устройств не только для популярных ОС (Windows, Linux, FreeBSD), но и для довольно таки специфических ОС (SCO OpenServer, SCO UnixWare, Solaris, QNX).
В статье я опишу принцип настройки самого конвертера, процесс настройки FreeBSD для работы с конвертером (включая создание rc-скрипта для драйвера устройства) и как бонус — поделюсь скриптом для мониторинга устройства пользователем, без доступа к настройкам устройства. И так, желающих узнать подробность — прошу под кат.
Для начала пройдемся по настройке самого конвертера. Управление устройством возможно как с помощью Web-интерфейса, так и с помощью telnet. Дальше я буду приводить пример с использованием telnet. Производитель пошел нестандартным путем и вместо DHCP присваивает всем (по крайней мере тем моделям, с которыми мне приходилось работать) устройствам статический IP — 192.168.127.254. Подключившись к устройству попадаем в главное меню:
-----------------------------------------------------------------------------
Model name : NPort 5110
MAC address : 00:90:E8:20:F4:E9
Serial No. : 1484
Firmware version : 2.2 Build 08042219
System uptime : 11 days, 06h:59m:53s
-----------------------------------------------------------------------------
\<< Main menu \>>
(1) Basic settings
(2) Network settings
(3) Serial settings
(4) Operating settings
(5) Accessible IP settings
(6) Auto warning settings
(7) Monitor
(8) Ping
(9) Change password
(a) Load factory default
(v) View settings
(s) Save/Restart
(q) Quit
Key in your selection:
Выбор пункта меню осуществляется вводом символа (цифры или буквы) который расположен в скобках перед названием меню.
Для начала настраиваем IP, маску, шлюз, DNS и параметры SNMP (лично я использую его для мониторинга устройства через Zabbix). Выбираем второй пункт и попадаем в меню сетевых настроек.
-----------------------------------------------------------------------------
\<< Main menu-\>Network settings \>>
(1) IP address
(2) Netmask
(3) Gateway
(4) IP configuration
(5) DNS server 1
(6) DNS server 2
(7) SNMP
(8) SNMP community name
(9) SNMP contact
(a) SNMP location
(b) Auto IP report to IP
© Auto IP report to UDP port
(d) Auto IP report period
(v) View settings
(m) Back to main menu
(q) Quit
Я не буду описывать каждое действие, лишь выведу список произведенных настроек, который можно получить выбрав пункт меню View settings:
IP address : 172.16.6.200
Netmask : 255.255.255.0
Gateway : 172.16.6.244
IP configuration : Static
DNS server 1 : 172.16.1.3
DNS server 2 : 172.16.1.5
SNMP : Enable
SNMP community name : Secret
SNMP contact : admin@domain.com
SNMP location :
Auto IP report to IP :
Auto IP report to UDP port : 4002
Auto IP report period(seconds) : 10
Press any key to continue...
Далее возвращаемся в главное меню (m) и сохраняем настройки (S). Устройство перегружается и можно подключиться уже к новому IP. Идем в Serial settings и выставляем нужные параметры порта:
-----------------------------------------------------------------------------
Port 1
Baud rate : 38400
Data bits : 8
Stop bits : 1
Parity : None
Flow control : RTS/CTS
FIFO : Enable
Interface : RS-232
Press any key to continue...
Далее идем в меню Operating settings:
-----------------------------------------------------------------------------
Port 1 : Real COM Mode
TCP alive check time (0-99min) : 7
Max connection : 1
Packing length : 0
Delimiter 1 : (Disable) 0
Delimiter 2 : (Disable) 0
Delimiter process : Do Nothing
Force transmit : 0
Press any key to continue...
Тут важно удостовериться, что устройство работает в Real COM Mode, т.к. драйвер для FreeBSD умеет работать только в этом режиме.
В Accessible IP settings ограничиваем доступ к устройству только с IP сервера:
Key in your selection: v
Enable the accessible IP list : Enable
1 Enable 172.16.0.10 255.255.255.255
2 Disable 255.255.254.255
----------------------------------------------------------------
16 Disable 255.255.255.255
Press any key to continue...
На этом настройка устройства может считаться оконченной. К мониторингу (пункт Monitor) мы вернемся позже.
Теперь можно приступать к настройке FreeBSD. Первым делом нужно скачать драйвер, корректно работающий с последними версиями FreeBSD. Линк будет приведен в конце статьи. Производитель дописывал его по моей просьбе, т.к. я столкнулся с проблемой, когда устройство было выключено, на сервере порождалось огромного количество зомби процесов вплоть до максимума, когда создать новый процес уже не удавалось (даже залогиниться нельзя было) и приходилось перегружать сервер. Скачав и распаковав архив с драйвером в каталог /usr/local/etc, переходим в каталог moxattyd компилируем его:
/usr/local/etc #cd moxattyd /usr/local/etc/moxattyd #make freebsdmake freebsd cc -O -DFREEBSD -o moxattyd moxattyd.c
Далее редактируем конфигурационных файл драйвера, где необходимо указать IP адрес nPort и tcp порт. По умолчанию для первого Serial порта — tcp порт 950, для второго — 951 и т.д.
/usr/local/etc/moxattyd #ee moxattyd.cf ttyp0 172.16.6.200 950
ttyp0 — название tty устройства, возможные варианты имен tty для FreeBSD — tty[p-sP-S][0-9a-v]
В README способ запуска драйвера указан как:
/usr/local/etc/moxattyd #/usr/local/etc/moxattyd/moxattyd -t 1
Для автоматического запуска по время загрузки рекомендуют добавить вышеприведенную строчку в /etc/rc.local. Мы же поступим более правильным методом — создадим rc-скрипт следующего содержания:
/usr/local/etc/moxattyd #cat /usr/local/etc/rc.d/moxattyd #!/bin/sh # PROVIDE: moxattyd # REQUIRE: NETWORKING LOGIN # KEYWORD: shutdown . /etc/rc.subr name="moxattyd" rcvar=`set_rcvar` command="/usr/local/etc/${name}/${name}" start_precmd="${name}_prestart" required_files="/usr/local/etc/${name}/${name}.cf" extra_commands="reload" sig_reload="USR1" sig_stop="QUIT" load_rc_config $name eval "${rcvar}=\${${rcvar}:-'NO'}" moxattyd_prestart() { rc_flags="-t 1" } run_rc_command "$1"
Теперь возможно управлять (start|stop|restart|rcvar|reload|status) драйвером moxattyd с помощью вышеприведеного скрипта а также обеспечить запуск драйвера во время загрузки простым добавление строчки moxattyd_enable=«YES» в /etc/rc.conf.
И так, если мы все правильно сделали, то в /dev должно появиться устройство ttyp0. Проверить доступность модема можно с помощью AT комманд (к примеру at) подключившить через minicom к устройству ttyp0:
Добро пожаловать в minicom 2.5
ПАРАМЕТРЫ: I18n
Дата компиляции Apr 26 2011, 08:33:00.
Port /dev/ttyp0
Нажмите CTRL-A Z для получения подсказки по клавишам
OK
at
OK
На стороне nPort можно «промониторить» следующие состояния устройства:
1) Адрес сервера, который подключен к устройству, и режим работы — меню Monitor -> Line:
Port Type IP1 IP2 IP3 IP4
01 Real COM 172.16.0.10
Press 'q' to cancel ...
2) Состояние Serial порта — меню Monitor -> Async
Port TxCnt RxCnt TxTotalCnt RxTotalCnt DSR CTS DCD
01 1206230 873846 5127327 3889002 ON ON OFF
Press 'q' to cancel ...
В новых моделях девайсов (с буковкой «A») помимо DSR CTS и DCD можно еще наблюдать состояние сигналов RTS и CTS.
На этом можно было бы закончить статью, но в ее начале я обещал скрипт, которым пользователь, который не имеет доступа к настройке nPort, сможет получить доступ к пунктам мониторинга Line и Async. К написанию скрипта пришлось прибегнуть поскольку в конвертерах nPort нет разпределения уровней доступа. Тоесть есть только один пользователь с максимальным уровнем доступа. Инструменты, которые понадобятся нам — sudo и expect.
Создаем скрипт mmon.ex с правами 700 и владельцем: группой root:wheel. Важно дать права именно 700, что бы никто кроме пользователя root не мог его прочитать, т.к. в нем в открытом виде храниться пароль для конвертера nPort.
/usr/local/etc/moxattyd #cat /usr/local/bin/mmon.ex #!/usr/local/bin/expect -f set host [lindex $argv 0] set int [lindex $argv 1] set passwd nPort_password set timeout -1 #Check parameters if { $host == "" || $int == "" } { puts "Usage: mmon.ex <hostname> <interface> Example: mmon.ex nport.domain.com ser\n" exit 1 } log_user 0 spawn telnet $host expect "Please keyin your password:" {send "$passwd\r"} expect "Key in your selection:" {send "7\r"} if { $int == "eth" } { expect "Key in your selection:" {send "1\r"} } elseif { $int == "ser" } { expect "Key in your selection:" {send "2\r"} } else { puts "Unknown interface selected. Posible variants: eth, ser\n" exit 1 } log_user 1 interact -o "<< Main menu->Monitor >>" return log_user 0 send "m\r" send "q\r" expect eof
Редактируем конфигурацию sudo добавив в нее следующие строчки:
/usr/local/etc/moxattyd #cat /usr/local/etc/sudoers #Moxa Cmnd_Alias MOXA = /usr/local/bin/mmon.ex %moxa ALL=NOPASSWD: MOXA
Пользователей, которым нужно дать доступ, добавляем в предварительно созданную группу moxa. Запустив скрипт через sudo и указав в качестве параметров адрес конвертера и тип интерфейса, статистику по которому нужно посмотреть, пользователь сразу попадет в нужный пункт меню Monitor -> Line при указании интерфейса eth и в Monitor -> Async при указании интерфейса как ser. При нажатии «q» произойдет выход из соответствующего пункта меню и скрипт закроет соединение с nPort.
Вот и все. В результате у нас есть аналоговый модем, подключенный через сеть к серверу под FreeBSD. Есть стартовый скрипт для «православного» управления драйвером а также есть возможность без предоставления пользователю пароля от nPort дать ему возможность мониторить состояние устройства.
==============
Версия драйвера, корректно работающая в свежих версиях FreeBSD — moxattyd_3.4.1_build_10110316.tar
Русскоязычный форум по продукции Moxa — http://www.moxa.ru/forum