Внимание!
Эта wiki об устаревших версиях
Документация к актуальной версии интеграции 1С и телефонии доступна по ссылке

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

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


astpanel:ats:asterisk:download_file_v6

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
astpanel:ats:asterisk:download_file_v6 [2013/11/26 08:54]
apor [Действие]
astpanel:ats:asterisk:download_file_v6 [2018/06/08 09:17] (текущий)
apor [Действие]
Строка 3: Строка 3:
  
 ===== Описание ===== ===== Описание =====
 +<note important>​**В этой статье описан алгоритм работы**. Пример реализации описан в [[http://​wiki.miko.ru/​astpanel:​dialplan_miko_ajam | статье]] </​note> ​
 +
 В плане набора должен быть описан контекст **miko_ajam**.\\ В плане набора должен быть описан контекст **miko_ajam**.\\
 В контексте miko_ajam определяется extension с номером **10000666**.\\ В контексте miko_ajam определяется extension с номером **10000666**.\\
Строка 8: Строка 10:
 exten => 10000666,​1,​NoOP(dounload file from Asterisk)</​code>​ exten => 10000666,​1,​NoOP(dounload file from Asterisk)</​code>​
  
-При начале работы**“Панель телефонии Asterisk”** выполняет AMI команду [[:​kb:​asterisk:​ami:​originate|originate]].\\+При начале работы **“Панель телефонии Asterisk”** выполняет AMI команду [[:​kb:​asterisk:​ami:​originate|originate]].\\
 **Параметры originate**\\ **Параметры originate**\\
   * channel ​    ​- Local/​10000666@miko_ajam   * channel ​    ​- Local/​10000666@miko_ajam
Строка 19: Строка 21:
 ===== Действие ===== ===== Действие =====
 Приложение должно выполнить команду плана набора **UserEvent** и передать информацию по файлу:​\\ Приложение должно выполнить команду плана набора **UserEvent** и передать информацию по файлу:​\\
-**Если файл найден:​\\**+**Если файл найден:​**
 <​code>;​ для типа Records <​code>;​ для типа Records
-exten => 10000666,​n,​UserEvent(StartDownloadRecord,​Channel: ${chan},​FileName: ​80/1c/rec/​${recfile}) ​+exten => 10000666,​n,​UserEvent(StartDownloadRecord,​chan1c: ${chan},​FileName: ​${port}/${path}/​${recfile}) ​
 ; для типа FAX ; для типа FAX
-exten => 10000666,​n,​UserEvent(StartDownloadFax,​Channel: ${chan},​FileName:​ 80/1c/rec/​${recfile})</​code>​+exten => 10000666,​n,​UserEvent(StartDownloadFax,​chan1c: ${chan},​FileName: ​${port}/​${path}/​${recfile})</​code>​ 
 + 
 +**Если файл не найден:​** 
 +<​code>;​ для типа Records 
 +exten => 10000666,​n,​UserEvent(FailDownloadRecord,​chan1c:​ ${chan})  
 +; для типа FAX 
 +exten => 10000666,​n,​UserEvent(FailDownloadFax,​chan1c:​ ${chan})</​code>​ 
 + 
 +==== FileName ==== 
 +Параметр состоит их нескольких частей:​ 
 +  * ${port} - порт, к примеру ​80 
 +  * ${path} - путь к ресурсу для скачивания файла 
 +  * ${recfile} - Имя файла 
 + 
 +При получении оповещения,​ 1С откроет интернет обозвреватель по адресу:​\\ 
 +<​code>​http:​//${IP_PBX}:​${port}/​${path}/${recfile}</​code>​ 
 + 
 +После выполнения **UserEvent** приложение должно ответить на звонок и отбить его.\\ 
 +<​code>​exten => 10000111,​n,​Answer() 
 +exten => 10000111,​n,​Hangup()</​code>​ 
 + 
 +**Скрипт для скачивания файла** 
 + 
 +В качестве ресурса для скачивания файла можно использовать php скрипт:​ 
 +<code 1c><?​php  
 +$ASTSPOOLDIR = "/​var/​spool/​asterisk/";​ 
 +$tmpdir = '/​tmp/';​ 
 +$faxdir = $ASTSPOOLDIR."​fax/";​ 
 +$recdir = $ASTSPOOLDIR."​monitor/";​ 
 +if ($_GET['​view'​]) { 
 + if ($_GET['​type'​]=="​FAX"​)  
 +
 + $filename = $faxdir.basename($_GET['​view'​]);​ 
 + $fp=fopen($filename,​ "​rb"​);​ 
 +     if ($fp) { 
 +     header("​Pragma:​ public"​);​ 
 +     header("​Expires:​ 0"); 
 +     header("​Cache-Control:​ must-revalidate,​ post-check=0,​ pre-check=0"​);​ 
 +     header("​Cache-Control:​ public"​);​ 
 + header("​Content-Type:​ application/​octet-stream"​);​  
 + header("​Content-Disposition:​ attachment; filename="​.basename($_GET['​view'​]));​ 
 +     ob_clean();​ 
 +     fpassthru($fp);​ 
 + }else{ 
 + echo '<​b>​404 File lib not found!</​b>';​ 
 +
 + 
 + }elseif ($_GET['​type'​]=="​Records"​ && file_exists($recdir.$_GET['​view'​]) ){ 
 + $wavfile = $recdir.$_GET['​view'​];​ 
 +  
 + $size ​     = filesize($wavfile);​ 
 + $name ​     = basename($_GET['​view'​]);​ 
 +     $extension = strtolower(substr(strrchr($name,"​."​),​1));​ 
 +      
 +     // This will set the Content-Type to the appropriate setting for the file 
 +     $ctype ='';​ 
 +     switch( $extension ) { 
 +       case "​mp3":​ $ctype="​audio/​mpeg";​ break; 
 +       case "​wav":​ $ctype="​audio/​x-wav";​ break; 
 +       case "​Wav":​ $ctype="​audio/​x-wav";​ break; 
 +       case "​WAV":​ $ctype="​audio/​x-wav";​ break; 
 +       case "​gsm":​ $ctype="​audio/​x-gsm";​ break; 
 +       // not downloadable 
 +       default: die("<​b>​404 File not found!</​b>"​);​ break ; 
 +     } 
 +     // need to check if file is mislabeled or a liar. 
 +     $fp=fopen($wavfile,​ "​rb"​);​ 
 +     if ($ctype && $fp) { 
 +     header("​Pragma:​ public"​);​ 
 +     header("​Expires:​ 0"); 
 +     header("​Cache-Control:​ must-revalidate,​ post-check=0,​ pre-check=0"​);​ 
 +     header("​Cache-Control:​ public"​);​ 
 +     header("​Content-Description:​ wav file"​);​ 
 +     header("​Content-Type:​ " . $ctype); 
 +     header("​Content-Disposition:​ attachment; filename="​ . $name); 
 +     header("​Content-Transfer-Encoding:​ binary"​);​ 
 +     header("​Content-length:​ " . $size); 
 +     ob_clean();​ 
 +     fpassthru($fp);​ 
 + }else{ 
 + echo '<​b>​404 File not found!</​b>';​ 
 +
 + }else{ 
 + echo '<​b>​404 File not found!</​b>';​ 
 +
 + exit; 
 +}else{ 
 + echo '<​b>​404 File not found!</​b>';​ 
 +}?> 
 +</​code>​ 
 + 
 + 
 +==== Проверка ==== 
 +**Для проверки можно использовать следующий скрипт:​** 
 +<​code>#​!/​bin/​sh 
 +dir_script='/​tmp/';​ 
 +# каталог из asterisk.conf 
 +astspooldir='/​var/​spool/​asterisk';​ 
 +
 +call_text="​Channel:​ SIP/104 
 +Context: miko_ajam 
 +Extension: 10000666 
 +Callerid: Alexey<​104>​ 
 +Setvar: v2=1385413520.14 
 +Setvar: v1=SIP/​104 
 +Setvar: v6=Records 
 +"; 
 + 
 +echo "​$call_text"​ > /​tmp/​file.call;​ 
 +mv '/​tmp/​file.call'​ "​$astspooldir/​outgoing/";​ 
 + 
 +asterisk -rvvv; 
 +</​code>​ 
 +**Вывод в консоли Asterisk** 
 +<​code>​-- Executing [10000666@miko_ajam:​1] NoCDR("​SIP/​104-00000016",​ ""​) in new stack 
 +    -- Executing [10000666@miko_ajam:​2] NoOp("​SIP/​104-00000016",​ "​internal calling application:​ 10000666 1C_Download"​) in new stack 
 +    -- Executing [10000666@miko_ajam:​3] AGI("​SIP/​104-00000016",​ "​1C_Download.php"​) in new stack 
 +    -- Launched AGI Script /​var/​lib/​asterisk/​agi-bin/​1C_Download.php 
 +    -- AGI Script Executing Application:​ (UserEvent) Options: (StartDownloadRecord,​Channel:​SIP/​104,​FileName:​80/​admin/​1c/​download/​index.php?​type=Records&​view=exten-106-104-20131125-160520-1385413520.14.wav) 
 +    -- AGI Script Executing Application:​ (NoCDR) Options: () 
 +    -- <​SIP/​104-00000016>​AGI Script 1C_Download.php completed, returning 0 
 +    -- Executing [10000666@miko_ajam:​4] Hangup("​SIP/​104-00000016",​ ""​) in new stack</​code>​ 
 + 
 +Далее следует открыть в браузере ссылку:​ \\ 
 +[[http://<​IP_PBX>:​FileName]]\\ 
 + 
 +[[astpanel:​ats:​asterisk_v6|Обратно к основной инструкции...]] 
 +===== Комментарии ===== 
 +~~DISQUS~~
astpanel/ats/asterisk/download_file_v6.1385456040.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)