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

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

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


astpanel:ats:asterisk:download_file_v6

10000666. Запрос имени файла на скачивание

Описание

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

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

[miko_ajam]
exten => 10000666,1,NoOP(dounload file from Asterisk)

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

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

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

  • v1 - канал пользователя, который инициировал originate
  • v2 - уникальный идентификатор файла записи. Поле uniqueid таблицы CDR.
  • v6 - тип файла. Может принимать два значения: «FAX» / «Records».

Действие

Приложение должно выполнить команду плана набора UserEvent и передать информацию по файлу:
Если файл найден:

; для типа Records
exten => 10000666,n,UserEvent(StartDownloadRecord,chan1c: ${chan},FileName: ${port}/${path}/${recfile}) 
; для типа FAX
exten => 10000666,n,UserEvent(StartDownloadFax,chan1c: ${chan},FileName: ${port}/${path}/${recfile})

Если файл не найден:

; для типа Records
exten => 10000666,n,UserEvent(FailDownloadRecord,chan1c: ${chan}) 
; для типа FAX
exten => 10000666,n,UserEvent(FailDownloadFax,chan1c: ${chan})

FileName

Параметр состоит их нескольких частей:

  • ${port} - порт, к примеру 80
  • ${path} - путь к ресурсу для скачивания файла
  • ${recfile} - Имя файла

При получении оповещения, 1С откроет интернет обозвреватель по адресу:

http://${IP_PBX}:${port}/${path}/${recfile}

После выполнения UserEvent приложение должно ответить на звонок и отбить его.

exten => 10000111,n,Answer()
exten => 10000111,n,Hangup()

Скрипт для скачивания файла

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

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

Проверка

Для проверки можно использовать следующий скрипт:

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

Вывод в консоли Asterisk

-- 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

Далее следует открыть в браузере ссылку:
http://<IP_PBX>:FileName

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

Комментарии

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