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

    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 скрипты так же не влияют.
    • +10
    • 10,1k
    • 1
    Поделиться публикацией

    Комментарии 1

      0
      Как настроить BLF кнопку для линии в GSM шлюзе dwg2000c?
      На телефоне Grandstream GXP1628 есть BLF кнопки, отлично работают для Юзеров и SIP линий…
      А каким образом настроить BLF кнопки, чтобы отображалось состояние каждой симки шлюза?
      Не просто целый транк на шлюш SIP/IP а по отдельности, по каждому слоту для SIM карты.
      В худшем случае по группе операторов.
      При том, что в sip.conf имеем только одного пользователь для регистрации на шлюзе.

      [siptemp_dwg](!)
      qualify = 600
      type = friend
      host = dynamic
      transport = udp
      encryption = no
      context = gsm-in
      disallow = all
      allow = alaw
      callgroup = 1
      pickupgroup = 1
      deny = 0.0.0.0/0.0.0.0
      permit = 192.168.1.0/255.255.255.0

      [User-DWG](siptemp_dwg);
      defaultuser = User-DWG
      secret = User-PASS

      ...

      [User-101](siptemp);
      defaultuser = User-101
      secret = User-101
      callerid = 101
      call-limit = 1
      busylevel=1
      subscribecontext=BLF_Group


      В файле extension.conf
      [BLF_Group]
      exten => _XXX,hint,SIP/${EXTEN}
      exten => User-101,hint,SIP/User-101
      exten => 0441234567,hint,SIP/0441234567


      Звонок на шлюз по такой схеме идет:
      exten => _0[679]3XXXXXXX,n,Dial(SIP/192.168.1.100/${EXTEN})


      Как донастроить шлюз и что прописать в группе BLF_Group для шлюза?

      Спасибо.

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

      Самое читаемое