Ключевые слова:modem, fax, hylafax, ubuntu, linux, mgetty, voice, (найти похожие документы)
From: Беленьков Николай <n.belenkov@gmail.com.>
Newsgroups: email
Date: Mon, 23 May 2008 17:02:14 +0000 (UTC)
Subject: Настройка факс-севера Hylafax
Данный документ представляет собой комментарий к настройке факс-сервера
Hylafax с функцией голосового оповещения а-ля "Примите факс пожалуйста".
Я использовал систему Ubuntu Server i386 7.10.
Рабочее железо: старенький Celeron 800 с 20 гигабайтным винтом и128
мегабайтами оперативной памяти. Модемов использовал несколько. Сначала
был внутренний USR Courier voice 56k int. Но, как позже выяснилось, сей
модем криво поддерживает войсовые функции. Поэтому, поискав информацию в
Интернете, а в частности на сайте Hylafax'a www.hylafax.org, выбрал для
покупки модем IDC-5614BXL/VR. Этот модем основан на чипе Rockwell,
который войс-комманды поддерживает хорошо.
Ставим систему, после чего делаем:
apt-get install libtiff4 libtiff4-dev
apt-get install gs-gpl gsfonts
apt-get install hylafax-server
После того как система настроит нужные пакеты, можно приступать
непосредственно к настройке сервера. Позже я столкнулся с граблями, с
которыми мучался весьма долго. Версия сервера из рипозиториев, к
сожалению, не имеет корректной поддержки голоса. Поэтому, после
переписки с разработчиками, я поставил версию Hylafax+, взятую с
неофициального сайта девелоперов http://hylafax.sourceforge.net/download.php .
Версия Hylafax+, по сравнению с обычной, имеет несколько преимуществ,
главное из которых поддержка голоса. Скачиваем архив, распаковываем в
папку, делаем make, затем make install (естественно предварительно
удалив предыдущий сервер hyalfax, поставленный из рипозиториев).
Итак, мы имеем систему с модемом и установленным Hylafax'ом.
Запускаем команду faxsetup, следуем всем инструкциям и вопросам, будет
ругаться на отсутствие программ egetty, но это не страшно. После
окончания faxsetup, будет автоматически вызван faxaddmodem, чтобы
добавить модем в факс-сервер. Делаем все настройки по умолчанию, только
ставим класс утройства 1.0 (позже будет описано почему).
Рассмотрим поближе структуру фак-сервера по каталогам и файлам.
/etc/hylafax - файлы конфигурации, которые определяю правила набора
/var/spool/hylafax - корневой каталок факс-сервера, в котором лежат
основные компоненты программы. Опираясь на этот каталог, рассмотрим
"внутренности".
etc/ - один из самых главных каталогов для нас, в нем находятся
файлы конфигурации модема и юзеров.
log/ - здесь у нас логи, пишущиеся при каждом обращении факс-сервера к модему
sendq/ - очередь, тут лежат файлы, отвечающие за очередь
docq/ - очередь, тут лежат непосредственно документы на отправку.
Вот вроде бы и всё. Самое необходимое рассмотрено.
Взглянем внутрь конфига /var/spool/hylafax/etc/config.ttyS0
# $Id: conexant-1.0,v 1.5 2008/01/14 06:00:39 faxguy Exp $
#
# Configuration for a Rockwell/Conexant K56 Class 1.0 modem using
# the RCV56DPF and similar chipsets. These chipsets are generally
# flash- upgradable and appear on ISA as well as PCI. They
# support "Class 1.0" which means that they have "adaptive receive"
# (AT+FAR=1), but not V.34.
#
# Comtrol RocketModem II/III/IV
# MultiTech MT5600ZDX
# Zoltrix FMVSP56i3
#
#
CountryCode: 7
AreaCode: 812
FAXNumber: +7.812.309.0607
LongDistancePrefix: 8
InternationalPrefix: 10
DialStringRules: etc/dialrules
ServerTracing: 1
SessionTracing: 0xFFF
RecvFileMode: 0644
LogFileMode: 0644
DeviceMode: 0644
RingsBeforeAnswer: 1
SpeakerVolume: off
GettyArgs: "-h %l dx_%s"
LocalIdentifier: Concord
TagLineFont: etc/lutRS18.pcf
TagLineFormat: "From %%l|%c|Page %%P of %%T"
PercentGoodLines: 75
MaxConsecutiveBadLines: 25
MaxRecvPages: 25
#
#
# Modem-related stuff: should reflect modem command interface
# and hardware connection/cabling (e.g. flow control).
#
ModemType: Class1.0 # use this to supply a hint
ModemRate: 115200 # rate for DCE-DTE communication
ModemFlowControl: rtscts # default
ModemDialCmd: "ATS7=50\nAT&K3#CLS=8\nAT#VRA=1\nAT#VSR=11025#VBS=8\nATDT%s\n<waitfor:VCON>
AT#VLS=4\nAT#VTX\n<waitfor:CONNECT><play:1><waitfor:VCON>AT+FCLASS=1\nATD"
#
# With the RocketModem IV (and possibly III) you may need to use a much
# higher ModemRate than 19200 because, apparently, it suffers from potential
# buffer underrun problems. Fortunately, it doesn't have buffer overflow
# issues, and so using 115200 should work (both rtscts and xonxoff test good).
#
ModemNoFlowCmd: AT&K0 # setup no flow control
ModemHardFlowCmd: AT&K3 # setup hardware flow control
ModemSoftFlowCmd: AT&K4 # setup software flow control
ModemSetupDTRCmd: AT&D2 # setup so DTR drop resets modem
ModemSetupDCDCmd: AT&C1 # setup so DCD reflects carrier (or not)
#
Class1AdaptRecvCmd: AT+FAR=1 # reports carrier detection mismatches
Тут самые главные для нас параметры, это MaxConsecutiveBadLines,
PercentGoodLines, ModemRate и ModemDialCmd. Параметра ModemDialCmd в
базовом, созданном faxaddmodem'ом, конфиге может не быть, поэтому
добавляем самостоятельно.
Параметр ModemRate выставлен в 115200, это необходимо для проигрывания
голоса модемом в диал линию.
Параметры MaxConsecutiveBadLines и PercentGoodLines сделаны такими,
чтобы у нас небыло непрошедших факсов, это необходимо при посылке факсов
через межгород и на не очень хороших линиях.
Параметр ModemDialCmd имеет следущее значение (две строки объединить в одну)
"ATS7=50\nAT&K3#CLS=8\nAT#VRA=1\nAT#VSR=11025#VBS=8\nATDT%s\n<waitfor:VCON>
AT#VLS=4\nAT#VTX\n<waitfor:CONNECT><play:1><waitfor:VCON>AT+FCLASS=1\nATD".
Детально обратим внимание на каждую команду модему. Для более лучшего
восприятия советую погуглить и поискать стандартные АТ команды модема,
это поможет понять разницу между классами устройств (1, 1.0, 2, 2.0, 8).
Итак, команды:
AT&K3#CLS=8 - Перевод модема в режим работы класса 8
AT#VRA=1 - это таймер, отвечающий за непоявления зуммера в линии (ниже я
детально опишу зачем это надо)
AT#VSR=11025 - Выставляем для модема частоту дискретизации войсовых данных
ATDT%s - набор номера :)
<waitfor:VCON>AT#VLS=4 - ожидать ответ модема VCON и передать модему
команду вывода звука в диал линию
AT#VTX - переход в режим передачи голоса
<waitfor:CONNECT><play:1><waitfor:VCON>AT+FCLASS=1 - ожидаем ответ
модема CONNECT, проигрываем файл play1.raw, находящийся в каталоге
/var/spool/hylafax/etc (как написано в man hyalfax-config '<play:C>,
whereis C is part of file name playC.raw', ну или как-то так, точно и
дословно не помню :) ), снова ожидаем ответ модема VCON, и после
проигранного звука переводим модем в режим класса 1.
Вот тут то я и столкнулся с проблемами, с которыми просидел весьма долго,
и не мог понять в чем у меня дело. После переписки с разработчиками, они
выслали мне патч. Как оказалось в исходном коде была допущена ошибка -
серверная часть hylafax'а не распознавала ответ модема VCON, после чего
в логах отражалось, что у нас модем не ответил по тайм-ауту. Применив
патч, всё стало работать. Через день разработчики выпустили новый билд ;)
ATD - После перевода модема в режим класса 1, перевод модема в режим передачи данных.
Теперь немного по-подробней о параметре AT#VRA=1. Это таймер, который
модем запускает, когда он не "слышит" гудка в линии. Таким образом можно
считать, что на другом конце сняли трубку. Вот что по-поводу этой
команды написано в мануале к чипам Rockwell:
#VRA Ring back goes away timer (originate) :
Options : #VRA?, #VRA=?, 0 to 255
Default : #VRA=70
This command is used when originating a voice call (#CLS=8) to
set the value of the "Ring back Goes Away" timer. The "Ring back
Goes Away" timer is the period of time measured from the time
the ring back cadence stops (in units of 100 ms) until the next
ring back is detected. If ring back is not detected within the
relevant period, the modem assumes that the remote has picked up
the line and switches to on-line voice command mode. Each time a
ring back cycle is detected, the "Ring back Goes Away" timer is
reset.
#VRA?
Returns the current setting of the #VRA command as an ASCII
decimal value in result code format.
#VRA=?
Returns the message '0-255'.
#VRA=0
Switches off the "Ring back Goes Away" timer. After one ring
back, the dialling modem sends VCON and enters on-line voice
command mode immediately.
#VRA=n
Where n has the range 0 to 255. Defines the period without ring
back (after at least one ring back has been detected) in 100 ms
units.
Есть также еще полезный параметр AT#VRN, с которым тоже можно
поиграться, но я не увидел в нем практического смысла. Вот что написано
про него в мануале:
#VRN Ring back never came timer (originate) :
Options : #VRN?, #VRN=?, 0 to 255
Default : #VRN=100
This command can be used if originating a voice call (#CLS=8) to
set the "Ring back Never Came" timer value, an amount of time
(in units of 100 ms) measured from completion of dialling. If
ring back is not detected within this period, the modem assumes
the remote has picked up the line and switches to on-line voice
command mode.
#VRN?
Returns the current setting of the #VRN command as an ASCII
decimal value in result code format.
#VRN=?
Returns the message '0-255'.
#VRN=0
turns off the 'ring back never came timer'. After dialling, the
modem sends VCON and enters on-line voice command mode
immediately.
#VRN=n
where n has the range 0 to 255 (100 ms units), and defines the
period without ring back after dialling.
Теперь, рассмотрев конфиг, необходимо добавить пользователя. Добавление
происходит путем запуска команды faxadduser. Команда проста, поэтому я
не буду описывать каждый параметр :)
После добавления юзера, можно использовать клиентскую часть софта.
Различные клиенты можно выбрать тут -
http://www.hylafax.org/content/Client_Software . Лично я для установки
на Windows систему выбрал Winprint Hyalfax, т.к. это предельно простой
софт, и отсылка факса осуществляется путем печати на виртуальный
принтер. Как можно настроить клиент, можно почитать на его сайте.
Теперь о звуке.
Вам необходим пакет mgetty-pvftools для конвертации звукового файла в
формате wav в формат raw.
Берем файл в формате wav, конвертируем его в формат pvf командой
wavtopvf. Настройки зависят от вашего модема, поэтому необходимо
разобраться какие частоты и битность поддерживает ваш модем.
Готовый файл конвертируем в raw формат командой pvftormd. Полезно будет
посмотреть pvftormd -L :) Готовый файл кладем в директории.
/var/spool/hylafax/etc/ .
Итак, теперь мы имеем готовый к использованию факс-сервер, и можем
посылать факсы хоть прямо из Ворда или 1С :)
P.S. если вас не устраивает громкость файла, то можно установить пакет
sox, который позволяет также конвертировать из mp3 в wav и многое многое
другое, в том числе увеличение громкости.
Автор: Николай Беленьков: [email protected]
При перепечатке, ссылка на автора - обязательна.
Если не трудно, вышлите мне этот патч.
Я установил hylafax+ 5.2.5 (hylafax-5.2.5-1.fc8.i386.rpm)
у меня после посылки голосового файла в логах тоже таймаут
войсовые функции он поддерживает нормально
в чем кривость к сожалению автор не пояснил
добавлю от себя глюк который сильно осложняет
подобную конфигурацию
в usr модемах есть проблема с началом передачи факса - если передающий модем не услышал пилот тон
принимающего модема - он ни в какую не начинает передачу факса - эта проблема описана например на сайте venta-fax и в нашем случае пока мы проговариваем примите факс - если мы натыкаемся на факс автомат - проскакивает пилот тон факса
решение этой проблемы два звонка с заменой конфигурации - одна с голосом другая без
если же автор не смог заставить говорить модем - то проблема скорее всего в формате файла голосового
так например если файл записан по vm record из пакета vgetty (GSM кодек) то в нем еще присутствует заголовок 32 байта - которые в модем посылать не надо. если его удалить то модем нормально говорит - по описанной автором конфигурации и прекрасно посылает факсы - если на той стороне стартует человек.
А мне бы хотелось не "файл" отправлять в качестве звука, а чтобы можно было в клиенте windows-машины по микрофону интерактивно разговаривать с человеком на том конце линии, и уже после того как убеждаемся в приеме, нажимать на кнопочку "старт" для отправки факса. Кроме VentaFax'a, я пока не нашел другово решения, но VentaFax меня не устраивает так как серверная часть работает только на windows-сервере... Если кто знает решение как передавать голос по сети до линукс-сервера, напишите пожайлуста?
> А мне бы хотелось не "файл" отправлять в качестве звука, а чтобы
> можно было в клиенте windows-машины по микрофону интерактивно разговаривать с человеком
> на том конце линии, и уже после того как убеждаемся в
> приеме, нажимать на кнопочку "старт" для отправки факса. Кроме VentaFax'a, я
> пока не нашел другово решения, но VentaFax меня не устраивает так
> как серверная часть работает только на windows-сервере... Если кто знает решение
> как передавать голос по сети до линукс-сервера, напишите пожайлуста?