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

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

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


astpanel:ats:asterisk:setstatus_v6

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
astpanel:ats:asterisk:setstatus_v6 [2014/01/21 12:33]
apor создано
astpanel:ats:asterisk:setstatus_v6 [2018/06/08 09:18] (текущий)
apor [Пример 1C_SetStatus.php]
Строка 1: Строка 1:
-====== 10000222. Работа со статусами ​пользователей ​======+====== 10000222. Работа со статусами ======
 [[astpanel:​ats:​asterisk_v6|Обратно к основной инструкции...]]\\ [[astpanel:​ats:​asterisk_v6|Обратно к основной инструкции...]]\\
  
 ===== Описание ===== ===== Описание =====
 +<note important>​**В этой статье описан алгоритм работы**. Пример реализации описан в [[http://​wiki.miko.ru/​astpanel:​dialplan_miko_ajam | статье]] </​note> ​
 +
 В плане набора должен быть описан контекст **miko_ajam**.\\ В плане набора должен быть описан контекст **miko_ajam**.\\
 В контексте miko_ajam определяется extension с номером ** 10000222**.\\ В контексте miko_ajam определяется extension с номером ** 10000222**.\\
 <​code>​[miko_ajam] <​code>​[miko_ajam]
-exten => 10000222,1,NoOP(internal calling application:​ 10000222 ​1C_get_context)</​code>​+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</​code>​
  
 Приложение может принимать параметры:​ Приложение может принимать параметры:​
Строка 14: Строка 19:
   * **val** - значение статуса;​   * **val** - значение статуса;​
   * **chan**- идентификатор пользователя 1С, который инициировал запрос;​   * **chan**- идентификатор пользователя 1С, который инициировал запрос;​
 +===== Пример 1C_SetStatus.php =====
 +
 +<code 1c>#​!/​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(); ​
 +?>
 +</​code>​
 +===== Проверка =====
 +Для проверки можно использовать следующий скрипт:​
 +
 +==== Запись в AstDB ====
 +<​code>​
 +#!/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;
 +</​code>​
 +
 +Пример вывода CLI:
 +<​code> ​   -- 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: ()</​code>​
 +
 +Пример ответа AMI:
 +<​code>​Event:​ UserEvent
 +Privilege: user,all
 +UserEvent: DB_CF
 +Uniqueid: askozia-1403173782.683
 +Channel:​SIP/​104
 +key:104
 +val:​79257184222</​code>​
 +
 +Альтернативная CLI команда:​
 +<​code>​askoziapbx*CLI>​ database put CF 104 74922293045
 +Updated database successfully</​code>​
 +
 +==== Чтение из AstDB ====
 +
 +<​code>​
 +#!/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;
 +</​code>​
 +Пример ответа CLI при "​verbose 3":
 +<​code> ​   -- 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: ()</​code>​
 +
 +Пример ответа AMI:
 +<​code>​Event:​ UserEvent
 +Privilege: user,all
 +UserEvent: DB_CF
 +Uniqueid: askozia-1403173508.682
 +Channel:​SIP/​104
 +key:104
 +val:​79257184222</​code>​
 +
 +Окончательная проверка:​
 +<​code>​CLI>​ database get CF 104
 +Value: 79257184222</​code>​
 +
 +==== Получения значений из AstDB ====
 +
 +<​code>#​!/​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;
 +</​code>​
 +
 +Пример вывода в CLI:
 +<​code> ​   -- 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: ()
 +</​code>​
 +Пример ответа AMI:
 +<​code>​Event:​ UserEvent
 +Privilege: user,all
 +UserEvent: FromCF
 +Uniqueid: askozia-1403173871.684
 +Channel:​SIP/​104
 +Lines:/​CF/​104@.@79257184222...../​CF/​100@.@79257184100...../​CF/​101@.@79257184101</​code>​
  
 +Аналог команды CLI:
 +<​code>​askoziapbx*CLI>​ database show CF
 +/​CF/​104 ​                                          : 79257184222 ​             ​
 +1 results found.</​code>​
astpanel/ats/asterisk/setstatus_v6.1390307609.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)