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

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


astpanel:ats:asterisk:getcontext_v6

10000109. Получение контекста для пира

Описание

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

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

[miko_ajam]
exten => 10000109,1,NoOP(internal calling application: 10000109 1C_get_context)

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

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

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

  • number - номер пользователя, который инициировал originate (пример 101)
  • tehnology - технология (SIP / IAX / DAHDI)

Действие

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

exten => 10000109,n,UserEvent(GetContest, chan1c: ${tehnology}/${number}, peercontext: ${1c_context})

Описание параметров

  • Channel - Канал пользователя, запросившего настройку (как правило равен ${tehnology}/${number}).
  • context - Этот контекст будет использоваться для набора номера (его необходимо определить ${1c_context}).

Примеры:

Dialplan

[miko_ajam]
exten => 10000109,1,NoCDR()
exten => 10000109,n,Noop(internal calling application: 10000109 1C_get_context)
exten => 10000109,n,AGI(1C_get_context.php)
exten => 10000109,n,Hangup

PHP AGI скрипт

#!/usr/bin/php -q
<?php
// Получение переменной AGI канала
//	
function GetVarChannnel($agi, $_varName){
  $v = $agi->get_variable($_varName);
  if(!$v['result'] == 0){
    return $v['data'];
  }
  else{
    return "";
  }
} // GetVarChannnel($_agi, $_varName)
require_once('phpagi.php');
$agi = new AGI();    // 
$exten      = GetVarChannnel($agi, "number");
$tehnology  = GetVarChannnel($agi, "tehnology");
$output     = array(); $result='';
 
if($tehnology == 'SIP'){
    $result = exec("asterisk -rx\"sip show peer $exten\" | grep Context | awk -F'[:]+[ ]+' ' { print $2  } '",$output);   
}elseif($tehnology == 'DAHDI'){
    $result = exec("asterisk -rx\"dahdi show channel $exten\" | grep Context | awk -F'[:]+[ ]+' ' { print $2  } '",$output);    
}elseif($tehnology == 'IAX'){
    $result = exec("asterisk -rx\"iax2 show peer $exten\" | grep Context | awk -F'[:]+[ ]+' ' { print $2  } '",$output);   
}
$agi->exec("UserEvent", "GetContest,"
                       ."chan1c:$tehnology/$exten,"
                       ."peercontext:$result");
 
// отклюаем запись CDR для приложения
$agi->exec("NoCDR", "");
// ответить должны лишь после выполнения всех действий
// если не ответим, то оргининация вернет ошибку 
$agi->answer();
 
?>

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

#!/bin/sh
dir_script='/tmp/';
# каталог из asterisk.conf
astspooldir='/var/spool/asterisk';
#
call_text="Channel: SIP/104
Context: miko_ajam
Extension: 10000109
Callerid: Alexey<104>
Setvar: number=104
Setvar: tehnology=SIP";

echo "$call_text" > /tmp/file.call;
mv '/tmp/file.call' "$astspooldir/outgoing/";

asterisk -rvvv;

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

    -- AGI Script Executing Application: (UserEvent) Options: (GetContest,Channel:SIP/104,context:from-internal)

Вывод в AMI

Event: UserEvent
Privilege: user,all
UserEvent: GetContest
Uniqueid: 1412097801.8
Channel:SIP/104
context:internal

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

Комментарии

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