В этой заметке я описываю технологии, о практической полезности которых мне точно известно и которые были опробованы мною (всё касаемо SIP), а также найденная мной информация, которая пока не была опробована на практике (всё касаемо Zap).
Основная часть функциональности, требуемой для приёма и передачи факса в Asterisk требует, во-первых библиотеки spandsp, и во-вторых – отдельных приложений Asterisk, его использующих. Они собственно и содержат команды 'rxFax' и 'txFax'.
Кроме того в коде Asterisk уже есть код, достаточный для автоматического определения сигналов вызывающего факса. К сожалению этот код на настоящий момент вызывается только из chan_zap, посему автоопределение факса работает только с физическими линиями (платы от Digium, а также, например, плата Sangoma
E1).
Сразу после выполнения команды Answer на ZAP-интерфейсах начинает выполняться код, автоматически определяющий тоновый сигнал вызывающего факса. При обнаружении выполнение передаётся на extension 'fax', если он существует.
В остальном приём факсов через Zap-каналы ничем не отличается от приёма через SIP (за исключением того, что по E1, разумеется, качество будет выше). И проблем с настройкой и выбором кодеков нет :)
В настоящий момент для приёма факсов в Asterisk через SIP существует только один способ: в аппаратном шлюзе при прохождении факса должны быть полностью отключены VAD и подавление эха, и должен быть установлен кодек G.711.
К сожалению протокол T.38 до сих пор не поддерживается.
spandsp это специализированная библиотека, содержащая весь необходимый код для приёма и передачи факсов. В некотором роде программный эмулятор факса.
Эта библиотека необходима для сборки app_rxfax и app_txfax.
После сборки и установки app_rxfax и app_txfax в Asterisk добавляется две новых команды — rxFax и txFax. Обе принимают один единственный параметр — название файла.
Я рекомендую делать это название уникальным (используя соответствующие переменные Asterisk), чтобы не иметь проблем при одновременном приёме нескольких факсов.
Принятый tiff-файл будет иметь разную плотность по вертикали и по горизонтали, поэтому большинство обычных просмотрщиков покажут его сжатым по вертикали.
Можно либо воспользоваться специализироваными программами для просмотра факсов, либо просто сконвертировать принятый tiff в pdf или Post Script?, с помощью
утилит из libtiff-utils.
При просмотре факсов в Gimp необходимо отключить в меню 'View' параметр 'Dot for dot'.
tiffinfo — покажет всю информацию из заголовка документа
tiff2ps — сконвертирует в Post Script?. Я рекомендую использовать её как минимум с параметром '-2', иначе получившийся Post Script? будет неприлично большим, а также '-a', для обработки многостраничных факсов.
tiff2pdf — конвертирование в PDF-формат. Наиболее удобный для пользователя формат просмотра факсов. Я предпочитаю использовать с ключами '-p a4 -z'.
Если факс не прошёл, то создаётся tiff-файл длиной 8 байт. Естественно если он обрабатывается каким-либо скриптом, разумнее всего не пытаться этот файл конвертировать и отсылать получателю.
В моём скрипте я не отсылаю даже уведомления о плохо прошедших факсах.
При желании можно обрабатывать этот случай отдельно, и посылать уведомление вида «факс с номера <...> пытались отправить, но он не прошёл».
Nickolay Kondrashov <knu coбaka avtomatikarus.com> за активную помощь в написании этой статьи