====== 10000222. Работа со статусами ====== [[astpanel:ats:asterisk_v6|Обратно к основной инструкции...]]\\ ===== Описание ===== **В этой статье описан алгоритм работы**. Пример реализации описан в [[http://wiki.miko.ru/astpanel:dialplan_miko_ajam | статье]] В плане набора должен быть описан контекст **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 Приложение может принимать параметры: * **command** - возвожные значения: "put", "get", "show"; * **dbFamily**- "узел" дерева в AstDB - произвольная строка; * **key** - ключ статуса; * **val** - значение статуса; * **chan**- идентификатор пользователя 1С, который инициировал запрос; ===== Пример 1C_SetStatus.php ===== #!/usr/bin/php -q 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,chan1c:$chan,key:$key,val:$val"); }else{ // не установлена! $agi->exec("UserEvent", "DB_$dbFamily,chan1c:$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,chan1c:$chan,key:$key,val:$val"); }else{ // были ошибки $agi->exec("UserEvent", "Error_data_put_$dbFamily,chan1c:$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,chan1c:$chan,Date:$date1,Lines:$result"); $result = ""; $ch = 1; } $ch = $ch + 1; } // проверяем, есть ли остаток данных для отправки if(!$result == ""){ $agi->exec("UserEvent", "From$dbFamily,chan1c:$chan,Date:$date1,Lines:$result"); } }else{ // ошибка при установке параметров скрипта } // отклюаем запись CDR для приложения // $agi->exec("NoCDR", ""); // ответить должны лишь после выполнения всех действий // если не ответим, то оргининация вернет ошибку $agi->answer(); ?> ===== Проверка ===== Для проверки можно использовать следующий скрипт: ==== Запись в AstDB ==== #!/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; Пример вывода CLI: -- Executing [10000222@miko_ajam:1] NoOp("SIP/104-000000d2", "miko_ajam calling application: 1C_Set_Status") in new stack -- Executing [10000222@miko_ajam:2] Set("SIP/104-000000d2", "CDR(miko_ajamCalleridNum)=10000222") in new stack -- Executing [10000222@miko_ajam:3] Goto("SIP/104-000000d2", "miko_ajam,10000222,1") in new stack -- Goto (miko_ajam,10000222,1) -- Executing [10000222@miko_ajam:1] AGI("SIP/104-000000d2", "miko_ajam.php") in new stack -- Launched AGI Script /etc/asterisk/agi-bin/miko_ajam.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-1403173782.683 Channel:SIP/104 key:104 val:79257184222 Альтернативная CLI команда: askoziapbx*CLI> database put CF 104 74922293045 Updated database successfully ==== Чтение из AstDB ==== #!/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 ==== Получения значений из AstDB ==== #!/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.