Внимание!
Эта wiki об устаревших версиях
Документация к актуальной версии интеграции 1С и телефонии доступна по ссылке

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

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


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,с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='/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;
astpanel/ats/asterisk/setstatus_v6.1402927022.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)