AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Вызов из Queue нужного exten

Asterisk-Dev 13 сообщений -
#1

Вопрос следующий. Работает очередь, стратегия-rrmemory..
В ней регистрируется динамически агенты...
Возникла необходимость - постоянно при переводе звонка на следующий номер зареганный в очереди - проверять его балланс. Для этого мне необходимо - вызвать екстен, в котором будет произведена проверка баланса номера. Вопрос, как это сделать, может кто где ковырял(ет) исходники queue? Может быть я не увидел, в queue.conf для этого есть какие-либо настройки.
#2

сделайте агентов через Local
и будет вызов агентов через стандарные context прописанный в юзерах
там уже сделаете что необходимо - проверите баланс

вот написанное руками - через вебку также делается
http://awsswa.livejournal.com/26961.html

_________________
платный суппорт по мере возможностей
#3

Так не подходит, нужна именно динамическая регистрация (мобильных телефонов), происходит так:
AddQueueMember(queuetax,Dongle/dongle1/${CALLERID(num)})

удаление проиходит так:
RemoveQueueMember(queuetax,Dongle/dongle1/${EXTEN})

Если только файл queue.conf на лету менять, но потом надо reload делать, сомнительно получается...
#4

По моему очередь тут совсем не причем
вам просто нужна проверка баланса на ваших USB модемах ?

это делается отдельным bash скриптом и поиском легко ищется

_________________
платный суппорт по мере возможностей
#5

Причем..
Вот ссылка на мой проектик. эти неразрешенные грабли из него
http://asteriskforum.ru/viewtopic.php?t=12845

Added after 3 hours 26 minutes:

Как я понял основной исходник Очереди, в исходниках Asterisk - это файл app_queue.c... Кто поскажет как и в какой функции исходника - корректно ввести свою функцию вызова диалплана, например, с помощью использования уникального аргумента в строке инициализации queue.
Прописав этот аргумент например, в строке очереди как - мой екстен и включив в config.conf - этот exten в который будет осуществлятся переход из очереди, для выполнения диалплана и последующего Return в точку вызова - с продолжением выполнения очереди..
Я немного знаю Си. Может кто подскажет, откуда лучше ковырять, исходник большой + заголовочные файлы...

Added after 45 minutes:

awsswa @ Вс Окт 18, 2015 17:37 писал(а):
По моему очередь тут совсем не причем


Вот ссылка на выложенные конфиги проектика:
http://forum.cxem.net/index.php?showtopic=155802


Последний раз редактировалось: sipov (Пт Окт 23, 2015 17:06)
#6

Еще раз
у нас например 100 таксистов и 10 USB модемов

вот по этому вот так AddQueueMember(queuetax,Dongle/dongle1/${CALLERID(num)}) делать нельзя

или вы нас собрались удивить и собрать связку из 100 USB модемов ?

Уже давно сотовые операторы дают привязку городского номера с КУЧЕ симок - звонок с ЛЮБОЙ симки будет выглядеть как будто вы звоните с ОДНОГО НОМЕРА

В идеале ваши агенты в очереди это номера сотовых таксистов и вызывать их надо через Local выбирая любой свободный модем или SIP линию

_________________
платный суппорт по мере возможностей
#7

Это разве все имеет отношение к вопросу про очередь? И какая очереди разница 100 или 2 таксиста в ней..
Единственный способ добавить динамически агента в очередь - AddQueueMember..
Это отсюда взято - "AsteriskTM: будущее телефонии .Второе издание. Джим Ван Меггелен, Лейф Мадсен и Джаред Смит"

И потом, я не прошу просто ответить - ради ответить, а хотел по-существу вопроса ответ увидеть или ближе к этому... На нету и суда нет.
#8

да все правильно - AddQueueMember

но Local/8906123456

и вызов тоже через Local - где и сделать проверку того что вам нужно

_________________
платный суппорт по мере возможностей
#9

Управление Диспетчером - реализовано с мобилы посредством dtmf, в этом и фишка.. Диспетчер работает сам по-себе и управляется полностью с мобилы через dtmf, интернет тоже не нужен...
И как Админ системы будет с мобилы менять queue.conf не понятно? А если он один из таксистов? Функционал системы урезан по сравнению с инет-сип системами, но в этом и суть проекта - он такой как задуман. Аналоги только в железе видел...

Про Local - знаю, в свое время с ним пытался добиться нужного функционала... Но не было нужной динамики очереди - отказался...
#10

Решено, ЧАСТИЧНО - так как таксист все-таки будет успевать принять один вызов с нулевым балансом своего счета - после чего сразу удаляется из очереди. Работает это дело - следующим образом:

Из контекста очереди:
    [callcenter]
    ...
    exten => 999,n,Queue(queuetax,td,,,60,,subQueueConnected)
    ...

Из макроса:
    [macro-subQueueConnected]
    exten =>s,1,NoOp()
    same =>n,Verbose(4, dynamic balans ${MEMBERNAME})
    same =>n,SET(DYNAMIC_AGENT=${MEMBERNAME:15:12})
    ; Получаем значение баланса агента
    same =>n,MYSQL(Connect connid localhost root taxer asterisk)
    same =>n,MYSQL(Query resultid ${connid} SELECT current_balance FROM users WHERE user_id='${DYNAMIC_AGENT}')
    same =>n,MYSQL(FETCH fetchid ${resultid} NUM_AGBALANCE)
    ; Очищаем результат, он нам больше не нужен
    same =>n,MYSQL(Clear ${resultid})
    same =>n,NoOP(NumberBallance - ${NUM_AGBALANCE})
    same =>n,MYSQL(Disconnect ${connid})
    ; Получим тариф за заказ
    same =>n,MYSQL(Connect connid localhost root taxer asterisk)
    same =>n,MYSQL(Query resultid ${connid} SELECT price FROM tariffs)
    same =>n,MYSQL(FETCH fetchid ${resultid} NUM_ZKTARIFF)
    ; Очищаем результат, он нам больше не нужен
    same =>n,MYSQL(Clear ${resultid})
    same =>n,NoOP(NumberTariff - ${NUM_ZKTARIFF})
    same =>n,MYSQL(Disconnect ${connid})
    ;
    ; Сравним - если баланс менее мин.суммы - на удаление из очереди, если более не удаляем
    same =>n,GotoIf($[${NUM_AGBALANCE} < ${NUM_ZKTARIFF}]?zerobalance:)
    same =>n,DumpChan()

....
    same =>n(zerobalance),Playback(/var/lib/asterisk/indtmf/zerobalance)
    ; Выполняем удаление агента из очереди и БД
    same =>n(yesdbagqueuedel),RemoveQueueMember(queuetax,Dongle/dongle1/${DYNAMIC_AGENT})
    same =>n,MYSQL(Connect connid localhost root taxer asterisk)
    same =>n,MYSQL(Query resultid ${connid} DELETE FROM tblagentqueue WHERE AgentQueue ='${DYNAMIC_AGENT}')
    same =>n,MYSQL(Query resultid ${connid} DELETE FROM tblgpsagent WHERE gpsAgent='${DYNAMIC_AGENT}' ORDER BY gpsAgent DESC)
    ; Дисконектимся
    same =>n,MYSQL(Disconnect ${connid})
    same =>n,Playback(/var/lib/asterisk/loggedoff/agent-loggedoff)
    same =>n,HangUp

В итоге де-регистрация из очереди и невозможность зарегатся в ней, до пополнения своего баланса...
#11

[offtop]
А что будет, если MySQL вернет error на каком то из этапов ?
А если MySQL не найдет пользователя и NUM_AGBALANCE будет просто пустым ?

Вообщем что я хочу сказать:
У вас обработчик ошибок просто отсутствует, это плохо.
Все sql запросы и логику лучше переделать на AGI, где в скрипте реализовать обработчик ошибок и вероятно некие действия, если случилась ошибка или ошибки. А ели все ОК, то возвращать в dialplan необходимое действие.
[/offtop]

_________________
mega-net.ru - IT аутсорсинг
#12

virus_net @ Пн Ноя 02, 2015 10:22 писал(а):
[offtop]
А что будет, если MySQL вернет error на каком то из этапов ?
А если MySQL не найдет пользователя и NUM_AGBALANCE будет просто пустым ?

[/offtop]


Можно конечно вставить что то типа:

    same =>n,MYSQL(FETCH fetchid ${resultid} NUM_AGBALANCE)
    same =>n,GotoIf($[${fetchid} = 0]?yesdbagqueuedel:)

для проверки - на пустое значение, если ошибка тоже ничего хорошего или плохого не случиться... Здесь вызов инициирован очередью, значение NUM_AGBALANCE сформировано на стадии регистрации в очереди и поэтому оно точно есть, иначе номер бы не знала очередь и вызова его не произошло бы... Здесь отладка и продукты - Asterisk и MySQl - отвечают за базар Smile...
С ошибками та же история - MySQL не загружен ничем другим, стоит на localhost и отладка показала, что сбоев не было...
И так как проектик, не коммерческий - поставляется и работает устойчиво - так как есть...
Если же появятся вышеобозначенные грабли в работе Диспетчера - в частном порядке можно будет подумать и о реализации на скриптах и тэ.дэ
А так не вижу смысла усложнять то, что и так хорошо робит.. По принципу - если работает - не трогай, трогай если не работает... Smile
#13

Кто-то может дать ссылку, где разбирают или ковыряют исходники Asterisk? Интересует модуль app_queue.c и его окружение пока. Может буржуйский ресурс, кто знает?