Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
realizacija_raboty_s_faksami [2013/11/19 16:30]
ansealk
realizacija_raboty_s_faksami [2013/11/19 16:32] (текущий)
Строка 1: Строка 1:
 +====== Реализация работы с факсами ======
  
 +Появилась необходимость настроить прием и отправку факсов на asterisk. По техническому заданию прием и отправка факсов должны происходить с участием операторов и возможностью предварительного разговора.
 +В интернете нашел примеры реализации,​ но в них как правило: ​
 +  - была автоматическая отправка факсов на определенный номер без предварительного разговора с оператором;​
 +  - использовались различные связки iaxmodem либо t38modem + hylafax, в которых на мой взгляд особой надобности в данном случае нет. Asterisk умеет работать с факсами через SpanDSP (должен быть собран с поддержкой SpanDSP).
 +
 +В итоге все свелось к следующему:​
 +  - любой оператор компании должен иметь функционал для приема и отправки факсов со своего рабочего места, пользуясь ПК и телефоном;​
 +  - для приема факса необходимо перевести вызов на номер 5555. Система должна преобразовать полученный документ из tiff в pdf, выложить в общую папку FAX и продублировать на почтовый ящик секретаря.
 +  - при отправке факса должна быть возможность отправки любого электронного документа или документа на бумажном носителе (через сканер). Оператор вначале должен иметь возможность сообщить,​ кому и что за документ передает,​ потом так же, как и при приеме,​ перевести на определенный номер, соответствующий данному документу.
 +
 +Asterisk установлен на сборке gentoo.
 +
 +Чтобы избежать участия пользователя в переводе документа в формат tiff, было решено использовать сетевой виртуальный принтер cups-pdf.
 +
 +Устанавливаем:​
 +<code bash>
 +emerge -va cups-pdf
 +</​code>​
 +
 +Чтобы выложить принтер и папку для полученных факсов в сеть используем пакет samba
 +<code bash>
 +emerge -va samba
 +</​code>​
 +У меня он уже установлен net-fs/​samba-3.6.12 Также необходим пакет cups и собственно samba должна быть собрана с поддержкой этого пакета. Установим наш виртуальный принтер через веб интерфейс сервиса cups, назовем его fax. 
 +
 +Расшариваем принтер,​ добавив следующие строчки в /​etc/​samba/​smb.conf
 +<code conf>
 +[global]
 +    printing = cups
 +    printcap name = /​etc/​printcap
 +
 +[fax]
 +    comment = Факс
 +    public = yes
 +    printable = yes
 +    writable = yes
 +    create mode = 0666
 +</​code>​
 +
 +На операторских компьютерах установлена Windows 7. Сетевой принтер устанавливается,​ как обычно только запросит драйвер,​ я выбрал HP LaserJet 2300 Series PS (должен подойти любой PostScript драйвер). При печати на данный принтер сам документ должен попадать на принтер в пригодном формате,​ а пользователь должен получить четырехзначный номер при переводе,​ на который произойдет передача этого документа. ​
 +
 +Для начала посмотрим настройки этого виртуального принтера ​
 +<file conf /​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 # нужно для представлении имени файла
 +</​file>​
 +
 +Скрипт /​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) соответствуют именам пользователей (кое-где пришлось добавить пару почтовых алиасов).
 +
 +Сам скрипт:​
 +
 +<file perl /​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"​);​
 +</​file>​
 +
 +Проверяем работу,​ отправив на печать какой либо документ (возможно придется создать и поправить права на доступ к папке /​usr/​dumps/​)
 +
 +Далее настраиваем Asterisk на прием и отправку факсов.
 +
 +Главное отключить faxdetect:
 +<file ini /​etc/​asterisk/​sip.conf>​
 +[general]
 +    faxdetect=no
 +    ;​faxdetect=yes
 +    t38pt_udptl=no
 +    ;​t38pt_udptl=yes
 +
 +</​file>​
 +<file ini /​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()
 +</​file>​
 +
 +Вот и все. В итоге не нужен дополнительный софт и проще обучить операторов работе с факсами.
realizacija_raboty_s_faksami.txt · Последние изменения: 2013/11/19 16:32 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика