Site Mascot
 

Не удивляйтесь, сайт переехал: был http://smacker.fatal.ru, стал http://smacker.heliohost.org.

Соединение через COM-порт

30.11.2005 7:03

Настоящий текст - описание моего свежего опыта связывания двух компьютеров с помощью нуль-модемного кабеля на COM-порт.

 
Вступление
Итак, зачем всё это нужно. Как я уже писал, на моём старом ноутбуке нет ни сетевой карты, ни USB, ни флопаря. Таким образом, если перенести информацию с десктопа на ноутбук ещё можно на CD-R, то в обратном направлении — затруднительно. Да и писать целую сессию на болванку ради нескольких метров, а то и менее — жаба задушит. Словом, надо было найти способ как-то соединить две машины, причём желательно подешевле. Поэтому рашения вроде «купить pcmcia-USB контроллер и flash-брелок», или поставить на ноут pcmcia-сетевуху — отпадали. Первое входит в категорию от 1000 рублей и выше, второе — обошлось бы примерно в 700 рублей. И второго, и тем более первого мне тратить жалко.
Остаётся использовать насущные ресурсы, в качестве которых выступают COM и LPT порты на ноутбуке. Через них, используя прямое соединение нуль-модемным кабелем, можно поднять сетевой интерфейс и далее поступать соответственно, например, пользоваться ssh. В этой статье я рассмотрю первый вариант — соединение через COM-порт (9pins).

 

Матчасть
Для соединения нам потребуется нуль-модемный кабель на девяти-штырьковый COM-порт. Он стоит порядка 50 рублей в самом ахтунговом магазине города (сиречь в «КЦ ГЕЙ» — бамбардия киргуду), а в остальных ещё, надо полагать, дешевле. В крайнем случае, можно спаять самому, купив разъемы и провода, а схему найти в интернете. Но этот вариант я тут рассматривать не буду, тем более, что покупка компонентов по отдельности будет стоить примерно столько же, если, конечно, не ехать за ними на «Юнону». А раз нет экономического стимула, то не о чем и говорить.

 

Программная часть
Когда компьютеры соединенены, надо поднять что-нибудь, что реализовывало бы сетевое соединение через последовательный порт. Мне известны три варианта: через SLIP, CSLIP («C» = compressed) и PPP. Со SLIP-ом я возился, но пока что ничего не добился, а CSLIP даже трогать не стал; в любом случае, как я понимаю ситуацию, это всё радости середины 90-х. Зато с PPP у меня всё получилось сразу, так что об этом я и буду рассказывать.

 

Этап первый — подготовительный
Надо выбрать IP-адреса и имена для наших машин и указать их в /etc/hosts. Адреса желательно брать из интервалов, закреплённых стандартом за локальными сетями. В моём случае /etc/hosts выглядит так:
 127.0.0.1	 localhost.localdomain   localhost
 192.168.93.1     desktop
 192.168.93.2     notebook 
Кто будет использовать какой IP — очевидно. Идём дальше.

 

Этап второй — запуск pppd
В документе Linux PPP HOWTO, авторов Corwin Light-Williams и Joshua Drake, в главе «Using PPP across a null modem (direct serial) connection» хорошо написано про то, как и что делать, и именно им я пользовалься в качестве «руководящей линии». Однако, мне было бы совестно просто перевести её на русский, и не внести своей лепты.
Итак, для поднятия интерфейса pppd мы напишем простенький скрипт. Собственно, вся идея тут только в том, чтобы сэкономить силы при работе с клавиатурой. Я назвал его /sbin/ppp-com-on
 #!/bin/bash
 pppd -detach passive crtscts lock desktop:notebook /dev/ttyS0 115200 & 

 

Обратите внимание на параметр passive, которого нет в «Linux PPP HOWTO». Если опустить его, то через некоторое время, если соединение не будет установлено (что произойдёт, если вы не успеете запустить pppd на второй машине), наступит timeout у pppd, и он отключится. Время это небольшое, примерно полминуты, и чтобы не пришлось сломя голову «бегать» от машины к машине, я предлагаю указать параметр passive, который оставит pppd в ожидании соединения.
На всякий случай, краткое пояснение к остальным параметрам:
crtscts — аппаратный контроль за передачей данных;
lock — блокировать доступ к используемому устройству для других процессов;
desktop:notebook — что с кем соединять. Имена (а не IP) указаны потому, что мы уже соотнесли их с IP-адресами;
/dev/ttyS0 — устройство (порт), используемое для соединения;
115200 — скорость, на которой следует установить соедниение;
На ноутбуке всё так же, только desktop и notebook надо поменять местами.

 

Этап второй — отключение pppd
Вот этого-то в «Linux PPP HOWTO» в главе про нуль-модемы и нет. Одним словом, нам предлагается или устанавливать соединение по ppp на постоянной основе, или отключать его каждый раз вручную, что неудобно. Мне же надо, чтобы соединение можно было быстро установить и так же быстро разъединить. Для этого я написал простой скрипт, одинаковый для обеих машин. Я назвал его /sbin/ppp-com-off:
 #!/bin/bash
 kill `ps ax | grep 115200 | grep crtscts | grep -v grep | gawk '{print $1}'`
 rmmod ppp_async
 rmmod bsd_comp
 rmmod ppp_deflate
 rmmod ppp_generic 

 

Прошу обратить внимание только на то, что я «злоупотребил» частными особенностями моего соединения, а именно скоростью, на которой я его устанавливаю (115200), т.к. именно по ней я фильтрую список процессов. Если вы укажете иную скорость, вам придётся менять и этот скрипт. Принцип работы для «uninitiated»:
ps ax — вывод списка всех процессов;
grep 115200 — остаются только строки с 115200, включая и сам процесс «grep 115200»;
grep crtscts — остаётся только процесс с pppd, а не, скажем, SLIP;
grep -v grep — процессы с «grep» отбрасываюся;
gawk '{print $1}' — остаётся только первое поле строки, т.е. PID процесса;
kill... процесс завершается. А потом выгружаются ненужные модули.
В результате выполнения этого скрипта наш процесс счастливо терминируется, и соединение пропадает.
Думаю, излишне говорить, что у обоих скриптов надо поставить атрибут «исполняемый» — например, через
 chmod a+x /sbin/ppp-com-on
 chmod a+x /sbin/ppp-com-off 

 

Послесловие
Итак, теперь, чтобы установить соединение мне надо соединить десктоп и ноутбук нуль-модемным кабелем и на обеих машинах от root-а запустить скрипт /sbin/ppp-com-on. Когда соедниение мне больше не потребуется, я запущу скрипт /sbin/ppp-com-off, и соединение будет разорвано. Кстати говоря, запускать скрипт на отключение надо только на одной машине, потому что на второй pppd завершит свою работу автоматически после разрыва соединения.
Если же вы захотите, чтобы этого не происходило, т.е. чтобы после разрыва соединения pppd оставался запущенным и ждал следующего соединения, то надо указать дополнительный параметр persist. Это может потребоваться, например, если вы захотите соединяться с машиной, к которой не будет физического доступа, что-нибудь типа standalone server-а в шкафу. Тогда будет логично запускать там ppp-com-on с persist прямо при загрузке — и машина всегда будет готова к установлению соединения.

 

Что дальше?
Скорость, развиваемая таким соединением, невелика — порядка 10 Кб/c. Этого маловато для работы таких служб, как, например, NFS, но вполне достаточно для ssh. На одной из машин запускается сервис sshd, а со второй машины можно соединяться через консоль (с помощью ssh) или, например, MC. Последний, кстати, имеет спецальную опцию «shell-соединение», которое использует fish, т.е. по нему можно пересылать файлы, но нельзя выполнять команды на удалённой машине (в отличие от ssh).
  1. inferno_6
    Email: inferno_6 гав-гав rambler.ru  
    Excellent
    Очень хорошо собранный материал. В жанре "делай со мной".
    У меня возникла подобная проблема. Сможете ли вы мне помочь или нет? Имеется устройство (Терминал управления бетонным заводом SPARCO). К нему подключен матричный принтер. Задача: подключить к нему вместо принтера компьютер, с возможностью просмотра того, что отправляется на печать с устройства.
    Если сожете чем-либо помочь буду очень признателен.
    Заранее спасибо.
    Евгений Васильев.
    inferno_6@rambler.ru или Evasilyev@logycom.kz
    [ Запись от 16.07.2008, отправлена в 23:56 ]
    Вы ставите очень сложную задачу. Насколько я понимаю, речь идёт о том, чтобы перехватывать идущие на принтер данные и возвращать им "человеческий" вид. Для этого нужно как минимум знать в подробностях, как происходит передача данных на принтер. Я подозреваю, что там всё отнюдь не просто, и придётся писать программу, "имитирующую" принтер на "принимающем" компьютере.
  2. Я буду рад, если вы оставите свой отзыв об этой заметке:

    Никнейм

    Email

    URL

    Заголовок комментария

    Проверка на человечность
    - Введите буквы:
    The CAPTCHA image