Индикация состояния абонента в очереди на телефоне с BLF кнопками

Asterisk
imageСегодня задача немного посложнее.
Клиенту нужно, чтобы нажатием на кнопку быстрого набора можно было входить/выходить в очередь. При этом если абонент в очереди, то кнопка горит зеленым, если нет, то моргает красным. Сделать такое можно если IP само собой телефон поддерживает функцию BLF. Для работы функции на кнопке нужно будет прописать номер вида *12111*222, где 111 номер очереди, а 222 номер абонента. Тестировалось это на Grandstream GXP серии, самых разных. Сервером выступает Linux c Elastix, ну и можно просто Asterisk 1.6+.
Одним из условий является отсутствие привязки к номеру абонента. Номера очередей фиксированы, а абоненты могут быть любые. Для мониторинга состояния в Asterisk нужен HINT и если его нет, мы его будем создавать.
Для этого потребуется дополнительный скрипт, а пока начнем с макроса в extensions.conf. В нашем случае это extensions_override_freepbx.conf, так как мы имеем дело с Elastix.
Добавляем в нужный нам контекст макрос обработчик входа/выхода:
[app-queue-toggle]
include => app-queue-toggle-custom
exten => s,1(start),Answer
exten => s,n,Wait(1)
exten => s,n,Macro(user-callerid,)
exten => s,n,Set(QUEUESTAT=LOGGEDOUT)
exten => s,n,AGI(queue_devstate.agi,getqueues,${AMPUSER})
exten => s,n,AGI(qu.php, ${AMPUSER}, ${QUEUENO})
exten => s,n,NoOp(number my ${CALLERIDMY})
exten => s,n,GotoIf($["${QUEUESTAT}" = "LOGGEDOUT"]?activate)
exten => s,n,GotoIf($["${QUEUESTAT}" = "LOGGEDIN"]?deactivate)
exten => s,n,GotoIf($["${QUEUESTAT}" = "STATIC"]?static:end)
exten => s,n(deactivate),Noop(Agent Logged out)
exten => s,n,Macro(toggle-del-agent,)
exten => s,n,Set(DEVICE_STATE(Custom:QueueStat${CALLBACKNUM})=RINGING)
exten => s,n(logout),Playback(agent-loggedoff)
exten => s,n,Macro(hangupcall,)
exten => s,n(activate),Noop(Agent Logged In)
exten => s,n,Macro(toggle-add-agent,)
exten => s,n,Set(DEVICE_STATE(Custom:QueueStat${CALLBACKNUM})=NOT_INUSE)
exten => s,n,GotoIf($["${QAGENT_UNAUTHORIZED}"="1"]?logout)
exten => s,n,Playback(agent-loginok)
exten => s,n,SayDigits(${CALLBACKNUM})
exten => s,n,Macro(hangupcall,)
exten => s,n(static),Noop(User is a Static Agent)
exten => s,n,Playback(agent-loginok)
exten => s,n,Macro(hangupcall,)

И вешаем его на наш номер, сюда же добавляем HINT`ы которые будут добавляться по мере необходимости.
[ext-queues]
include => ext-queues-custom
exten => _*12111*XXX,1,Set(QUEUENO=111)
exten => _*12111*XXX,n,Goto(app-queue-toggle,s,start)
#include /etc/asterisk/extensions_override_hints.conf

Хинты будут храниться во внешнем файле /etc/asterisk/extensions_override_hints.conf. В нем будут записи примерно такого вида:
exten => *12111*222,hint,Custom:QS111222

Еще в папке /var/lib/asterisk/agi-bin нужно создать скрипт qu.php, который вызывается из макроса и добавляет хинты:
#!/usr/bin/php
<?php
set_time_limit(0);
require('phpagi.php');
$agi = new AGI();
$number = $agi->get_variable('AMPUSER');
$queue = $agi->get_variable('QUEUENO'); 
$hints_file = '/etc/asterisk/extensions_override_hints.conf';
$str = 'exten => *12'.$queue['data'].'*'.$number['data'].',hint,Custom:QS'.$queue['data'].$number['data'];
$strsearch = 'QS'.$queue['data'].$number['data'];
$fil = file_get_contents($hints_file); 
if ( !preg_match('~'.$strsearch.'~ism',$fil) ) 
{  
	$fp = fopen($hints_file, "a+");
	fwrite($fp, $str."\r\n");
	fclose($fp);
	$agi->verbose('Exec reload');
	system('/var/lib/asterisk/agi-bin/reload.sh'); 
} 
?>

И еще нам потребуется скрипт, запуск которого перегружает dialplan в asterisk. Ведь мало добавить хинт, нужно «передернуть» диалплан. Поместим сюда же и назовем reload.sh.
#!/bin/sh
/usr/sbin/asterisk -rx 'dialplan reload'

Дайте на него права 733.

Все, можно пробовать нажимать кнопку на телефоне. Когда пропишите она гореть не будет, но после первого нажатия должна изменить цвет на зеленый. Дополнительных настроек asterisk и php не потребовалось, на работу elastix скрипты так же не влияют.

5 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.