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