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

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

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


astpanel:ats:asterisk:setstatus_v6

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
astpanel:ats:asterisk:setstatus_v6 [2014/01/21 12:39]
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>​ <​code>​
 #!/bin/sh #!/bin/sh
Строка 37: Строка 150:
 asterisk -rvvv; asterisk -rvvv;
 </​code>​ </​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.1390307949.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)