Дмитрий Рашевский
09.01.2020
547

Device and Users и динамические агенты в очередях

Введение Процедура регистрации операторов в режиме adhoc (разбор диалплана) Доработка AGI скрипта для регистрации операторов в очереди Заключение Введение Многие при использовании FreePBX выбирают систему Device and Users. Она подразумевает работу нескольких сотрудников с разными добавочными номерами за одним аппаратом. Но, предположим ситуацию, где оператор, помимо ввода сервисных кодов *11 для регистрации на астериске, будет […]

  1. Введение
  2. Процедура регистрации операторов в режиме adhoc (разбор диалплана)
  3. Доработка AGI скрипта для регистрации операторов в очереди
  4. Заключение

Введение

Многие при использовании FreePBX выбирают систему Device and Users. Она подразумевает работу нескольких сотрудников с разными добавочными номерами за одним аппаратом. Но, предположим ситуацию, где оператор, помимо ввода сервисных кодов *11 для регистрации на астериске, будет вводить *45 и регистрироваться во всех очередях, в которых он добавлен, как динамический агент.

Такая ситуация очень затрудняет работу операторов. Поэтому в данной статье будет рассказано, как доработать функционал FreePBX, для того, чтобы при регистрировании пользователей по сервисному коду *11, они автоматически подключались во все очереди, где они участвуют.

Процедура регистрации операторов в режиме adhoc

Для углубленного понимания дальнейших действий, мы рассмотрим как работает регистрация пользователя на устройстве. В этом пункте мы рассмотрим, какой диалплан выполняется, какой скрипт выполняется для регистрации.

Для того, чтобы разобраться с диалпланом, введем консольную команду

   #    asterisk -rx 'dialplan show *11@from-internal'   
Dialplan show
Dialplan show

На рисунке 1 видно, что используется для регистрации макрос user-logon. Посмотрим, что в нем выполняется. Для этого используем команду

   #    asterisk -rx 'dialplan show s@macro-user-logon'   
Macro-user-logon
Macro-user-logon
[macro-user-logon]
exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
; получаем добавочный номер сотрудника
;
exten => s,n,Set(AMPUSER=${ARG1})
exten => s,n,GotoIf($["${AMPUSER}" != ""]?gotpass)
exten => s,n(playagain),Read(AMPUSER,please-enter-your-extension-then-press-pound,,,4)
; получаем пароль сотрудника и регистрируемся
;
exten => s,n,GotoIf($["${AMPUSER}" = ""]?s-MAXATTEMPTS,1)
exten => s,n(gotpass),GotoIf($["${DB_EXISTS(AMPUSER/${AMPUSER}/password)}" = "0"]?s-NOUSER,1)
exten => s,n,Set(AMPUSERPASS=${DB_RESULT})
exten => s,n,GotoIf($[${LEN(${AMPUSERPASS})} = 0]?s-NOPASSWORD,1)
; Не продолжаем, если пользователь уже зарегистрирован
;
exten => s,n,Set(DEVICEUSER=${DB(DEVICE/${CALLERID(number)}/user)})
exten => s,n,GotoIf($["${DEVICEUSER}" = "${AMPUSER}"]?s-ALREADYLOGGEDON,1)
exten => s,n,Authenticate(${AMPUSERPASS})
exten => s,n,AGI(user_login_out.agi,login,${CALLERID(number)},${AMPUSER})
exten => s,n,Playback(agent-loginok)

Из этого куска диалплана видна работа с astdb, где пользователи закреплены в ветке AMPUSER, а устройства  — в ветке DEVICE. Итак, сперва проверяется в дереве DEVICE у устройства, с которого набрали его тип и заносится в переменную DEVICETYPE.

  • fixed – закреплен фиксированный пользователь
  • adhoc – пользователь не закреплен

После получения результата сверяется в необходимым значением. Нас интересует значение adhoc, поэтому переходим на пятый пункт приоритета.

Здесь в переменную AMPUSER заносится значение, которое должно было передаваться одним из параметров приложения Macro(user-logon,) (см. Рис 1). И если значение пустое, то выполняется седьмой пункт с командой Read. Где в течение четырех секунд надо ввести внутренний номер, который логинится, полученное значение вносится в переменную AMPUSER.

Следующий пункт определяет наличие пароля регистрируемого пользователя в astdb в ветке AMPUSER. Если такой находится, то значение заносится в AMPUSERPASS. После чего командой Authenticate ожидается ввод пароля. И если все верно, то выполняется AGI скрипт user_login_out.agi куда передаются несколько параметров

  • login — статус действия
  • ${CALLERID(number)} — номер устройства, с которого происходит регистрация
  • ${AMPUSER} — пользователь, который хочет зарегистрироваться
user_login_out.agi
user_login_out.agi

На этом моменте наступает самое интересное, из-за чего была написана эта статья.

Доработка AGI скрипта для регистрации операторов в очереди

Теперь приступим к изменениям в agi скрипте  user_login_out.agi. Для этого перейдем в директорию /var/www/html/admin/modules/core/agi-bin/ и откроем файл  user_login_out.agi любым текстовым редактором.

Приступим к изменениям.

  1. Добавим строку, где в переменную $prio занесем значение выполнения функции  is_queue_member. (см. пункт 4)
$prio = is_queue_member($queueno,$user);
  1. Ниже проводится проверка переменной $onoroff. В теле этого условия, после обозначения переменной $queuestat, добавим условие проверки переменной $prio и $queuestat
  2. При выполнении условий укажем выполнение стандартных приложений asterisk «AddQueueMember» и «UserEvent«

3. В AddQueueMember будем передавать несколько параметров:

  • Номер очереди queueno
  • Имя интерфейса пользователя в данной очереди
  • Приоритет в очереди prio
  • Метод вызова устройства SIP/$device
if (($prio != -1) && ($queuestat == 'NOT_INUSE')) {
                                        debug("Logging in to queue $queueno");
                                        $agi->exec("AddQueueMember","$queueno,Local/$user@from-queue/n,$prio,,,SIP/$device");
                                        $agi->exec("UserEvent","AgentLogin,Agent:$user");
                                }

4.В конце файла добавим функцию is_queue_member, которая будет принимать два параметра: номер очереди и номер регистрируемого пользователя.
Эта функция определяет приоритет оператора в очереди. Изначально поставим его в значение -1. Примем это значение за отсутствие в очереди.

function is_queue_member($queue, $user)
        {
            global $agi;
            $res = -1;
            $get = $agi->database_get('QPENALTY',$queue.'/agents/'.$user);
            debug("QLIST: res=".$get['result']." data0: ".$get['data'][0]);
            if ($get['result'] == 1){
                $res = $get['data'][0];
            }
            return $res;
        }

5. В теле функции в переменную get заносится значение из astdb в семействе QPENALTY, где указан приоритет регистрируемого пользователя — переменная $user. Если такой пользователь находится в очереди ($get[‘result’] == 1), то значение записываем в переменную $res.

Изменения в скрипте
Изменения в скрипте
user_login_out.agi
user_login_out.agi

Заключение

В этой статье был рассмотрен механизм закрепления пользователя за устройством. В разделе «Процедура регистрации операторов в режиме adhoc» полностью рассмотрели диалплан, используемый при регистрации пользователя, если тип устройства adhoc.

Также в последнем разделе рассмотрели правки необходимые для внесения в AGI скрипт user_login_out.agi

avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices