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

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


astpanel:ats:asterisk:setstatus_v6

10000222. Работа со статусами

Описание

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

В плане набора должен быть описан контекст 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
<?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,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.
astpanel/ats/asterisk/setstatus_v6.txt · Последние изменения: 2018/06/08 09:18 — apor