アスタリスクを使用した自動FAXサービス

大量のファックスを送信する必要がある特定のWebサービスがあります。

これに特化したサードパーティのサービスを使用できます。

しかし、多くのファックスがある場合、これは病弱なペニーに変換されます。 したがって、独自のサービスを作成します。

当社のサービスを使用して、音声トラフィックに対して時間通りに支払います。

サービスは、FAXを送信するリクエストを受信し、結果について報告します。



アスタリスクを使用します。おそらく最も生産的ではなく、よく知られています。

この構成では、Elastixの既製のアセンブリを使用します。 KlistrodClash of the Titans FreeSwitch vs.Asterisk-Performance Test )によると、より安定して動作します。

また、Apacheとphpの可用性もプラスです。 パッケージを配達する必要はありません。



アスタリスクには、G.711経由の音声とT.38の使用という、FAXを送信する方法がいくつかあります。

2番目のオプションが望ましい 配信の確率が高くなります。



FAXの送信には2つの実装もあります。

1. Spandsp OpenSourceプロジェクト

2. アスタリスク用Digium Fax

アスタリスクの作成者による商用実装は、1つの競合ライセンスが無料です。

インストールの詳細( docs.digium.com/FAX/fax_for_asterisk_admin_manual.pdf

SpandspはすでにElastixに含まれています。



論理的には、システムは3つの部分に分割できます。

1.リクエストの受信

2.ファックス回転

3.ファックスと結果に関するレポートを送信します。



送信リクエストの受信。


.callファイルをアスタリスク実行フォルダーに移動すると、FAXの送信が開始されます。

呼び出しファイルには、Asteriskが送信する必要があるすべてのパラメーターが含まれています。



faxsend.call

Callerid:"FaxSender"<1111> Maxretries:maxRetries Waittime:300 Context:faxsend-t38 Extension:faxout RetryTime:50 Priority:1 SetVar: T38CALL=1 Set:RETURNURL={returnUrl} Set:TAGLINE=Fax from CompanyName Set:RECEIVER=Number Of Receiver Set:FAX_ID={faxId} Set:TIFF_2_SEND={faxId}.tif';
      
      







パラメーターと送信するファイルを受け取るスクリプトを作成します。 PDFで送信するファイルを受け取ります。

注意すべきパラメーターは次のとおりです。

maxRetries-ダイヤル試行回数。

faxid-ステータスが返されるファックス識別子。

returnUrl-送信結果が返されるアドレス。



index.php

 <?php define( "STATUS_SUCCESS", "success" ); define( "STATUS_ERROR", "fail" ); $pdfLocation = "//var//tmp//faxes//"; function sendStatus( $statusKind ) { header('Content-type: application/json'); exit( "{\"status\": \"" . $statusKind . "\"}" ); } $fax = $_REQUEST['fax']; $faxId = $_REQUEST['faxId']; $maxRetries = isset( $_REQUEST['maxRetries'] ) ? $_REQUEST['maxRetries'] : 0; $returnUrl = $_REQUEST['returnUrl']; $pdf = $faxId . '.pdf'; if ($fax == '' || $returnUrl == '' || $faxId == '' ) { sendStatus( STATUS_ERROR ); } if(!move_uploaded_file($_FILES['file']['tmp_name'], $pdfLocation . $pdf)) { sendStatus( STATUS_ERROR ); } $callFileBody = 'Channel:SIP/trunkname/{fax} Callerid:"FaxSender"<1111> Maxretries:{maxRetries} Waittime:300 Context:faxsend-t38 Extension:faxout RetryTime:50 Priority:1 SetVar: T38CALL=1 Set:RETURNURL={returnUrl} Set:TAGLINE=Fax from Company Set:RECEIVER={fax} Set:FAX_ID={faxId} Set:TIFF_2_SEND={faxId}.tif'; $callFileBody = str_replace("{fax}", $fax, $callFileBody); $callFileBody = str_replace("{faxId}", $faxId, $callFileBody); $callFileBody = str_replace("{maxRetries}", $maxRetries, $callFileBody); $callFileBody = str_replace("{returnUrl}", $returnUrl, $callFileBody); $callFilename = $faxId . ".call"; file_put_contents($pdfLocation . $callFilename, $callFileBody); if (!file_exists($pdfLocation . $callFilename)) { sendStatus( STATUS_ERROR ); } sendStatus( STATUS_SUCCESS ); ?>
      
      







したがって、指定されたpdfLocationフォルダーには、.callと.pdfの2つのファイルが表示されます。

このスクリプトは、/ var / www / htmlのサブフォルダーに配置できます。

faxserviceフォルダーを作成しました。

したがって、当社のサービスはhttp:// serveradress / faxserviceで利用できます。

デフォルトでは、Elastixはすべてのhttpリクエストをhttpsにリダイレクトします。 証明書を気にしないために、このリダイレクトをオフにしました。



/etc/httpd/conf.d/elastix.conf

 # Apache-level configuration for Elastix administration interface Timeout 300 # Default apache configuration specifies greater limits than these #MaxClients 150 #MaxRequestsPerChild 1000 # Default apache User and Group diretives MUST be commented out # in order for these to take effect. User asterisk Group asterisk <Directory "/var/www/html"> # Redirect administration interface to https #RewriteEngine off #RewriteCond %{HTTPS} off #RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </Directory>
      
      







リライトをコメントアウトしました。



ファックス回転


新しいタスクの出現についてこのフォルダーを監視し、タスクの出現後、アスタリスクに送信するためにキューに転送する必要があります。 また、pdfをtifに変換する必要があります

この機能は、bashスクリプトを使用して実装します。



ファックス

 #!/bin/bash SOURCEDIR="/var/tmp/faxes/" for file in `ls $SOURCEDIR*.pdf `; do callfile="${file/pdf/call}" if [ ! -e "$callfile" ] then continue fi `gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sPAPERSIZE=letter -sOutputFile=${file/pdf/tif} $file` mv ${file/pdf/call} /var/spool/asterisk/outgoing rm $file done
      
      





アスタリスクに代わって、このスクリプトの実行を毎分中断します。



「完成した」tifファイルを毎晩削除し、2日間保存します(試行回数が多く、ファイル間の間隔がさらに大きい場合)。



 /usr/bin/find /var/tmp/faxes -name "*tif" -mtime +2 –delete
      
      







アスタリスクによるファックスの送信




T.38を介してFAXを送信し、その結果について報告することをアスタリスクに教えることのみが今のままです。

まず、T.38で動作するようにElastixを「教える」必要があります



これを行うには、sip_general_custom.confに以下を追加します。

 t38pt_udptl=yes
      
      







トランク設定のおおよそのビュー:



 [trunkname] username=username type=friend transport=udp secret=password qualify=yes nat=yes insecure=port,invite host=voip.host.com disalow=all directmedia=yes context=from-pstn canreinvite=yes allow=ulaw&alaw
      
      







次に、呼び出しファイルから呼び出されるコンテキストを作成する必要があります

に追加する



extensions_custom.conf

 [faxsend-t38] exten => faxout,1,Set(STARTTIME=${SHELL(date +%s)} ) exten => faxout,n,Wait(1) exten => faxout,n,Playback(fax24,skip) exten => faxout,n,Wait(1) exten => faxout,n,NoOp(**** SENDING FAX ****) ; Set FAXOPTs exten => faxout,n,NoOp(**** SETTING FAXOPT ****) exten => faxout,n,Set(FAXFILE=${TIFF_2_SEND}) exten => faxout,n,Set(FAXOPT(ecm)=yes) exten => faxout,n,Set(FAXOPT(headerinfo)=${TAGLINE}) exten => faxout,n,Set(FAXOPT(maxrate)=14400) exten => faxout,n,Set(FAXOPT(minrate)=4800) ; Send the fax exten => faxout,n,NoOp(**** SENDING FAX : ${FAXFILE} ****) exten => faxout,n,SendFAX(/var/tmp/faxes/${FAXFILE},dfzs) ;Calculating Time of Sending exten => faxout,n,Set(ENDTIME=${SHELL(date +%s)} ) exten => faxout,n,Set(TRANSFERTIME=${MATH(${ENDTIME}-${STARTTIME},int)}) ;Actions after sending fax exten => faxout,n,Set(NORMURL=${FAXOPT(error)}) exten => faxout,n,Set(STATUSMESSAGE=${REPLACE(NORMURL, ,+)}) exten => faxout,n,Set(FAXOPTRATE=${FAXOPT(rate)}) exten => faxout,n,Hangup ;Actions if no answer or busy exten => failed,1,Set(FAXSTATUS=FAILED) exten => failed,2,Set(STATUSMESSAGE=number+no+answer+or+busy) exten => failed,3,Set(FAXOPTRATE=none) exten => h,1,NoOP(------------------- FAX to ${EXTEN} with ${FAXSTATUS} -----------------) exten => h,2,Set(CURLRESULT=${CURL(${RETURNURL}?fax=${RECEIVER}&faxId=${FAX_ID}&status=${FAXSTATUS}&message=${STATUSMESSAGE})}) exten => h,4,Set(LOGFAXOUT=${SHELL(echo "${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)} : ${FAX_ID} : ${RECEIVER} : ${FAXSTATUS} : ${STATUSMESSAGE} : ${TRANSFERTIME}s : ${FAXOPTRATE}" >> /var/log/asterisk/faxout.log)}) exten => h,3,NoOp(${RECEIVER}:${FAX_ID}:${FAXSTATUS}:${STATUSMESSAGE}:${FAXOPTRATE})
      
      







このコンテキストは、FAXを呼び出して送信しようとしますが、ダイヤルされない場合は、番号+いいえ+応答+または+ビジーを返します。

ダイヤルに成功し、送信を試みると、ステータスメッセージとステータスメッセージの復号化を返します。

彼は、この情報をphpスクリプトからアドレスRETURNURLに返します。

また、いくつかの物議を醸す問題についてさらに説明するためのログファイルを作成します。

音声グリーティングを機能させるには、PCMエンコード、16ビット、8000Hz形式のファイルを作成し、/ var / lib /アスタリスク/サウンドに配置する必要があります。



All Articles