Это старая версия документа!
В плане набора должен быть описан контекст miko_ajam.
В контексте miko_ajam определяется extension с номером 10000222.
[miko_ajam] exten => 10000222,1,NoCDR() exten => 10000222,n,Noop(internal calling application: 10000222 1C_SetStatus) exten => 10000222,n,AGI(1C_SetStatus.php) exten => 10000222,n,Hangup
Приложение может принимать параметры:
#!/usr/bin/php -q <?php /*----------------------------------------------------- // ООО "МИКО" - 2014-03-04 // v.1.5 // 1С_Set_Status // 10000222 // Передача статусов пользователей ------------------------------------------------------- Скрипт протестирован на Askozia v2: Asterisk 1.8.4.4 PHP 4.4.9 AGI phpagi.php,v 2.14 2005/08/29 -------------------------------------------------------*/ require('phpagi.php'); function GetVarChannnel($agi, $_varName){ $v = $agi->get_variable($_varName); if(!$v['result'] == 0){ return $v['data']; }else{ return ""; } } // GetVarChannnel($_agi, $_varName) $agi = new AGI(); $command = GetVarChannnel($agi,'command'); // put // show $dbFamily= GetVarChannnel($agi,'dbFamily'); $key = GetVarChannnel($agi,'key'); $val = GetVarChannnel($agi,'val'); $chan = GetVarChannnel($agi,'chan'); if($dbFamily!='CF'&&$dbFamily!='UserBuddyStatus'&&$dbFamily!='DND'){ $agi->exec("UserEvent", "DB_ERR,user:$key,status:$val"); }elseif($command=='get'){ // получение статуса конкретного пользователя $ret = $agi->evaluate("DATABASE GET $dbFamily $key"); if($ret['result']==1&&$ret['code']==200){ // успех выполнения операции $agi->exec("UserEvent", "DB_$dbFamily,сhannel:$chan,key:$key,val:$val"); }else{ // не установлена! $agi->exec("UserEvent", "DB_$dbFamily,сhannel:$chan,key:$key,val:"); } }elseif($command=='put'){ if(trim($val)==''){ $ret = $agi->evaluate("DATABASE DEL $dbFamily $key"); }else{ if($dbFamily=='DND'){ // текущий штамп времени + 8 часов $val = time() + (8*60*60); } // установка статуса $ret = $agi->evaluate("DATABASE PUT $dbFamily $key $val"); } if($ret['result']==1&&$ret['code']==200){ // успех выполнения операции $agi->exec("UserEvent", "DB_$dbFamily,Channel:$chan,key:$key,val:$val"); }else{ // были ошибки $agi->exec("UserEvent", "Error_data_put_$dbFamily,Channel:$chan,key:$key,val:$val"); } }elseif($command=='show'){ $output = array(); $result =''; // получение статустов всех пользователей $tmp_str = exec('asterisk -rx"database show '.$dbFamily.'"',$output); $agi->verbose("database show ".$dbFamily,3); // обходим файл построчно foreach($output as $_data){ // набор символов - разделитель строк if(! $result=="") $result = $result."....."; $_data = str_replace(' ', '', $_data); $_data = str_replace(':', '@.@', $_data); $_data = str_replace('/UserBuddyStatus/', '', $_data); $_data = rtrim($_data); $result = $result.$_data; // если необходимо отправляем данные порциями if($ch == 20){ // отправляем данные в 1С, обнуляем буфер $agi->exec("UserEvent", "From$dbFamily,Channel:$chan,Date:$date1,Lines:$result"); $result = ""; $ch = 1; } $ch = $ch + 1; } // проверяем, есть ли остаток данных для отправки if(!$result == ""){ $agi->exec("UserEvent", "From$dbFamily,Channel:$chan,Date:$date1,Lines:$result"); } }else{ // ошибка при установке параметров скрипта } // отклюаем запись 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: 10000222 Callerid: Alexey<104> Setvar: command=get Setvar: dbFamily=CF Setvar: key=104 Setvar: val=79257184222 Setvar: chan=SIP/104"; echo "$call_text" > /tmp/file.call; mv '/tmp/file.call' "$astspooldir/outgoing/"; asterisk -rvvv;
#!/bin/sh dir_script='/tmp/'; # каталог из asterisk.conf astspooldir='/var/spool/asterisk'; # call_text="Channel: SIP/104 Context: miko_ajam Extension: 10000222 Callerid: Alexey<104> Setvar: command=put Setvar: dbFamily=CF Setvar: key=104 Setvar: val=79257184222 Setvar: chan=SIP/104"; echo "$call_text" > /tmp/file.call; mv '/tmp/file.call' "$astspooldir/outgoing/"; asterisk -rvvv;
Пример ответа CLI при «verbose 3»:
-- Executing [10000222@miko_ajam:1] NoOp("SIP/104-000000d0", "miko_ajam calling application: 1C_Set_Status") in new stack -- Executing [10000222@miko_ajam:2] Goto("SIP/104-000000d0", "DIALPLAN-APPLICATION-1C_Set_Status_v6,10000222,1") in new stack -- Goto (DIALPLAN-APPLICATION-1C_Set_Status_v6,10000222,1) -- Executing [10000222@miko_ajam:1] AGI("SIP/104-000000d0", "1C_Set_Status_v6.php") in new stack -- Launched AGI Script /etc/asterisk/agi-bin/1C_Set_Status_v6.php -- AGI Script Executing Application: (UserEvent) Options: (DB_CF,Channel:SIP/104,key:104,val:79257184222) -- AGI Script Executing Application: (NoCDR) Options: ()
Пример ответа AMI:
Event: UserEvent Privilege: user,all UserEvent: DB_CF Uniqueid: askozia-1403173508.682 Channel:SIP/104 key:104 val:79257184222
Окончательная проверка:
CLI> database get CF 104 Value: 79257184222
#!/bin/sh dir_script='/tmp/'; # каталог из asterisk.conf astspooldir='/storage/usbdisk1/askoziapbx/voicemailarchive'; SIPADDHEADER='Call-Info:\;answer-after=0'; # call_text="Channel: SIP/104 Context: miko_ajam Extension: 10000222 Callerid: Alexey<104> Setvar: command=show Setvar: dbFamily=UserBuddyStatus Setvar: chan=SIP/104 Setvar: SIPADDHEADER=$SIPADDHEADER"; echo "$call_text" > /tmp/file.call; mv '/tmp/file.call' "$astspooldir/outgoing/"; asterisk -rvvv;
Пример вывода в CLI:
-- Executing [10000222@miko_ajam:1] NoOp("SIP/104-000000d3", "miko_ajam calling application: 1C_Set_Status") in new stack -- Executing [10000222@miko_ajam:2] Set("SIP/104-000000d3", "CDR(miko_ajamCalleridNum)=10000222") in new stack -- Executing [10000222@miko_ajam:3] Goto("SIP/104-000000d3", "miko_ajam,10000222,1") in new stack -- Goto (miko_ajam,10000222,1) -- Executing [10000222@miko_ajam:1] AGI("SIP/104-000000d3", "miko_ajam.php") in new stack -- Launched AGI Script /etc/asterisk/agi-bin/miko_ajam.php -- AGI Script Executing Application: (UserEvent) Options: (FromCF,Channel:SIP/104,Lines:/CF/104@.@79257184222.....1resultsfound.) -- AGI Script Executing Application: (NoCDR) Options: ()
Пример ответа AMI:
Event: UserEvent Privilege: user,all UserEvent: FromCF Uniqueid: askozia-1403173871.684 Channel:SIP/104 Lines:/CF/104@.@79257184222...../CF/100@.@79257184100...../CF/101@.@79257184101
Аналог команды CLI:
askoziapbx*CLI> database show CF /CF/104 : 79257184222 1 results found.