Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
astpanel:ats:asterisk:setstatus_v6 [2014/01/21 18:44] 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 | ||
Строка 38: | Строка 151: | ||
</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 | <code>#!/bin/sh | ||
Строка 60: | Строка 241: | ||
asterisk -rvvv; | asterisk -rvvv; | ||
</code> | </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> |