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

Разработка и отладка Asterisk и его приложений.

Модераторы: Admins, Модераторы

Ответить
sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

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

Сообщение sipov » 18 окт 2015, 10:24

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

awsswa
Сообщения: 1706
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 18 окт 2015, 11:06

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

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

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 18 окт 2015, 12:08

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

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

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

awsswa
Сообщения: 1706
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 18 окт 2015, 13:37

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

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

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 18 окт 2015, 18:45

Причем..
Вот ссылка на мой проектик. эти неразрешенные грабли из него
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:
Вот ссылка на выложенные конфиги проектика:
http://forum.cxem.net/index.php?showtopic=155802
Последний раз редактировалось sipov 23 окт 2015, 17:06, всего редактировалось 1 раз.

awsswa
Сообщения: 1706
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 18 окт 2015, 19:18

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

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

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

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

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

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 18 окт 2015, 19:34

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

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

awsswa
Сообщения: 1706
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 18 окт 2015, 19:41

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

но Local/8906123456

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

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 18 окт 2015, 20:04

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

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

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 01 ноя 2015, 11:39

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

Из контекста очереди:
  • [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
В итоге де-регистрация из очереди и невозможность зарегатся в ней, до пополнения своего баланса...

virus_net
Сообщения: 418
Зарегистрирован: 05 окт 2014, 06:10
Откуда: Москва
Контактная информация:

Сообщение virus_net » 02 ноя 2015, 06:22

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

Вообщем что я хочу сказать:
У вас обработчик ошибок просто отсутствует, это плохо.
Все sql запросы и логику лучше переделать на AGI, где в скрипте реализовать обработчик ошибок и вероятно некие действия, если случилась ошибка или ошибки. А ели все ОК, то возвращать в dialplan необходимое действие.
[/offtop]
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)
- whois сервис: whois.bitname.ru или whois.bitname.bit
- dns сервис: dns1.bitname.ru dns2.bitname.ru
- статистика по доменам
ENUMER - звони бесплатно и напрямую.

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 02 ноя 2015, 10:22

[url=http://asteriskforum.ru/viewtopic.php?p=81769#81769][img]http://asteriskforum.ru/images/quotebackarrow.gif[/img][/url] 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 - отвечают за базар :)...
С ошибками та же история - MySQL не загружен ничем другим, стоит на localhost и отладка показала, что сбоев не было...
И так как проектик, не коммерческий - поставляется и работает устойчиво - так как есть...
Если же появятся вышеобозначенные грабли в работе Диспетчера - в частном порядке можно будет подумать и о реализации на скриптах и тэ.дэ
А так не вижу смысла усложнять то, что и так хорошо робит.. По принципу - если работает - не трогай, трогай если не работает... :)

sipov
Сообщения: 27
Зарегистрирован: 17 окт 2015, 21:45
Контактная информация:

Сообщение sipov » 07 ноя 2015, 13:55

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

Ответить