Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
astpanel:ats:asterisk:faxsend_v6 [2013/11/26 09:46] apor создано |
astpanel:ats:asterisk:faxsend_v6 [2018/06/08 09:19] (текущий) apor |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== 10000333. Настройка Asterisk для отправки факсов ====== | ====== 10000333. Настройка Asterisk для отправки факсов ====== | ||
+ | <note important>**В этой статье описан алгоритм работы**. Пример реализации описан в [[http://wiki.miko.ru/astpanel:dialplan_miko_ajam | статье]] </note> | ||
+ | |||
+ | [[astpanel:ats:asterisk_v6|Обратно к основной инструкции...]] | ||
+ | |||
+ | Для отправки факсов, на АТС должны присутствовать модули, позволяющие это сделать. Пример с использованием **spandsp**: | ||
+ | <code>CLI> module show like fax | ||
+ | Module Description Use Count | ||
+ | res_fax.so Generic FAX Applications 1 | ||
+ | res_fax_spandsp.so Spandsp G.711 and T.38 FAX Technologies 0 | ||
+ | 2 modules loaded</code> | ||
+ | |||
+ | ===== Описание ===== | ||
+ | В плане набора должен быть описан контекст **miko_ajam**.\\ | ||
+ | В контексте miko_ajam определяется extension с номером **10000333**.\\ | ||
+ | <code>[miko_ajam] | ||
+ | exten => 10000333,1,NoOP(Send fax Asterisk app)</code> | ||
+ | |||
+ | При необходимости, **“Панель телефонии Asterisk”** выполняет AMI команду [[:kb:asterisk:ami:originate|originate]].\\ | ||
+ | **Параметры originate**\\ | ||
+ | * channel - Local/10000333@miko_ajam | ||
+ | * Application - NoCDR | ||
+ | **Переменные канала** \\ | ||
+ | * chan - канал пользователя в формате "Технология/Номер", который инициировал originate | ||
+ | * faxfile - имя файла факса для отправки | ||
+ | * faxcallerid - Номер телефона, на который отправляется факс | ||
+ | |||
+ | ===== Пример dialplan ===== | ||
+ | <code>[miko_ajam] | ||
+ | exten => 10000333,1,NoCDR() | ||
+ | exten => 10000333,n,Noop(internal calling application: 10000333 1C_SendFax) | ||
+ | ; получим параметры, переданные из 1С | ||
+ | exten => 10000333,n,Set(_chan=${chan}) | ||
+ | exten => 10000333,n,Set(_faxcallerid=${faxcallerid}) | ||
+ | exten => 10000333,n,Set(_faxfile=${faxfile}) | ||
+ | ; звонок в контекст отправки факса | ||
+ | exten => 10000333,n,Dial(LOCAL/${CALLERID(num)}@miko_ajam_fax_tx,,g) | ||
+ | exten => 10000333,n,Hangup | ||
+ | |||
+ | [miko_ajam_fax_tx] | ||
+ | exten => _X!,1,WaitForSilence(500,1,15)) | ||
+ | exten => _X!,n,Answer | ||
+ | ; ${ASTSPOOLDIR} - параметр из /etc/asterisk/asterisk.conf | ||
+ | exten => _X!,n,SendFAX(${ASTSPOOLDIR}/fax/${faxfile}.tif) | ||
+ | ; в userfield сохраним информацию о вызванном приложении | ||
+ | exten => _X!,n,Set(CDR(userfield)=SendFAX) | ||
+ | exten => _X!,n,Hangup | ||
+ | |||
+ | exten => h,1,GotoIf($["${FAXSTATUS}" = "SUCCESS"]?h,success:h,failed) | ||
+ | ; сообщим 1С о неудаче | ||
+ | exten => h,n(failed),UserEvent(SendFaxStatusFail,chan1c: ${chan},CallerID: ${faxcallerid}) | ||
+ | exten => h,n,Hangup | ||
+ | ; сообщим 1С об успешности операции | ||
+ | exten => h,n(success),UserEvent(SendFaxStatusOk,chan1c: ${chan},CallerID: ${faxcallerid}) | ||
+ | ; сохраним имя файла в поле recordingfile | ||
+ | exten => h,n,Set(CDR(recordingfile)=${faxfile}.tif) | ||
+ | exten => h,n,Hangup | ||
+ | </code> | ||
+ | |||
+ | В текущем примере файл должен находиться в директории **${ASTSPOOLDIR}/fax/${faxfile}.tif**. \\ | ||
+ | Перед вызовом приложения **10000333** 1C отправляет файл на АТС средствами [[http://wiki.miko.ru/doc:1cajam:astcastomize_v6#nastrojka_papki_uploads|res_http_post]] или используя ресурс для **upload**. | ||
+ | |||
+ | В качестве ресурса для загрузки файла может служить php скрипт: | ||
+ | |||
+ | <code 1C> | ||
+ | <?php | ||
+ | $ASTSPOOLDIR = '/var/spool/asterisk'; | ||
+ | $tmpdir = $ASTSPOOLDIR.'fax/'; | ||
+ | $faxdir = $ASTSPOOLDIR."fax/"; | ||
+ | |||
+ | if(!is_dir($faxdir)) mkdir($faxdir); | ||
+ | |||
+ | if (is_uploaded_file($_FILES['file']['tmp_name'])) { | ||
+ | $filename = str_replace(" ","_",$_FILES['file']['name']); | ||
+ | |||
+ | $name = basename($filename); | ||
+ | $filetype = strtolower(substr(strrchr($name,"."),1) ); | ||
+ | |||
+ | if ($filetype=="pdf") { | ||
+ | $tif_filename = $tmpdir.basename($name,'.pdf').'.tif'; | ||
+ | // move file to asterisk music-on-hold directory on media storage | ||
+ | $pdf_filename = $faxdir.$name; | ||
+ | |||
+ | if(move_uploaded_file($_FILES['file']['tmp_name'], $pdf_filename)){ | ||
+ | set_time_limit(900); | ||
+ | $gs_path = exec('which gs'); | ||
+ | $res_str = exec($gs_path.' -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sPAPERSIZE=a4 -g1680x2285 -sOutputFile=\''.escapeshellarg($tif_filename).'\' \''.escapeshellarg($pdf_filename).'\' > /dev/null 2>&1'); | ||
+ | }else{ | ||
+ | echo "Fail copy file!"; | ||
+ | } | ||
+ | |||
+ | if(is_file($tif_filename)){ | ||
+ | echo "<pre>File $name upload success.</pre>"; | ||
+ | }else{ | ||
+ | echo "<pre>File $name upload fail.</pre>"; | ||
+ | } | ||
+ | }elseif($filetype=="tif"){ | ||
+ | $tif_filename = ''.$faxdir.$name; | ||
+ | if (move_uploaded_file($_FILES['file']['tmp_name'], $tif_filename)){ | ||
+ | echo "<pre>File $name upload success.</pre>"; | ||
+ | }else{ | ||
+ | echo ("<pre>File $name fail. $tif_filename</pre>"); | ||
+ | } | ||
+ | }else{ | ||
+ | echo '<pre>Upload failed. Only PDF format!</pre>'; | ||
+ | } | ||
+ | }else{ | ||
+ | echo '<pre>Upload failed. File not found!</pre>'; | ||
+ | } | ||
+ | ?> | ||
+ | </code> | ||
+ | |||
+ | <note important>Для конвертации PDF to TIFF используется приложение Ghostscript</note> | ||
+ | <note important>Если для загрузки файла используется php или прочий скрипт, путь к нему следует указать в приложении **10000111**, в пврвметре **${FaxSendUrl}**.</note> | ||
+ | ==== Проверка работы скрипта ==== | ||
+ | Допустим скрипт опубликован как ресурс "**/admin/1c/upload/index.php**" | ||
+ | |||
+ | <code>shell>curl -F 'file=@fax.tif' 'http://<IP_PBX>/admin/1c/upload/index.php' | ||
+ | shell>curl -F "file=@fax.pdf" 'http://<IP_PBX>/admin/1c/upload/index.php'</code> | ||
+ | |||
+ | ==== Проверка отправки факса ==== | ||
+ | |||
+ | <code>#!/bin/sh | ||
+ | # скрипт должен лежать в каталоге | ||
+ | dir_script='/tmp/send_fax'; | ||
+ | astspooldir='/var/spool/asterisk'; | ||
+ | # файл должен лежать в каталоге $dir_script | ||
+ | file_fax_name='send_fax_img'; | ||
+ | ext_file='.tif'; | ||
+ | |||
+ | # | ||
+ | call_text="Channel: Local/20190@from-internal | ||
+ | Context: miko_ajam | ||
+ | Extension: 10000333 | ||
+ | MaxRetries: 2 | ||
+ | RetryTime: 600 | ||
+ | WaitTime: 25 | ||
+ | Callerid: Alexey<104> | ||
+ | Set: faxfile=$file_fax_name"; | ||
+ | |||
+ | echo "$call_text" > /tmp/file.call; | ||
+ | cp "$dir_script/$file_fax_name$ext_file" "$astspooldir/fax/$file_fax_name$ext_file" | ||
+ | mv '/tmp/file.call' '$astspooldir/outgoing/'; | ||
+ | |||
+ | asterisk -rvvv;</code> | ||
+ | |||
+ | Каналом:\\ | ||
+ | * Local/20190@from-internal | ||
+ | определяется АТС - приемник факса, вряд ли выйдет отправить факс на свою же АТС. | ||
+ | |||
[[astpanel:ats:asterisk_v6|Обратно к основной инструкции...]] | [[astpanel:ats:asterisk_v6|Обратно к основной инструкции...]] |