Пользователь
0,0
рейтинг
1 июля 2013 в 19:16

Разработка → Реализация работы с факсами в asterisk из песочницы tutorial

Появилась необходимость настроить прием и отправку факсов на asterisk. По техническому заданию прием и отправка факсов должны происходить с участием операторов и возможностью предварительного разговора.
В интернете нашел примеры реализации, но в них как правило:
1) была автоматическая отправка факсов на определенный номер без предварительного разговора с оператором;
2) использовались различные связки iaxmodem либо t38modem + hylafax, в которых на мой взгляд особой надобности в данном случае нет. Asterisk умеет работать с факсами через SpanDSP (должен быть собран с поддержкой SpanDSP).

В итоге все свелось к следующему:
1) любой оператор компании должен иметь функционал для приема и отправки факсов со своего рабочего места, пользуясь ПК и телефоном;
2) для приема факса необходимо перевести вызов на номер 5555. Система должна преобразовать полученный документ из tiff в pdf, выложить в общую папку FAX и продублировать на почтовый ящик секретаря.
3) при отправке факса должна быть возможность отправки любого электронного документа или документа на бумажном носителе (через сканер). Оператор вначале должен иметь возможность сообщить, кому и что за документ передает, потом так же, как и при приеме, перевести на определенный номер, соответствующий данному документу.

Asterisk установлен на сборке gentoo.

Чтобы избежать участия пользователя в переводе документа в формат tiff, было решено использовать сетевой виртуальный принтер cups-pdf.

Устанавливаем:

emerge -va cups-pdf


Чтобы выложить принтер и папку для полученных факсов в сеть используем пакет samba

emerge -va samba


У меня он уже установлен net-fs/samba-3.6.12

Также необходим пакет cups и собственно samba должна быть собрана с поддержкой этого пакета. Установим наш виртуальный принтер через веб интерфейс сервиса cups, назовем его fax.

Расшариваем принтер, добавив следующие строчки в /etc/samba/smb.conf

[global]
	printing = cups
	printcap name = /etc/printcap

[fax]
	comment = Факс
	public = yes
	printable = yes
	writable = yes
	create mode = 0666


На операторских компьютерах установлена Windows 7. Сетевой принтер устанавливается, как обычно только запросит драйвер, я выбрал HP LaserJet 2300 Series PS (должен подойти любой PostScript драйвер)

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

Для начала посмотрим настройки этого виртуального принтера nano /etc/cups/cups-pdf.conf
И изменим следующие настройки:

Out /var/spool/cups-pdf		# папка куда сохраняются документы
AnonDirName /var/spool/cups-pdf
Spool /var/spool/cups-pdf

TitlePref 1		# нужно для представлении имени файла
UserUMask 0000	# маска для создаваемых файлов
PostProcessing /opt/pdf_to_tiff	# скрипт запускаемый после создания pdf файла
DecodeHexStrings 1	# нужно для представлении имени файла


Скрипт /opt/pdf_to_tiff считывает текущее значение ext_num (четырехзначный номер факса) прибавляет единичку и переносит pdf файл в папку /usr/dumps под именем ext_num.
Далее преобразует файл в формат tiff и отправляет пользователю, который отправил документ письмо с четырехзначным номером на почту.

Cups-pdf будет запускать /opt/pdf_to_tiff с двумя параметрами:
имя файла — $ARGV[0]
имя пользователя — $ARGV[1]
В организации домен (samba-3.6) и почтовые ящики (корпоративная почта на postfix) соответствуют именам пользователей (кое-где пришлось добавить пару почтовых алиасов).

Сам скрипт:

srv d # cat /opt/pdf_to_tiff 


#!/usr/bin/perl -w
use strict;
use File::Copy;

# Устанавливаем путь по умолчанию
$ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';

# Отладка
my $debug=0;

# Делаем корень текущим каталогом
chdir '/';

my $ext=" ";
my $num=0;

open(ext_num,"/opt/ext_num");
	$ext=<ext_num>;
	$num=int($ext);
close(ext_num);
if ($num > 499) {
	$num=1;
} else {
	$num=$num+1;
}
open(ext_num,">/opt/ext_num");
	print ext_num "$num\n";
close(ext_num);
$num=$num+5000;
move("$ARGV[0]","/usr/dumps/$num.pdf");
system("/usr/bin/gs -dSAFER -dBATCH -dQUIET -sDEVICE=tiffg3 -sPAPERSIZE=a4 -r204x196 -dNOPAUSE -sOutputFile=/usr/dumps/$num.tiff /usr/dumps/$num.pdf");
chmod(0644,"/usr/dumps/$num.tiff");
system("/usr/bin/sendEmail -f asterisk_fax\@name.ru -t $ARGV[1]\@name.ru -u FAX -o message-charset=utf-8 -m Номер для перевода на факс:$num -s localhost");


Проверяем работу, отправив на печать какой либо документ (возможно придется создать и поправить права на доступ к папке /usr/dumps/)

Далее настраиваем Asterisk на прием и отправку факсов:

Главное отключить faxdetect:

/etc/asterisk/sip.conf


[general]
	faxdetect=no
	;faxdetect=yes
	t38pt_udptl=no
	;t38pt_udptl=yes


/etc/asterisk/extensions.conf


[internal]
exten => 5555,1,NoOp(-------------------Call from ${CALLERID(number)} to ${EXTEN}------------------)
 same => n,Goto(fax-rx,receive,1)

exten => _5[0-4]XX,1,NoOp(-------------------Call from ${CALLERID(number)} to ${EXTEN}------------------)
 same => n,Set(FAXFILENAME=${EXTEN})
 same => n,Goto(fax-tx,send,1)

[fax-rx]
exten => receive,1,NoOP(------------------- FAX from ${CALLERID(number)} ------------------)
 same => n,Answer()
 same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID})
 same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)})
 same => n,Set(FAXOPT(localstationid)=Name)
 same => n,Set(FAXOPT(maxrate)=14400)
 same => n,Set(FAXOPT(minrate)=2400)
 same => n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
 same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
 same => n,NoOp(**** RECEIVING FAX : ${DT} ****)
 same => n,ReceiveFax(/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.tif)
 same => n,System(/usr/bin/tiff2pdf "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.tif" -o "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf")
 same => n,System(/bin/cp "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf" /mnt/public/samba/public/FAX )
 same => n,System(/usr/bin/sendEmail -f asterisk_fax@name.ru -t office@name.ru -u FAX -o message-charset=utf-8 -m Смотри вложение -s localhost -a "/var/spool/asterisk/fax/${FAXOPT(headerinfo)}.pdf")
 same => n,HangUp()

[fax-tx]
exten => send,1,NoOp(------------------- FAX from ${CALLERID(number)} ------------------)
 same => n,Wait(1)
 same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID})
 same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)})
 same => n,Set(FAXOPT(localstationid)=Name)
 same => n,Set(FAXOPT(maxrate)=14400)
 same => n,Set(FAXOPT(minrate)=2400)
 same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
 same => n,NoOp(**** RECEIVING FAX : ${DT} ****)
 same => n,SendFAX(/usr/dumps/${FAXFILENAME}.tiff,d)
 same => n,NoOp(${FAXSTATUS})
 same => n,NoOp(number is ${CALLERID(number)})
 same => n,System(/usr/bin/sendEmail -f asterisk_fax@name.ru -t office@name.ru -u 'Fax message Sent' -o message-charset=utf-8 -m 'Номер:${CALLERID(number)}\nStatus:${FAXSTATUS}' -s localhost -l /var/log/fax.log)
 same => n,HangUp()


Вот и все. В итоге не нужен дополнительный софт и проще обучить операторов работе с факсами.
@dm85
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (11)

  • 0
    Спасибо за пример. Попробуем прикрутить на FreePBX сегодня
    • 0
      Пробуйте. У меня это работает на Asterisk 11.2.2. Если будут вопросы пишите.
  • 0
    Полезная статья спасибо, сэкономили кучу времени.
  • 0
    А не проще было через веб-интерфейс подобное реализовать? Всё на одной страничке можно показать. Убирается лишнее действие — переключение из печати на почту.
  • 0
    Через веб-интерфейс не получится отправлять факсом любые электронные документы, как это делается через виртуальный принтер. А далеко не каждый пользователь в состоянии преобразовывать документы в нужный вид.
    • 0
      можно использовать unoconf. Большую часть можно сконвертировать через него. Правда, тут может поехать разметка.
      • 0
        Вы сами и подметили минусы. А вообще мнения у всех различные. Данный вариант предназначен для конечных пользователей. За все время ни одной жалобы на неправильное срабатывание, сложность или не удобность не было.
  • 0
    Ваша реализация одна из самых практичных и самодостаточных. )

    Хотел бы внедрить ее у себя.

    Но вот вопрос: Что вы можете посоветовать для реализации такой схемы в том случае, когда asterisk-сервер и все IP-телефоны находятся в одном влане, а компы предприятия на базе Windows в домене AD в другом? Естественно помимо варианта прокидывания на астериск влана с компами.
    • 0
      Как вариант выделите один из ПК чисто под факсы добавив его в телефонный vlan
  • 0
    Что мешает на сервере с asterisk добавить vlan компьютерной сети, а сам asterisk в конфе заставить работать на интерфейсе телефонного vlan.
    По сути для генерации картинки доступ с ПК к самим сервисам asteriska не нужен, достаточно передать файл туда, откуда asterisk сможет считать и сообщить пользователю номер факса. Получается, что если прикинуть варианты реализации найти можно.
  • 0
    А как отключить запись звонка через exten => _X.,1,Mixmonitor(...) чтобы не записывались пиликания факсов?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.