Следующий Предыдущий Содержание

## 12. Прием звонков

## 12.1 ВВедение

Свой ПК можно настроить на прием звонков от других модемов (по-английски это обозначается термином dial-in -- прим. перев.).

Прием модемом звонков происходит следующим образом: чей-то модем набирает Ваш телефонный номер, Ваш модем отвечает на телефонный звонок, происходит установка соединения. Об установке соединения извещается программа `getty`, которая запускает программу идентификации (login) для звонящего. После успешной идентификации звонящий получает доступ к Вашему ПК (в соответствии с назначенными ему правами -- прим. перев.). Т.е. получается так, что он будто бы сидит за Вашими монитором и клавиатурой.

Для автоматизации процесса идентификации звонящего можно использовать скрипт, работающий по принципу "запрос-ответ". К примеру, на запрос "login:" отсылается имя пользователя, следом за этим идет запрос пароля и т.д. Если в файле /etc/passwd (файл паролей) для пользователя, представляющего звонящего, указан запуск командной оболочки (bash, например), то происходит ее запуск при успешной идентификации. Вместо запуска оболочки может быть задан запуск PPP для предоставления звонящему доступа в Интернет (см. подробности в PPP-HOWTO). Программа, которая используется для приема звонков, называется `getty` или `mgetty`. См. далее

Программа mgetty, являющаяся усовершенствованным вариантом getty, может определить, что на ПК звонящего (на другом конце линии) запущен PPP (?), и в таком случае не запускать программу login -- идентификация происходит через PPP-соединение.

## 12.2 Что происходит, когда модем принимает звонок?

В данном разделе представлено более подробное описание установления входящего соединения. Предполагается, что используется либо mgetty, либо uugetty. agetty хуже и работает немного по-другому (см. раздел О agetty)

Чтобы принимать звонки модем должен находиться в режиме ответа на звонки. Поведение модема при обнаружении сигнала вызова (звонка) зависит от его настройки. Модем может либо сам, напрямую отвечать на вызов, либо через программу getty путем посыла ей сообщения "RING". В любом случае можно задать модему отвечать, скажем, лишь на 4-ый звонок, чтобы успеть подойти к телефону и снять трубку (или нажать на кнопку радиотелефона -- дополн. перев.), если это будет обычный звонок (человеческий :) - заметка перев.), не от модема. Если Вы не успеете ответить, то звонящий Вам человек услышит высокотональные сигналы Вашего модема, начавшего установление соединения.

При ответе на вызов принимающий модем посылает тональные сигналы вызывающему модему и наоборот. Два модема "договариваются" по каким протоколам они будут вести "общение"; после принятия решения Ваш модем посылает `getty` сообщение "CONNECT" (или другое). Когда `getty` получает это сообщение, она отправляет на последовательный порт приглашение для идентификации (login prompt). После получения имени пользователя в ответ на данное приглашение `getty` может вызвать программу `login` для проведения процедуры идентификации и входа в систему.

Теперь о двух способах ответа на звонки. При первом способе модем автоматически отвечает на звонки. В этом случае число звонков (сигналов вызова), после которого модем ответит, определяется значением, содержащемся в его регистре S0. Если в S0 записано 3, то модем будет автоматически отвечать на вызов после 3-го звонка. Если в S0 задано 0, то модем будет отвечать только в случае, если getty даст AT-команду "A" ("ATA" -- команды предваряются префиксом "AT"). Это второй способ ответа на звонки, называемый "ручным" ("manual"), поскольку модем ничего сам не делает автоматически (делает getty). Можно подумать, что лучше использовать возможность модема автоматически отвечать на звонки, но на деле оказывается, что "ручной" способ предпочтительнее.

При "ручном" способе `getty`, прослушивающая последовательный порт, во время поступления звонка получает от модема сообщение "RING". Если она хочет ответить на этот звонок, то посылает команду "A". `getty` может послать команду, если ей задать, и после 4-го сообщения "RING" (4-го звонка), как и при автоматическом способе ответа. После получения команды модем производит установку соединения и при успешном окончании посылает `getty` сообщение "CONNECT ...", при получении которого она отсылает звонящему приглашение для идентификации. Есть несколько специальных приемов, которые позволяют произвести исходящий звонок во время ожидания входящего. См. ````````Осуществление исходящего соединения в режиме ожидания входящего

При автоматическом способе задействуется линия CD (Carrier Detect, DCD) интерфейса между модемом и последовательным портом для индикации установления соединения. Выглядит это следующим образом: во время загрузки `getty` пытается открыть последовательный порт, но это у нее не получается, поскольку отсутствует сигнал CD (модем простаивает). Программа `getty` остается запущенной и ждет появления сигнала CD. При появлении CD (может пройти час) открывается порт и `getty` посылает приглашение для идентификации. Во время ожидания прихода сигнала `getty` находится в "спящем" состоянии и не мешает выполняться другим процессам. "БУдит" ее прерывание, возникающее при изменении состояния линии CD.

Вас может заинтересовать, как getty открывает последовательный порт для прослушивания при "ручном" способе приема звонков, если нет сигнала CD? Есть способ написать программу так, чтобы заставить порт открываться и при отсутствующем сигнале CD (-:

## 12.3 Почему не соединяется на скорости 56k

Для того чтобы соединение с Вашим модемом могло происходить на скорости 56 кбит/с требуется выполнение следующих условий (всех):

1. У Вас есть в наличии "цифровая" линия связи с АТС, к примеру T1 или ISDN
2. У Вас есть специальный цифровой модем (см. Цифровые модемы)
3. У Вас есть "... концентратор", который связывает цифровые модемы с цифровыми линиями связи. Под "... концентратором" понимается "модемный концентратор" ("modem concentrator") или "концентратор удаленного доступа" ("remote access concentrator"), который может входить в "сервер удаленного доступа" (RAS), включающего в себя в том числе и цифровые модемы. Такие сервера используются Интернет-провайдерами.

Если чего-то из вышеперечисленного у Вас нет, то передайте звонящему, чтобы он не ожидал соединения на скорости 56 кбит/с :)

## 12.4 getty

### Введение

Программа `getty` (и ее производные: agetty, mgetty и т.д.) используется при приеме звонков, при установлении исходящего соединения она не требуется. getty не только выводит приглашение для идентификации, но и помогает установлению соединения (?). Изначально getty предназначалась для входа в систему с простых терминалов (dumb terminal). В настоящее время она в основном используется для входа в Linux с консоли. Существует несколько различных вариантов программы getty, не все из них работают с модемами. Как правило, getty запускается либо при загрузке системы, либо при поступлении входящего звонка. Это задается в файле /etc/inittab. Посмотрев данный файл, Вы увидите несколько строк, некоторые из которых, возможно, придется чуточку подправить :)

Для работы с модемом при приеме звонков можно выбрать одну из четырех разновидностей программы getty: `mgetty`, `uugetty`, `getty_em` и `agetty`. Краткое описание каждой из них приведено ниже. `agetty` -- самая слабая из этих четырех программ, используется она в основном лишь на текстовых терминалах (text-terminal), соединенных напрямую. `mgetty` поддерживает факсимильную связь и голосовую почту, но, как утверждается, лишена некоторых возможностей `uugetty`, не имеющей поддержки факсимильной связи и голосовой почты. `getty_em` -- упрощенная версия `uugetty`. Судя по всему, если Вы не знакомы с `uugetty`, лучшим выбором будет `mgetty`. Синтаксис у этих программ различен, так что проверьте, что в `/etc/inittab` правильно записана команда для используемой Вами разновидности getty.

Чтобы узнать, какая документация есть в Вашей системе о различных вариантах программы getty, воспользуйтесь утилитой locate. Наберите: locate "*getty*" (включая кавычки). В большинстве дистрибутивов под именем getty скрывается какая-либо из ее разновидностей (agetty, uugetty и т.д.). Попробовать выяснить, какой вариант getty используется, можно, открыв и посмотрев man-страницу -- для этого надо набрать man getty. Путь к программе getty должен быть `/sbin/getty`.``

### Как getty перезапускается

После того, как осуществлен вход в систему, процесс getty перестает существовать (это можно определить по выводу команд "top", "ps -ax" или "ptree") (команда -- это вызов программы. -- заметка перев. на полях). Почему так происходит? И почему getty появляется снова, если Вы "убьете" оболочку? Читайте :)

Полученное от Вас в ответ на приглашение идентификации имя пользователя (user name) программа getty передает программе login, которую сама же и запускает. Процесс getty замещается процессом login. login спрашивает у Вас пароль, проверяет его и запускает процесс, указанный в файле паролей (/etc/passwd). Обычно этим процессом является оболочка bash. После запуска bash в свою очередь замещает процесс login. Т.е. один процесс замещает другой, и процесс, который сейчас представляет оболочку bash, сначала представлял программу getty.

В файле /etc/inittab задан перезапуск (respawn) getty после уничтожения ее процесса. Но если убить оболочку bash (или процесс login), getty тоже перезапускается. Почему? И login, и bash замещают getty и наследуют все сигнальные связи (signal connections), установленные предшественником. Можно также заметить, что у замещающего процесса будет тот же идентификатор (process ID), что и у первоначального процесса. Т.е. получается, что процесс bash -- это процесс getty, с тем же самым process ID. Если "убить" bash, то это будет выглядеть так, будто бы "убили" getty (хотя сама getty уже выгружена из памяти). А это значит, что в соответствии с заданным в /etc/inittab должен произойти перезапуск getty.

При выходе из системы все процессы, относящиеся к данному последовательному порту, уничтожаются, в том числе и оболочка bash. Процессы могут уничтожаться (если так задано) и по сигналу отбоя (hangup), возникающему при падении напряжения DCD. В любом случае это вызовет перезапуск getty. Можно и самому заставить getty перезапуститься, "убив" вручную bash (или login) нажатием клавиши k в программе "top" или командой kill с сигналом 9 (который не может быть проигнорирован).

### mgetty

`mgetty` была написана в качестве замены `uugetty`. Обе программы можно использовать для работы с модемами, но mgetty предпочтительнее (если, конечно, Вы не являетесь приверженцем `uugetty` :)). `mgetty` можно также использовать на соединенных напрямую терминалах (directly connected terminals), правда, она не имеет больших возможностей для этого. Помимо идентификации звонящего `mgetty` предоставляет поддержку факсимильной связи, автоопределение PPP, поддержку caller-id. Во время ожидания mgetty входящего звонка можно осуществить исходящий вызов. Есть дополнительная программа `vgetty`, позволяющая на некоторых модемах сделать автоответчик (голосовую почту). К `mgetty` имеется прекрасная документация (за исключением рассмотрения организации "голосовой почты"), которая не прикладывается к данному HOWTO (пришлось бы и ее еще переводить -- добав. ленивого перев. :)). Для автоматического запуска PPP надо в /etc/mgetty/login.conf задать "AutoPPP". Самую последнюю информацию о `mgetty` можно найти по адресам: http://www.leo.org/~doering/mgetty/ и http://alpha.greenie.net/mgetty/

### uugetty

`getty_ps` состоит из двух программ: `getty` -- для консоли и терминалов, и `uugetty` -- для модемов. Грэг Хэнкинс (первый автор Serial-HOWTO) использовал `uugetty`, так что его записи присутствуют здесь. См. Uugetty.

### getty_em

Эта программа является упрощенной версией "uugetty''. Она была написана Верном Хоукси (Vern Hoxie) после того, как он был полностью сбит с толка сложностью файлов , необходимых для getty_ps и uugetty.

Она является частью коллекции утилит для последовательного порта и информации Верна Хоукси, доступной через ftp на scicom.alphacdc.com/pub/linux. Коллекция называется "serial_suite.tgz''.

### agetty

Этот подраздел получил свой нынешний объем по причине того, что автор сам пытался использовать agetty при приеме звонков. `agetty` с виду кажется простой, поскольку не имеет никаких файлов инициализации. Но когда я ее запустил, то она несмотря на отсутствие сигнала CD открыла последовательный порт, после чего отправила приглашение для идентификации и файл /etc/issue модему, находящемуся в командном режиме (так как соединение еще не было установлено). Модем в этом режиме все приходящее к нему воспринимает как AT-команды, и если в приглашении или файле встретятся (случайно) "at-строки", то -- сами понимаете -- это приведет к нежелательному изменению настроек профиля модема. Могут начаться "эхо-войны" (echo wars), когда getty и модем будут многократно пересылать одну и ту же строку друг другу. Если такое произойдет, то возникнет сообщение об ошибке "слишком быстрый перезапуск" ("respawning too rapidly"). Чтобы предотвратить такое развитие событий, Вам надо отключить повтор команд модемом (echoing) и выдачу им кодов выполнения команд (result codes) (соответствующие команды: E0 и Q1). Также задайте agetty опцию -i, чтобы файл /etc/issue не посылался.

Если через несколько секунд после запуска процесс agetty сам по себе, без какого-либо участия со стороны замещается процессом login, то это означает, что agetty получает от модема какое-то произвольное имя пользователя. Чтобы этого не случалось, мне пришлось сделать так, чтобы профиль, который я использую при приеме звонков, загружался при включении модема (судя по всему, при данном наборе настроек (профиле) модем автора не отсылает какие-либо данные на последовательный порт -- переводчик пытается связать одно с другим :)). Другой сохраненный профиль используется для исходящих соединений. Чтобы инициализировать модем для осуществления исходящих звонков (загрузить соответствующий профиль), надо в инициализационной строке программы, используемой для установки исходящего соединения (wvdial, kppp и т.п.), записать команду Z, Z0 или Z1 (в зависимости от номера профиля: если надо загрузить 1-ый профиль, укажите Z1, если 0-ой -- Z0 или просто Z). Чтобы после завершения исходящего соединения вернуть настройки профиля, используемого для приема звонков, надо "сбросить" (reset) модем. Не все программы дозвона производят такой "сброс" при завершении своей работы.

Так что получается, что agetty может работать нормально, если правильно настроить профиль модема; по всей видимости она лучше всего подходит для виртуальных консолей или терминалов, а не для модемов. При запущенной для приема звонков agetty не получится просто так совершить исходящий вызов. Чтобы звонящему получить от agetty приглашение для идентификации (после установления соединения), ему надо нажать клавишу Enter. Также надо сказать, что в дистрибутиве Debian `agetty` называется просто `getty`.

### mingetty и fbgetty

`mingetty` -- это маленькая getty, которая предназначена только для обычной консоли (выводит приглашение на Ваш монитор), поэтому она не будет работать с модемом. `fbgetty` аналогична `mingetty`, но поддерживает фреймбуферы (framebuffers).

## 12.5 Почему "ручной" способ ответа лучше

Разница между двумя способами ответа на звонки можно будет увидеть, если компьютер выключится, а модем останется включенным. При "ручном" способе ответа посланное getty сообщение "RING" не дойдет до нее, поскольку компьютер выключен, getty отсутствует. Таким образом, звонок не будет принят, и за него не надо будет платить. При автоматическом ответе модем (который остался включенным) примет звонок, но приглашения для идентификации после этого не последует, так как компьютер выключен. За продолжающееся ожидание будут "идти деньги". Если за звонок платить не надо, то это не столь важно и может лишь повлиять на настроение звонящего, ожидающего приглашения для идентификации и не получающего его (в России все входящие звонки с 1 июля (?) 2006 года бесплатны -- добав. перев.). В `mgetty` используется "ручной" способ ответа. `Uugetty` также можно заставить использовать этот способ при помощи скрипта.

## 12.6 Осуществление исходящего соединения в режиме ожидания входящего

Сначала о том, что может произойти при "ручном" способе ответа на входящие звонки. Предположим, что другой процесс установил исходящее соединение в то время, пока getty прослушивает последовательный порт в ожидании получения от модема сообщения "RING". В таком случае байты, предназначенные для процесса исходящего соединения, от модема придут на последовательный порт, прослушиваемый getty. К примеру, модем может послать сообщение "CONNECT" последовательному порту при установлении исходящего соединения. Если getty его прочитает, то процесс исходящего соединения, ожидающий это сообщение (или другое), уже не сможет его прочитать. А это, скорее всего, приведет к завершению данного процесса.

Есть способ избежать указанной проблемы, как делает это mgetty. Во время ожидания звонка mgetty считывает с порта лишь те символы, которые по ее же предположению ей предназначены. Mgetty следит за портом, и когда на него поступают символы, она вместо того, чтобы сразу же их считать, проверяет, нет ли другого процесса, использующего порт. Если такой процесс есть, то mgetty уступает ему и закрывает для себя порт (порт остается открытым для других процессов). Таким образом, если другой процесс будет использовать порт для исходящего соединения, то mgetty не будет мешать ему. Когда другой процесс закроет порт, mgetty возобновит "прослушку". Т.е. mgetty воздерживается от чтения, пока не убедится, что данные предназначены для нее (ожидаемое сообщение "RING").

Когда mgetty проверяет, использует ли какой другой процесс последовательный порт, она на самом деле смотрит, есть ли какие lock-файлы (файлы блокировки -- другой вар. перев.) для порта. Если процесс не использует lock-файлы, то это "не есть хорошо" для него. Дополнительные подробности смотрите в документации к mgetty в разделе "How mgetty works" ("Как работает mgetty"). Заметка только для программистов: прослушивание порта -- это фактически использование системных вызовов "poll" или "select". Скорее всего, эти же вызовы используются и другими процессами для слежения за портом, не только mgetty.

Но при использовании mgetty может возникнуть проблема с конфигурацией модема. При запуске mgetty первым делом посредством заданного пользователем скрипта устанавливает эту конфигурацию. Теперь модем настроен на посыл mgetty строки RING при поступлении звонка вместо автоматического ответа на него. Если предположить, что пока mgetty ожидает поступления звонка, другая программа для совершения исходящего вызова перенастроит модем на то, что не подходит для mgetty... Чтобы избежать такой ситуации, mgetty при обнаружении завершения работы другой программы, использующей последовательный порт, сама завершает свою работу. В результате этого mgetty перезапускается вновь (так задано в файле /etc/inittab), при этом она, как было сказано, перенастраивает модем под прием входящих вызовов.

При автоматическом ответе (не используется mgetty) getty ожидает появления сигнала CD, чтобы открыть порт. Но сигнал модема CD может появиться и появляется и после установления исходящего соединения. В таком случае, если была запущена getty, все символы (данные), которые предназначались для процесса исходящего соединения, будут "проглочены" getty. Если у agetty такая проблема имеется, то uugetty, как утверждается, перед чтением с порта проверяет наличие lock-файлов (как делает это mgetty).

## 12.7 Завершение входящего соединения

Существует два основных способа завершить входящее соединение. Звонящий может завершить сеанс (logout) или просто "повесить трубку" (hang up). Последний способ рассмотрен в разделе Звонящий вешает трубку

### Звонящий завершает сеанс

Обычным способом закрытия соединения удаленным пользователем является завершение сеанса (log out). При этом ПК, выступающий в роли принимавшего соединения, должен освободить телефонную линию ("повесить трубку"). Надо сказать, что при завершении обычного (немодемного) сеанса пользователь сразу же получает новое приглашение для идентификации. Удаленному же пользователю, набравшему "logout", для повторного входа в систему надо будет заново устанавливать соединение. Если при завершении сеанса пользователем линия освобождаться не будет, то у других абонентов не будет возможности установить соединение и войти в систему (?).

Завершение сеанса удаленным пользователем на Вашем ПК, к которому он подключался, "убивает" процесс оболочки, использовавшейся этим пользователем. И поскольку на данном порте после этого нет больше запущенных процессов, то порт закрывается и посылает сигнал отбоя (hangup signal) модему в виде падения DTR. Надо сказать, что так происходит только в случае, если в выводе команды stty -a показывается hupcl (стандартная настройка). hupcl = Hang UP on CLose (отбой при закрытии) => падение DTR (сигнал "hang up" при закрытии последней программы, запущенной на данном порте). Но поскольку для Linux "убить" оболочку означает то же, что и "убить" getty (см. ранее), то это приводит к перезапуску getty (так задано в /etc/inittab). Поэтому почти сразу же порт открывается снова, а DTR восстанавливается. Можно сказать, что DTR мигнуло (пропало только на малую долю секунды и вновь появилось). На современных быстрых компьютерах этот "миг" может быть очень коротким, так что модем может его не распознать, поэтому предполагается, что драйвер последовательного порта увеличит его (для этого должно быть задано hupcl у stty и... (?)). Но сообщалось (в 2003 году), что этого увеличения недостаточно.

Модем компьютера, выступающего в роли принимающего, при получении сигнала отбоя (падении DTR) "вешает трубку" (освобождает линию, но только при условии, что модем так настроен -- см. ниже). После этого модем должен быть готовым отвечать на новые входящие звонки. mgetty при этом запускает скрипт, выполняющий инициализацию и возможно сброс модема, если таковой имеется. Если модем не "повесил трубку" из-за того, что падение DTR было слишком коротким, то запущенная заново getty может это сделать -- mgetty при запуске вызывает длительное падение DTR. Но было мнение, что использовать перезапуск getty для устранения неразберихи (модем на линии или нет) после предыдущего звонка не правильно (?).

Если модем не освобождает линию по DTR, то можно воспользоваться имеющейся AT-командой H0. При настройке mgetty в скрипте можно задать последовательность +++, которая переводит модем в командный режим. Эта последовательность должна иметь минимальные временнЫе задержки до и после себя. В командном режиме модему можно послать любую AT-команду, в том числе и команду отбоя H0. Можно сделать так, что освобождение линии может происходить и по DTR, и по команде. Тогда можно надеяться, что хотя бы один из этих двух способов будет работать :) Если при посыле сигнала модему от ПК при завершении сеанса удаленным пользователем произойдет какой-то сбой (или сбой произойдет при перезапуске getty, когда выполняется скрипт), то модем вероятнее всего останется на линии, и входящие звонки не будут приниматься. Считается, что такая ситуация может представлять угрозу безопасности.

### Когда DTR падает (становится отрицательным)

Поведение модема при падении DTR (сигнал отбоя) зависит от значения, стоящего после &D в настройках модема (профиле). Если задано &D0, то ничего не произойдет (модем просто проигнорирует падение DTR). В зависимости от настройки, когда компьютер вызывает падение DTR, происходит следующее:

`&D2:` Модем отсоединяется от линии, переходит в командный режим и ожидает следующего вызова. Но при этом он не будет автоматически отвечать на вызов, пока вновь не восстановится DTR.Поскольку после завершения сеанса тут же автоматически перезапускается mgetty (если так задано в /etc/inittab), то восстановление DTR происходит почти сразу же . Таким образом, при выходе пользователя (завершении его сеанса) DTR спадает только на долю секунды (мигает). Во время этого "мига" DTR должно отсутствовать по меньшей мере в течение времени, заданного в регистре S25, иначе модем не "повесит трубку".

`&D3:` или S13 = 1. В этом случае при падении DTR происходит полная перезагрузка модема: он освобождает линию, и происходит восстановление сохраненного профиля в соответствии с заданным после &Y значением. После этого модем должен находиться в том же состоянии, в каком он был после включения питания. Но и у mgetty может быть скрипт, посылающий модему строку инициализации и, соответственно, меняющий настройки профиля. Т.к. восстановление профиля и скрипт mgetty выполняются приблизительно в одно время, то это может привести к ситуации, известной как "состояние гонок".

Значение в регистре S25 может не играть роли, так что даже очень короткий "миг" DTR будет пойман и распознан модемом как сигнал отбоя :) Но некоторые производители модемов утверждают обратное: значение S25 все еще остается в силе (все определяется в итоге собственным опытом :) -- прим. перев.). Таким образом, `&D3` производит "более сильный сброс", чем `&D2`, которая не производит перегрузку изначального профиля и для срабатывания может требовать более долгого "мига" DTR.

При благоприятных условиях и `&D3`, и `&D2` должны работать нормально. Были сообщения, что у нескольких модемов только `&D2` работает нормально. Может быть это связано с возможным "состоянием гонок", упоминавшемся выше, если используется `&D3`?

### Звонящий вешает трубку

Вместо завершения сеанса обычным способом звонящий может просто "повесить трубку" (к примеру, закрыв "терминальную" программу, которую он/она использовала для связи). Это приведет к потерянному соединению и, естественно, к потере несущей. Другие причины также могут привести к потере несущей. Модем отсоединяется от линии и начинает ждать следующего вызова. Но mgetty остается еще незапущенной.

Вот как getty запускается снова: при потере несущей сигнал CD, посылаемый модемом последовательному порту, пропадает (при условии, что в настройках (профиля) задана `&C1`). Когда последовательный порт (подразумевается, скорее всего, драйвер последовательного порта -- прим. перев.) обнаруживает, что сигнал CD пропал, он "убивает" оболочку, но только при условии, что clocal сброшен (-clocal, см. раздел 7.4). А это, как мы знаем, приводит к перезапуску getty. При запуске mgetty восстанавливает clocal. Производит ли потом mgetty сброс clocal?

В этом абзаце для любопытных описаны другие события, которые происходят в модеме сами по себе, без Вашего участия. Кому не интересно, можно не читать :) При "убийстве" оболочки должно кратковременно пропасть DTR (как описано выше), но т.к. модем уже отсоединился от линии из-за потери несущей, то этот "миг" DTR он просто проигнорирует. Потеря несущей в свою очередь приводит также к пропаданию сигнала DSR (если в настройках модема записано &S1 или &S2), идущего от модема к последовательному порту, но и этот сигнал тоже игнорируется (только уже Linux). Помимо этого модем выдает код "NO CARRIER" ("НЕТ НЕСУЩЕЙ").

## 12.8 Настройка модема для приема звонков

Во всех разновидностях программы getty есть возможность задать строку инициализации для настройки модема. Другой способ настройки -- сохранить подходящую строку инициализации внутри самого модема (как это сделать см. в разделе Строки инициализации: задание и сохранение).

Настройка для приема звонков зависит как от используемой программы getty, так и, возможно, от самого модема. Несколько подсказок по AT-командам, которые могут пригодиться, представлены здесь (попробуйте поискать дополнительную информацию о конфигурации модема при приеме звонков в другой документации :)):

- `&C1` -- заставляет модем "отображать" на линии CD, идущей к последовательному порту, наличие несущей (сигнал CD присутствует только при наличии несущей). Getty_em требует для своей работы &C0 (сигнал CD присутствует постоянно)
- `&D3` -- производит полную перезагрузку (hard reset) модема при падении DTR (кто-то завершил сеанс или повесил трубку). Сообщалось, что для некоторых модемов надо задавать &D2, поскольку полная перезагрузка для них запрещена (?)
- `E0`-- отключает возврат AT-команд ("эхо") обратно на последовательный порт. Для agetty обязательна. Для mgetty некоторые советуют включать возврат AT-команд (команда E1). При включенном возврате E1 также можно будет увидеть, что было послано "наружу".
- `&K3` -- аппаратное управление потоком
- `Q0` -- выдача кодов выполнения (таких как CONNECT). Используется в большинстве разновидностей getty. Но, как сообщалось, версия uugetty от AT&T и agetty требуют задания Q1 (нет выдачи кодов).
- `S0=?` -- mgetty изначально считает, что S0=0 ("ручной" способ ответа), но Вы можете задать число звонков в командной строке mgetty. Если задать S0=3, то модем автоматически ответит на вызов после третьего звонка. В agetty используется автоматический способ ответа, как и в uugetty (обычно).
- `V1` -- отображает коды выполнения (такие как CONNECT) в словесной форме (а не в закодированной)
- `X4` -- распознавание сигнала в линии (непрерывный гудок) и сигнала "занято"

## 12.9 Обратный вызов (сallback)

Обрытным вызовом называется ситуация, когда модем абонента (звонящего) связывается с Вашим модемом и передает некоторую информацию, чтобы Ваш модем ему перезвонил. Зачем это может потребоваться? Причиной может быть желание сэкономить на оплате счетов за телефон в случае, если звонок от Вас стоит дешевле, чем от абонента к Вам (в России с 1 июля (?) 2006 года платит звонящий -- еще раз напоминает перев.). Другой причиной может стать проверка звонящего: тот ли он, за кого себя выдает? :) Если звонящий устанавливает соединение со _своего_ телефонного номера, то чтобы это проверить, надо просто перезвонить на данный номер.

Для Linux есть программа "callback", которая работает с mgetty. Найти ее можно по адресу: ftp://ftp.rug.nl/contrib/frank/software/linux/callback/, а пошаговые инструкции по ее установке (вместе с PPP) на http://www.stokely.com/unix.serial.port.resources/callback.html

## 12.10 Различение звонков

"Различением звонков" (Distinctive Ring) называется функция, заключающаяся в том, что модем отвечает только на определенные типы звонков, наподобие: длинный, короткий, длинный, короткий и т.д. Данная функция должна поддерживаться самим модемом. К примеру, модем Netcomm Roadster можно AT-командой (?) заставить посылать mgetty следующую последовательность: DROF=14 DRON=4 RING DROF=4 DRON=2 RING ..., которая означает, что после 1,4 секунды, которую заняла первоначальная пауза (DROF=14), последовал звонок длительностью 0,4 секунды (DRON=4) и т.д. После каждого звонка также выдается код выполнения RING. Надо сказать, что модем сам не отвечает на определенный звонок, он лишь информирует программу, прослушивающую последовательный порт (такую как mgetty), о последовательности звонков. Если программа находит (определяет) заданную последовательность звонков, то она посылает модему AT-команду для ответа на вызов. Увы, mgetty напрямую не распознает такие последовательности, но есть косвенный способ...

Mgetty ждет только "RING", а слова DRON и DROF (Distinctive Ring OFf) пропускает. Для модема Netcomm Roadster можно задать задержку между DRON= и RING. К примеру, Вы можете задать задержку в 2,0 секунды (судя по всему с точностью до десятой -- предполож. перев.). Однако, если в этот 2,0-секундный интервал поступит следующий звонок, то модем уже не пошлет слово RING, которое должно было бы следовать за первым звонком с заданной задержкой. Таким образом, Вы можете установить эту задержку такой, что модем не будет посылать mgetty сообщение "RING" при вызовах, у которых звонки следуют с меньшим периодом, чем заданный Вами. У вызовов, на которые mgetty надо отвечать, интервал между звонками, соответственно, должен быть больше :) Данный способ не всегда применим, в особенности с телефонной компанией, не предоставляющей абонентам на выбор различные типы звонков (Мне видится, что это можно использовать для "отфильтровывания" местных звонков от междугородних -- у междугородних звонки следуют друг за другом чаще. -- Добав. от перев.) Подходит ли данный способ для других модемов, поддерживающих различение звонков?

Для рассматриваемого модема указанная задержка устанавливается следующей AT-командой: AT+VDR=1,24 задает задержку в 2,4 секунды. Можно прописать эту команду в параметре "init-chat" в mgetty.config.

## 12.11 Голосовая почта (автоответчик)

Функция голосовой почты по сути представляет собой автоответчик, запущенный на компьютере. Чтобы воспользоваться ею, требуется "голосовой" модем и соответствующее программное обеспечение. Вместо того, чтобы сообщения записывались на магнитофонную ленту (что это? -- шутка перев. :)), они сохраняются в оцифрованном виде на жестком диске. Тот, кто Вам позвонит, услышит приветственное сообщение, после которого сможет оставить сообщение. В более продвинутых системах есть возможность сохранять сообщения в нескольких почтовых ящиках и проигрывать разные приветствия в зависимости от вызывающего абонента. Существующее свободное программное обеспечение для Linux пока что не имеет таких продвинутых возможностей, лишь самое необходимое для автоответчика :)

Мне известны две программы для голосовой почты под Linux: одна обладает минимальными возможностями (см. Программы для голосовой почты), другая -- более усовершенствованная, но пока что плохо документированная. Под второй я подразумеваю программу `vgetty`, которая поддерживает положения стандарта ITU v.253 и должна работать со всеми модемами ELSA. Она является необязательным дополнением широко распространенной и хорошо документированной программы `mgetty` (см. выше). В дистрибутиве Debian vgetty входит в пакет mgetty-voice, который устанавливается вместе с пакетами mgetty и mgetty-doc (пакет документации).

## 12.12 Прием звонков "вручную"

Это действительно можно сделать "вручную"! Правда, при этом звонящий не сможет войти в систему под своим именем (пройти идентификацию), но зато он сможет "пообщаться" с вами и т.п. Таким способом можно принимать звонки, не занимаясь при этом редактированием каких-либо файлов настройки и не задействуя getty. Чтобы осуществить это, запустите любую "терминальную" программу, тот же minicom. Убедитесь, что она "видит" модем, набрав "AT <Enter>" и получив в ответ "OK". Теперь ждите звонка. При поступлении звонка наберите "ATA", чтобы принять его. Т.к. getty при этом запущена не будет, то звонящий не сможет войти в систему (login не запустится). Но если звонящий соединяется с Вами также посредством "терминальной" программы, то он сможет послать Вам сообщение (и наоборот). Используя имеющиеся в "терминальной" программе (в том же minicom'е) команды, Вы оба можете посылать друг другу файлы. По-другому принять звонок можно, если до его поступления набрать команду "ATS0=3", в этом случае модем сам автоматически ответит после третьего звонка (можно указать и другое количество).

Этим же способом можно соединиться с ПК, на котором запущена MS Windows с HyperTerminal или Terminal (если это Windows 3.x или DOS), и передать напрямую файлы пользователю этого компьютера. Две упомянутые программы являются MS-аналогами minicom'а. Таким образом, для соединения "вручную" (Linux-to-Linux или MS-to-Linux, или Linux-to-MS) требуется, чтобы присутствовали два человека -- по одному с каждого конца телефонной линии, и чтобы у каждого из них была запущена своя "терминальная" программа. Следует предостеречь, что им обоим не стоит вводить какие-либо команды в терминале одновременно, поскольку это приведет к неразберихе. Также стоит сказать, что два человека, имеющие ПК (с модемом и свободной телефонной линией -- добав. перев.) данным способом всегда могут обменяться между собой файлами (будь то Linux или MS Windows). Еще этот простой способ можно использовать для предварительной проверки модема.

## 12.13 Удаленный доступ с графическим интерфейсом. VNC

Вместо простого (но требующего активных действий со стороны пользователя) способа соединения "вручную", описанного выше, можно получить удаленный доступ с графическим интерфейсом (GUI) к компьютеру с Linux. Для этого требуется наличие сети TCP/IP между двумя компьютерами. Один из способов получить такую "сеть" -- это позвонить компьютеру, настроенному на прием звонков, и запустить PPP. Протокол TCP/IP инкапсулирован в PPP. PPP должен быть запущен с обоих концов телефонной линии. mgetty можно настроить на запуск PPP при установлении соединения, а звонящий может использовать ту же программу для дозвона, посредством которой он связывается с Интернет-провайдером: wvdial, eznet, chatscripts устанавливают PPP-соединение.

Взамен такой очень маленькой сети, не выходящей за пределы телефонной линии, можно подключиться к значительно большей сети (всемирной) через Интернет-провайдера. Но многие из провайдеров используют прокси-серверы, которые могут не давать доступа к необходимым портам. К тому же, IP-адрес, выдаваемый Вам, является динамическим, только на время текущего сеанса. Поэтому тому, кто захочет к Вам подключиться, надо будет сообщить этот IP. За отдельную плату можно получить постоянный IP-адрес.

Удаленный доступ с графическим интерфейсом можно организовать с помощью программы Virtual Network Computer (VNC) от AT&T, выпущенной по GPL. Она имеет серверную часть, которая запускается на ПК с Linux принимающей стороны, и клиентскую часть (viewer) для вызывающей стороны. Для работы VNC требуется наличие сети, сама она соединение не устанавливает. В серверную часть VNC встроен X-сервер, позволяющий использовать оконный менеджер twm. См. статью о VNC в Linux Magazine: http://www.linux-mag.com/2000-11/desktop_03.html. Сайт программы VNC: http://www.uk.research.att.com/vnc/.

С помощью VNC можно также подключиться к удаленному ПК с Windows, получив тем самым Windows GUI на ПК с Linux и возможность запускать Windows-программы на удаленном ПК с Windows. Конечно, для этого необходимо, чтобы на удаленном Windows-ПК была запущена VNC (сервер). Естественно, работа с удаленным ПК при доступе с графическим интерфейсом будет медленнее, чем при "только текстовом" доступе, особенно если это будут KDE или GNOME с 16-битной цветностью.

## 12.14 Взаимодействие с MS Windows

После того, как Вы настроите свой ПК для приема звонков, с Вами можно будет соединиться, используя для этого minicom (или похожую программу) из любой Unix-подобной системы. В MS Windows для этого можно использовать HyperTerminal (Terminal в Windows 3.1 или DOS).

В Windows для связи по телефонной линии с использованием сетевого протокола есть "Удаленный доступ" ("Dial-up Networking") (?). Но связаться с Linux через это средство, скорее всего, не получится. Для установки такого соединения один ПК с Windows (принимающий) выступает в роли "сервера", а другой ПК с Windows (вызывающий) -- в роли "клиента". Такое подключение часто называют "дистанционным управлением" ("remote control"), поскольку звонящий может использовать ваш ПК, запускать на нем программы и, в общем-то, управлять им :о)

Если соединиться из MS Windows с Linux в текстовом режиме (командная строка) достаточно легко, то из Linux с Windows связаться не так просто (отчасти потому, что Windows изначально графическая система).

Тем не менее, с "Удаленным доступом" Windows можно установить соединение, если использовать сетевые протоколы MS или Novel (оба эти протокола не являются родственными Linux). Просто так соединиться из Linux с сервером "Удаленного доступа", запущенным кем-то, например, в Windows 98, не выйдет. При данном типе соединения звонящий не может запускать большинство программ на удаленном компьютере, в отличии от подключения к ПК с Linux (?) (некоторое противоречие с написанным выше -- перев. в недоумении и просит помочь ему разобраться). Такое соединение называют "удаленным доступом" ("remote access"): можно пересылать файлы, использовать принтер(ы) удаленного компьютера, иметь доступ к базам данных и т.д. Есть ли способ соединиться с "Удаленным доступом" из Linux?? (вопрос автора -- прим. перев.)

Minicom, запущенный в Linux, и HyperTerminal, запущенный в Windows, позволяют обмениваться сообщениями и пересылать файлы. См. Прием звонков "вручную".

Можно организовать доступ с графическим интерфейсом к своему комьютеру. Для этого требуется наличие сетевого протокола (TCP/IP). Для Windows можно использовать программу PC Anywhere или VNC, которая работает и с Linux, и с Windows. PC Anywhere не взаимодействует с Linux, вроде бы?? Для "дистанционного управления" есть также Windows-программы Laplink, Co-Session и Microcom. Поддерживает ли какая-нибудь из этих программ Linux, помимо VNC??

Следующий Предыдущий Содержание