Глава 16

Fax

Не бойтесь совершенства. Вы никогда не дотянитесь до него.

— Salvador Dali

Понятие факсимильной передачи появилось более 100 лет назад, но не использовалось до 1980-х годов, пока использование факсимильных аппаратов стало необходимым в бизнесе. Это продолжалось в течение двух десятилетий. Затем пришел Интернет и вскоре после этого, факс быстро стал отмирать.

Что такое Fax?

Факсимильный аппарат позволяет факсимилировать (копировать) документ, который будет передан через телефонную линию. В эпоху Интернета такого рода функциональность кажется бесполезной, однако, до распространения Интернета, это была очень полезная вещь. Факсимильные аппараты сканировали документ в цифровой формат, передавали цифровую информацию аналогично тому, как используется аналоговый модем, а затем преобразовывали и распечатывали полученную информацию на другом конце.

Способы обработки факсов в Asterisk

Asterisk предоставляет возможность отправлять и получать факсы, но следует отметить что Asterisk реализует основной транспорт факса. Это означает, что нужно использовать внешние программы и ресурсы для предоставления всех возможностей требуемых вашими пользователями сверх того, что умеет Asterisk.

Asterisk факс может:

  • Распознавать входящее факс соединение, и переговорные сесии
  • Сохранять (получать) входящие факс как Tagged Image File Format (TIFF) файл
  • Принимать TIFF файлы в факс совместимых форматах
  • Передавать TIFF файлы для других факс машин

Asterisk факс не может:

  • Печатать факсы
  • Получать документы для передачи в любых других форматах отличных от TIFF

Получение относительно простое, поскольку формат документа определяется на передающей стороне и, таким образом, всё, что нужно сделать Asterisk, это сохранить документ.

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

spandsp

Первоначально единственным способом обработки факсов в Asterisk был через библиотеку spandsp. spandsp предоставляет множество Digital Signal Processing (DSP), но в этом контексте все мы заинтересованы в функциональности факса.

Asterisk имеет загвоздку с включением библиотеки spandsp в сборку. Из-за несовместимости лицензий, библиотека spandsp должна быть загружена и скомпилирована отдельно от Asterisk. Кроме того, поскольку spandsp была написана не только для Asterisk, она не будет считать, что установлена для Asterisk. Это означает, что нужно несколько дополнительных шагов, чтобы Asterisk мог использовать spandsp.

Получение spandsp

На момент написания, текущая версия spandsp — 0.0.6.

Скачать и распаковать исходный код spandsp можно так:

$ mkdir ~/src/asterisk-complete/thirdparty

$ cd ~/src/asterisk-complete/thirdparty

$ wget http://www.soft-switch.org/downloads/spandsp/spandsp-0.0.6pre21.tgz

$ tar zxvf spandsp-0.0.6pre21.tgz

$ cd spandsp-0.0.6

Компиляция и установка spandsp

spandsp опирается на библиотеки изображений — вам нужно установить несколько дополнительных пакетов. В Ubuntu это делается относительно легко, потому что вы можете установить один пакет, а установщик позаботиться о зависимостях, а вы отдыхайте:

$ sudo apt-get install libtiff-dev

Или, на RHEL:

$ sudo yum install -y libtiff-devel

Пакет spandsp должен компилироваться и устанавливаться следующими командами:

$ ./configure

$ make

$ sudo make install

Это позволит установить библиотеку в каталог /usr/local/lib/. На многих системах Linux эта папка не выбирается автоматически как путь к библиотеке (libpath), так что путь нужно будет добавить вручную.

Добавление библиотеки spandsp в ваш libpath

Для того, чтобы библиотека spandsp была видима всеми приложениями в системе, папка, где она находится должна быть добавлена к libpath в системе. Обычно это делается путем редактирования файлов в каталоге /etc/ld.so.conf.d/. Вы просто должны убедиться, что в одном из файлов есть этот каталог /usr/local/lib. Если нет, то следующая команда создаст подходящий для вас файл:

$ sudo cat >> /etc/ld.so.conf.d/usrlocallib.conf

$ /usr/local/lib

Нажмите Ctrl+D для сохранения файла, затем запустите команду ldconfig для обновления путей библиотеки:

$ sudo ldconfig

Теперь вы готовы перекомпилировать Asterisk для поддержки spandsp.

Перекомпиляция Asterisk с поддержкой spandsp

Поскольку библиотека spandsp, вероятно, не была установлена в системе когда Asterisk был впервые собран, то вам нужно быстро перекомпилировать Asterisk, чтобы иметь поддержку spandsp:

$ cd ~/src/asterisk-complete/asterisk/11/

$ ./configure

$ make menuselect

Убедитесь, что под заголовком Resource Modules (модули ресурсов), раздел spandsp выглядит следующим образом:

[*] res_fax_spandsp

Если вы видите во это:

XXX res_fax_spandsp

Это значит, что Asterisk не смог найти библиотеку spandsp.

После того как вы убедились что Asterisk может видеть spandsp, вы готовы перекомпилировать его. Сохранитесь, выйдите из menuselect и выполните следующие команды:

$ make

$ make install

Вы можете убедиться, что spandsp работает с Asterisk, выполнив следующую команду из командной строки CLI Asterisk:

*CLI> module show like res_fax_spandsp.so

С этого момента приложения диалплана SendFAX() и ReceiveFAX() будут доступны для вас.

Отключение spandsp (Если вы хотите проверить Digium Fax)

Библиотека spandsp и библиотека Digium факс, обсуждаемая в следующем разделе, являются взаимоисключающими. Если вы хотите попробовать продукт Digium факс, то должны убедиться, что spandsp не загружен. Чтобы отключить spandsp в Asterisk, просто отредактируйте файл /etc/asterisk/modules.conf следующим образом:

noload => res_fax_spandsp.so

;noload => res_fax_digium.so

Сохраните изменения и перезапустите Asterisk.

Digium факс для Asterisk

Digium Fax For Asterisk (FFA) был разработан на основе сильного желания сообщества Asterisk иметь поддерживаемый Digium факс в Asterisk. Бесплатно для одноканального использования, этот продукт также может быть лицензирован от Digium для использования факса с более чем одним каналом.

Получение Digium FFA

Digium FFA может быть получена с веб-сайта Digium. Процесс загрузки, установки и регистрации этой библиотеки тщательно задокументирован в документе Fax For Asterisk Administrator Manual, который можно скачать с сайта Digium. Вам нужно будет зарегистрироваться на сайте компании Digium для того, чтобы получить бесплатный одноканальный лицензионный ключ факса и скачать руководство администратора. Существует также всеобъемлющий файл README в комплекте с программным обеспечением, в котором подробно описаны шаги, необходимые для получения Digium FFA и запуска на вашей системе.

Мы также рекомендуем периодически использовать программу benchfax, чтобы проверить какой процессор лучше всего на вашей системе. В одном случае, FFA оптимизированный для Core 2 Duo на самом деле показывают лучшие результаты на старых двухъядерных Pentium II системах, что явно неправильно. Повторное тестирование покажет какие ядра дают стабильно лучшие результаты.

Отключение Digium FFA (Если вы хотите проверить spandsp)

Библиотека Digium FFA и библиотека spandsp являются взаимоисключающими. Если вы хотите попробовать spandsp, то должны убедиться что Digium FFA не загружается. Чтобы отключить FFA, просто отредактируйте файл /etc/asterisk/modules.conf следующим образом:

noload => res_fax_digium.so

;noload => res_fax_spandsp.so 1

Обычно мы помещаем инструкции noload в пары, а затем раскомментируем только одну из них, в зависимости от того, какую из них мы хотим проверить. Это позволяет переключаться между ними так же просто, как комментировать одну и раскомментировать другую.

Сохраните изменения и перезапустите Asterisk.

Обработка входящих факсов

Принятые факсы обычно закодированы в формат TIFF (Tagged Image File Format). Этот формат графических файлов хоть и не так известен как JPEG или GIF, но и не так неизвестен, как можно было бы подумать. В самом деле, мы подозреваем что ваш компьютер (не важно Windows, Linux, или MacOS) уже будет иметь встроенную возможность интерпретировать TIFF файлы. Было интересное предложение сделать PDF форматом для передачи факсов главным образом из-за того, что многие программы просмотра изображений ожидают от TIFF только одно изображение, содержащееся в нём. Если вы просматриваете полученное TIFF изображение, ожидая увидеть несколько страниц, и видите только первую страницу, виновником часто является программа просмотра изображений. Часто куда проще перевести ваши TIFF изображения в PDF и просматривать полученное, вместо того, чтобы выяснять, какая программа просмотра изображений позволит вам увидеть несколько страниц факса в TIFF формате.

Принятые факсы будут сохраняться Asterisk в виде файлов. Место хранения этих файлов будет зависеть от нескольких факторов, в том числе:

  • Какую программу вы используете для эмуляции факс модема (т.е. IAXmodem, Digium ReceiveFAX и прочие.)
  • Расположение в файловой системе, которое вы указали для хранения принятых факсов
  • Любая постобработка, настроенная вами, для выполнения с полученными файлами

В диалплане вам необходимо построить логику присвоения имен факсам таким образом, что бы они отличались друг от друга. Есть много переменных, каналов и функций, которые могут быть использованы для этой цели, как например функция STRFTIME(). Asterisk может легко обрабатывать захват факса в файл, но вам нужно разобраться что происходит с этим файлом, когда он хранится в системе.

Использования некоторых переменных в имени может быть опасно для вашей системы безопасности, особенно при использовании переменных, которые могут быть установлены удаленно, например ${CALLERID(name)} и даже ${CALLERID(num)}. Если вы решили попробовать использовать интеллектуальные имена, то должны быть осторожны чтобы гарантировать, что некоторые метасимволы оболочки будут либо удалены из названия (что проще) или должным образом экранированы (что более сложно) при работе с оболочкой. Мы рекомендуем при использовании значения CALLERID() переносить его с функцией диалплана FILTER(), как в ${FILTER(A-Za-z0-9\\x28-\\х2F,${CALLERID(name)})}, чтобы удалить потенциально опасные символы. Кодирование диапазона \\x28-\\x2F разрешает символы типа запятая и круглые скобки без их интерпретации Asterisk.

Факс в TIFF

Подмножество формата TIFF уже в течение долгого времени было де-факто форматом файлов, используемым для факсов. Однако, поскольку просмотрщики изображений регулярно показывают только первую страницу факса, хранящегося в TIFF, прямой просмотр изображения часто приводит к разочарованию (или, что еще хуже, ложному диагнозу, что была получена только первая страница).

После завершения входящего факсимильного вызова полученный файл TIFF можно открыть непосредственно из папки, в которой он был сохранен,или преобразовать в PDF. Вы можете установить полезную утилиту командной строки tiff2pdf для выполнения перевода, которая может быть установлена на RHEL с командой:

$ sudo yum install libtiff

и на Ubuntu:

$ sudo apt-get install libtiff-tools

После установки программы будет немного сложнее, она выводит изначальный файл в PDF наэкран, если вы не перенаправите вывод в файл. Этот очевидный недостаток утилиты на самом деле является функцией, мы используем её с почтовыми вложениями, которые могут принимать команды в качестве аргумента, пока изображения TIFF хранятся на нашем сервере Asterisk поскольку они меньше, чем полученный PDF. Если это кажется слишком сложным, вы можете просто создать PDF файл:

$ tiff2pdf filename.tiff > filename.pdf

или, использовать команду для отправки вышеупомянутого вложения без сохранения промежуточных файлов:

Вам нужно будет установить пакет MIME::Lite для Perl, чтобы использовать этот скрипт. Для RHEL имя пакета — perl-MIME-Lite. Для Ubuntu имя пакета — libmime-lite-perl.

#!/usr/bin/perl

use MIME::Lite; 1

my ($filename,$person,$email) = @ARGV;

my $msg = MIME::Lite->new(

From => ‘[email protected]’,

To => $email,

Subject => «Fax received!»,

Type => ‘multipart/mixed’

);

$msg->attach(

Type => ‘TEXT’,

Data => «Dear $person,\n\n\tYou have received a fax. » .

«It is attached.\n\n—The ShiftEight Fax Server\n»

);

$msg->attach(

Type => ‘application/pdf’,

Path => «/usr/bin/tiff2pdf -a \»$cidname\»

«/var/spool/asterisk/faxes/$filename |»,

Filename => «fax.pdf»,

Disposition => ‘attachment’

);

$msg->send;

Использование пакета MIME :: Lite выходит за рамки этой книги; однако, поскольку это очень просто иллюстрирует использование утилиты tiff2pdf, мы считаем, что оно стоит того, чтобы его включить.

Факс в Email

После того как Asterisk получил факс, полученный файл TIFF нужно передать в конечный пункт назначения: человеку.

Ключевым соображением является то, что если Asterisk не знает достаточно подробно о факсе, невозможно будет узнать предполагаемого получателя не прочитав сам факс (обычно для факса есть титульная страница с информацией получателя, написанной на ней, но даже самые способные программы распознавания текста будут иметь затруднения). Другими словами, если вы не выделите DID каждому пользователю, который может получить факс, Asterisk не сможет сделать больше, чем отправить все факсы на один адрес электронной почты. Вы можете написать обработку этого в диалплане, используя внешнее задание cron или другой дискриптор демона, распространяющий полученные факсы.

Простой диалплан для обработки факса по электронной почте может выглядеть примерно так (вам понадобится приведенный выше скрипт Perl, расположенный в /opt/asteriskbook/bin/sendfax.pl):

exten => fax,1,Verbose(3,Incoming fax)

; где изначально будут храниться входящие факсы

same => n,Set(FAXDEST=/tmp)

; вставляем метку времени в этот файл для уникальности этого файла

same => n,Set(tempfax=${STRFTIME(,,%C%y%m%d%H%M)})

same => n,ReceiveFax(${FAXDEST}/${tempfax}.tif)

same => n,Verbose(3,- Fax receipt completed with status: ${FAXSTATUS})

; *** Эта строчка не должна содержать разрывов строчек

same => n,System(/opt/asteriskbook/bin/sendfax.pl ${FAXDEST}/${tempfax}.tif «Leif Madsen» [email protected])

Очевидно, что этот пример не подходит для продакшена (например, он не обрабатывает сбойные факсы), однако, этого достаточно, чтобы начать создавать более функциональный обработчик входящих факсов.

Fax в PDF

Популярная просьба отсылать пользователям факс в формате PDF. Настольные компьютеры на PC, Mac и Linux могут напрямую читать файлы TIFF без преобразования, это не является строго обязательным. Тем не менее, многие люди настаивают на этой функциональности.

Обнаружение факса

Вы можете иметь специальный телефонный номер для приема факсов. Однако, с Asterisk это не является обязательным требованием. Asterisk имеет возможность обнаружить, что входящий вызов является факсом и может обрабатывать его по-разному в диалплане. Обнаружение факса доступно как для DAHDI так и для SIP-каналов. Чтобы включить его для DAHDI, установите параметр faxdetect в /etc/asterisk/chan_dahdi.conf. В большинстве случаев, вы должны установить этот параметр для входящих. В Таблице 19-1 перечислены возможные значения для faxdetect в chan_dahdi.conf.

Таблица 19-1. Возможные значения параметра faxdetect в chan_dahdi.conf

Значение Описание
incoming Включает обнаружение факса на входящих вызовах. Когда факс обнаружен, применяется опция faxbuffers если она есть и вызов перенаправляется в расширение fax в диалплане. Для большей иформации о опции faxbuffers, смотри раздел «Использование буфера факса в chan_dahdi.conf».
outgoing Включает обнаружение факса на исходящих вызовах. Если факс обнаружен, опция faxbuffers будет применена, канал будет переведен и запущено выполнение диалплана с расширением fax.
both Включает определение факса для входящих и исходящих вызовов.
no Отключает определение факса. Установленно по умолчанию.

Чтобы включить обнаружение факса для SIP вызовов, вы должны установить опцию faxdetect в /etc/asterisk/sip.conf. Эта опция может быть установлена в разделе [general] или для конкретного пира. Таблица 19-2, описывает возможные значения опции faxdetect в sip.conf.

Таблица 19-2. Возможные значения faxdetect в sip.conf

Значение Описание
cng Включает обнаружение факса путем просмотра аудио для тона CNG. Если обнаружен тон CNG, то вызов перенаправляется в расширение fax в диалплане.
t38 Перенаправляет вызов в расширение fax в диалплане если получено приглашение T.38.
yes Включает обнаружение факса на основе обоих — cng и t38 систем.
no Отключает обнаружение факса. Установлено по умолчанию.

Использование T.38

Одна из первых вещей, которую вы заметите при попытке получить факс от поставщика услуг VoIP — это выдающаяся частота сбоев. Как обсуждалось выше, факс особенно разборчив в задержке между конечными точками, и некоторые факсимильные аппараты просто быстро сдадутся, а не попытаются договориться, в то время как другие будут работать нормально. В сценарии на основе аудио факс-через-VoIP мы наблюдали показатель успешности менее 50 процентов при попытке получить факсы, а многие отправляющие факс машины просто не будут работать вообще.

T.38 особенно полезен в этом случае, поскольку протокол предназначен для согласования этой проблемы с задержкой. В самом простом смысле T.38 просто получает факс по частям с одной стороны, передает полученные фрагменты изображения по VoIP, затем повторно передает факс на другом конце. Избегая характерных особенностей сигнала факса, вероятность успеха может быть увеличена до более чем 90 процентов1.

Мы обнаружили, что получение TIFF файлов, размер которых меньше, чем 2000 байт, как правило, неудачны и их не нужно отправлять на почту получателю.

К счастью, все что нужно сделать для того, чтобы включить сигнализацию T.38; просто включите t38pt_udptl в sip.conf.

t38pt_udptl = yes

Это включает передачу факсов по T.38, если удаленная точка поддерживает его, а если нет, SendFax будет пытаться вернуться к передаче, основанной на аудио.

Какой VoIP-провайдер?

Стоит также отметить, что некоторые VoIP провайдеры, включая очень популярных, просто не поддерживают T.38 по какой-то причине. Есть много провайдеров в разных местах, которые не имеют с этим проблем, просто обеспечивающих поддержку T.38. Мы использовали Flowroute в нашем тестировании на производственных серверах, и были очень довольны той легкостью с которой они поддерживают T.38.

Обработка исходящих факсов

Передача факсов из Asterisk является задачей более сложной, чем их получение. Это связано с объемом работ по подготовке факса к передаче. Хотя нет ничего сложного в передаче факсов, но вы должны сделать некоторые проектные решения о таких вещах как:

  • Как получить исходный файл факса, отформатированый для Asterisk
  • Как получить исходный файл факса в системе Asterisk (указать в каком каталоге Asterisk может получить их)
  • Что делать с переданными факсами (сохранять их? удалять их? перемещать их куда-то?)
  • Как обрабатывать ошибки передачи

Передача факса из Asterisk

Для передачи факса из Asterisk вы должны иметь файл в формате TIFF. Важно как вы создаете этот TIFF и создание может включать множество шагов. Тем не менее, с точки зрения Asterisk, отправка факсов довольно проста. Вы просто запусткаете приложение SendFAX() в диалплане, передав ему путь к существующему файлу TIFF:

exten => faxthis,1,NoOp()

same => n,SendFAX(/путь/к/файлу/факса,dz)

На практике, как правило, требуется установить некоторые параметры перед передачей, так что полное расширение для отправки факса с помощью Digium’s Fax For Asterisk может выглядеть примерно так:

exten => faxthis,1,Verbose(2,Set options and transmit fax)

; некоторая папка, где будут найдены исходящие факсы

same => n,Set(faxlocation=/tmp)

; В продакшене вы, вероятно, не захотите жестко указывать имя файла

same => n,Set(faxfile=faxfile.tif)

same => n,Set(FAXOPT(headerinfo)=Fax from ShiftEight.org)

same => n,Set(FAXOPT(localstationid=4169671111)

same => n,SendFax(${faxlocation}/${faxfile},z)

Формат файла для отправки факсов

Реальный трюк в отправке факсов — наличие исходного файла в формате, который факс может обработать. На базовом уровне эти файлы известны как файлы TIFF, однако, не все спецификации TIFF совместимы с факсом и не многие из них документированы должным образом. Кроме того, типы форматов TIFF, которые spandsp может обрабатывать отличаются от обрабатываемых Digium FFA.

В отсутствие одной четкой спецификации формата файла TIFF для отправки факсов из Asterisk, мы вместо этого задокументируем то, что мы знаем для работы, и предоставим читателю возможность поэкспериментировать, чтобы найти другие способы создания TIFF2.

Документ Digium «FaxFor Asterisk Administration Manual» описывает процесс преобразования PDF файлов в формат TIFF с использованием общедоступных инструментов командной строки Linux. Несмотря на то, что этот метод не очень полезен, он должен позволять вам создавать cкрипты Linux для обработки преобразования файлов, и ваши пользователи смогут отправлять PDF-файлы в качестве заданий факса.

Вам понадобится интерпретатор PDF ghostscript, который можно установить в RHEL с помощью команды:

$ sudo yum -y install ghostscript

и в Ubuntu коммандой:

$ sudo apt-get install ghostscript

После установки, ghostscript может конвертировать PDF в совместимые с Asterisk TIFF файлы следующей коммандой:

$ gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sPAPERSIZE=letter |

> -sOutputFile=<dest> <src>

Замените <dest> именем исходящего файла и укажите размещение исходного PDF в <src>.

Программа ghostscript создаст файл TIFF из вашего PDF, который будет передан используя SendFax().

Эксперимент с отправкой в электронной почты по факсу

Многие пользователи хотели бы отправлять электронную почту как факсовый документ. Основная проблема — это обеспечение отправки пользователями документов в формате, подходящем для работы с факсами. В конечном итоге это требует разработки определенного приложения, что выходит за рамки этой книги.

Мы сделали простой пример, который можно рассматривать в качестве отправной точки, для передачи электронной почты через факс.

Одним из первых изменений, которые вы должны сделать — это отредактировать файл альясов /etc/aliases, который будет перенаправлять входящие факсы на приложение, которое может с ними справиться. Нам неизвестно о каких-либо приложениях, которые могут это сделать, так что вам придется написать его. Изменения в файле /etc/aliases будут выглядеть примерно так:

fax: «| /путь/к/программе/которая/будет/направлять/входящий/факс/на email«

В нашем случае Russell создал небольшой скрипт на Python с именем fax.py, поэтому наш файл альясов будет содержать:

fax: «| /asteriskpbx/fax.py»

Мы включили копию разработанного скрипта Python для ознакомления в Примере 19-1. Обратите внимание, что этот файл не подходит для продакшена, а лишь служит примером того, как можно отправлять электронную почту по факсу.

Вам нужно будет включить учетные данные для интерфейса Asterisk Manager (AMI) в Главе 20, прежде чем использовать этот скрипт.

Пример 19-1. Шлюз доказательство концепции email-по-факсу, fax.py

#!/usr/bin/env python

«»»Poor Man’s Email to Fax Gateway.

This is a proof of concept email to fax gateway. There are multiple aspects that would have to be improved for it to be used in a production environment.

Copyright (C) 2010 — Russell Bryant, Leif Madsen, Jim Van Meggelen Asterisk: The Definitive Guide

«»»

import sys

import os

import email

import base64

import shutil

import socket

AMI_HOST = «localhost»

AMI_PORT = 5038

AMI_USER = «hello»

AMI_PASS = «world»

# This script will pull a TIFF out of an email and save it off to disk to

# allow the SendFax() application in Asterisk to send it. This is the location

# on disk where the TIFF will be stored.

TIFF_LOCATION = «/tmp/loremipsum.tif»

msg = email.message_from_file(sys.stdin)

# For testing purposes, if you wanted to read an email from a file, you could

# do this, instead.

#try:

# f = open(«email.txt», «r»)

# msg = email.message_from_file(f)

# f.close()

#except IOError:

# print «Failed to open email input file.»

# sys.exit(1)

# This next part pulls out a TIFF file attachment from the email and saves it

# off to disk in a format that can be used by the SendFax() application. This

# part of the script is incredibly non-flexible. It assumes that the TIFF file

# will be in a specific location in the structure of the message (the second

# part of the payload, after the main body). Further, it assumes that the

# encoding of the TIFF attachment is base64. This was the case for the test

# email that we were using that we generated with mutt. Emails sent by users’

# desktop email clients will vary in _many_ ways. To be used with user-

# generated emails, this section would have to be much more flexible.

try:

f2 = open(TIFF_LOCATION, «w»)

f2.write(base64.b64decode(msg.get_payload()[1].get_payload().replace(«\n», «»)))

f2.close()

except IOError:

print «Failed to open file for saving off TIFF attachment.»

sys.exit(1)

# Now that we have a TIFF file to fax, connect to the Asterisk Manager Interface

# to originate a call.

ami_commands = «»»Action: Login\r

Username: %s\r

Secret: %s\r

\r

Action: Originate\r

Channel: Local/s@sendfax/n\r

Context: receivefax\r

Extension: s\r

Priority: 1\r

SetVar: SUBJECT=%s\r

\r

Action: Logoff\r

\r

«»» % (AMI_USER, AMI_PASS, msg[‘subject’])

print ami_commands

def my_send(s, data):

«»»Ensure that we send out the whole data buffer.

«»»

sent = 0

while sent < len(data):

res = s.send(data[sent:])

if res == 0:

break

sent = sent + res

def my_recv(s):

«»»Read input until there is nothing else to read.

«»»

while True:

res = s.recv(4096)

if len(res) == 0:

break

print res

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((AMI_HOST, AMI_PORT))

my_send(s, ami_commands)

my_recv(s)

s.shutdown(socket.SHUT_RDWR)

s.close()

Мы проверили его на элементарном уровне и доказали основную концепцию. Если вы хотите внедрить email-по-факсу в продакшен, то должны понимать, что придется еще поработать прежде чем у вас будет что-то достаточно надежное, чтобы передать это рядовой группе пользователей.

Сквозной факс

В теории должно быть возможно подключить традиционные факсимильные аппараты к FXS порту, а затем передавать входящие факсы на это устройство (см. Рисунок 19-1). Эта концепция привлекательна по нескольким причинам:

  1. Это позволяет вам интегрировать существующую факс-машину в вашу систему Asterisk.
  2. Это требует меньше настроек диалплана.

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

Рисунок 19-1. Сквозной факс

Если вы используете факс на нерегулярной основе (в основном некритические, одностраничные факсы), такая установка может работать хорошо. Если факс имеет решающее значение для вашего бизнеса или вы часто получаете многостраничные факсы, мы неохотно рекомендуем вам подключить факсы непосредственно к PSTN и убрать их из Asterisk.

Использование буфера факса в chan_dahdi.conf

Многие проблемы, связанные со сквозным факсом вызваны несогласованным временем. Поскольку факсы более терпимы к задержкам, чем голосовые вызовы (факс должен быть в состоянии обойти пол мира, что занимает несколько десятков миллисекунд), введение буфера в DAHDI (который будет использован исключительно для факсов), как сообщается, исправляет многие проблемы, которые мешали проходу факса.

В настоящее время предпочтительные настройки следующие:

faxbuffers => 12,half

Это нужно поместить в ваш файл /etc/asterisk/chan_ dahdi.conf приведет к созданию chan_dahdi буфера для вызовов факса в 96 мс3 и задержке начала передачи пока буфер не будет полон наполовину.

Вы также должны установить faxdetect, так как буфер факса является частью функциональности faxdetect:

faxdetect = both

Мы еще тщательно не тестирования эту возможность, но, по некоторым данным, это должно значительно повысить производительность передачи факсов в Asterisk.

Шлюз T.38

Другой формой передачи факсов является поддержка шлюза T. 38, которая была добавлена в Asterisk 10. В этом сценарии Asterisk получает факс от конечной точки с поддержкой T. 38 с одной стороны и традиционной конечной точкой факса с другой. Одним из примеров может быть факсимильный аппарат, подключенный к порту FXS на компьютере Asterisk и перенаправление факсимильных вызовов поставщику SIP, поддерживающему T. 38.

Этот пример сценария довольно прост в реализации. Ключом включается поддержка протокола T.38 Gateway с помощью функции диалплана FAXOPT. В этом примере предположим, что все исходящие факсимильные вызовы с локального факса отправляются в контекст outgoing-fax. Следующий диалплан позволит поддерживать протокол T. 38 Gateway и отправит вызов к поддерживающему T.38 провайдеру SIP :

[outgoing-fax]

exten => _1NXXNXXXXXX,1,NoOp()

same => n,Set(FAXOPT(gateway)=yes)

same => n,Dial(SIP/t38provider)

Кроме этого, вы можете установить тайм-аут на режим шлюза T.38 так, чтобы он выключался, если нет активности факса в пределах указанного тайм-аута. Тайм-аут устанавливается как часть настройки функции FAXOPT:

; Отключить шлюз T. 38, если нет активности факса в течение 10 секунд

same => n,Set(FAXOPT(gateway)=yes,10)

Заключение

Факс — это технология, чьи дни уже позади. Тем не менее, он остается популярным. Asterisk имеет некоторые интересные встроенные технологии, предоставляющие вам некоторый уровень творчества в обработке факсов. Благодаря тщательному планированию и системному проектированию, а также этапу прототипирования и отладки вы можете использовать систему Asterisk для творческой обработки факсов.

190% может оказаться слишком низким значением, но большинство факсов попытается автоматически продолжить передачу при неудачной отправке; это случается гораздо чаще, чем вы можете себе представить, потому что повторное подключение происходит автоматически. На практике это означает, что успех ближе к 99%.

2Мы попробовали один формат, была использована программа Microsoft Office Document Image Writer, которая предложила «монохромный TIFF-факс» в качестве выходного формата. Это казалось слишком хорошо, чтобы быть правдой и надежды не оправдались (ни spandsp ни Digium FFA не смогли обработать полученный файл). Было бы идеально, найти нечто общее для Windows-ПК, что можно использовать пользователям для «печати» Asterisk совместимых TIFF файлов.

396 мс происходит от числа 12 из-за того как работает DAHDI. В DAHDI кусок данных находится во фрагментах по 8 мс, поэтому 12 буферов данных — это 12 буферов * 8 мс = 96 мс буфера.

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.