Инструменты пользователя

Инструменты сайта


astpanel:ats:asterisk:faxsend_v6

10000333. Настройка Asterisk для отправки факсов

В этой статье описан алгоритм работы. Пример реализации описан в статье

Обратно к основной инструкции...

Для отправки факсов, на АТС должны присутствовать модули, позволяющие это сделать. Пример с использованием spandsp:

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

Описание

В плане набора должен быть описан контекст miko_ajam.
В контексте miko_ajam определяется extension с номером 10000333.

[miko_ajam]
exten => 10000333,1,NoOP(Send fax Asterisk app)

При необходимости, “Панель телефонии Asterisk” выполняет AMI команду originate.
Параметры originate

  • channel - Local/10000333@miko_ajam
  • Application - NoCDR

Переменные канала

  • chan - канал пользователя в формате «Технология/Номер», который инициировал originate
  • faxfile - имя файла факса для отправки
  • faxcallerid - Номер телефона, на который отправляется факс

Пример dialplan

[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

В текущем примере файл должен находиться в директории ${ASTSPOOLDIR}/fax/${faxfile}.tif.
Перед вызовом приложения 10000333 1C отправляет файл на АТС средствами res_http_post или используя ресурс для upload.

В качестве ресурса для загрузки файла может служить php скрипт:

<?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>';
}
?>

Для конвертации PDF to TIFF используется приложение Ghostscript

Если для загрузки файла используется php или прочий скрипт, путь к нему следует указать в приложении 10000111, в пврвметре ${FaxSendUrl}.

Проверка работы скрипта

Допустим скрипт опубликован как ресурс «/admin/1c/upload/index.php»

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'

Проверка отправки факса

#!/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;

Каналом:

  • Local/20190@from-internal

определяется АТС - приемник факса, вряд ли выйдет отправить факс на свою же АТС.

Обратно к основной инструкции...

astpanel/ats/asterisk/faxsend_v6.txt · Последние изменения: 2018/06/08 09:19 — apor