В ней регистрируется динамически агенты...
Возникла необходимость - постоянно при переводе звонка на следующий номер зареганный в очереди - проверять его балланс. Для этого мне необходимо - вызвать екстен, в котором будет произведена проверка баланса номера. Вопрос, как это сделать, может кто где ковырял(ет) исходники queue? Может быть я не увидел, в queue.conf для этого есть какие-либо настройки.
и будет вызов агентов через стандарные context прописанный в юзерах
там уже сделаете что необходимо - проверите баланс
вот написанное руками - через вебку также делается
http://awsswa.livejournal.com/26961.html
_________________
платный суппорт по мере возможностей
AddQueueMember(queuetax,Dongle/dongle1/${CALLERID(num)})
удаление проиходит так:
RemoveQueueMember(queuetax,Dongle/dongle1/${EXTEN})
Если только файл queue.conf на лету менять, но потом надо reload делать, сомнительно получается...
вам просто нужна проверка баланса на ваших USB модемах ?
это делается отдельным bash скриптом и поиском легко ищется
_________________
платный суппорт по мере возможностей
Вот ссылка на мой проектик. эти неразрешенные грабли из него
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)
у нас например 100 таксистов и 10 USB модемов
вот по этому вот так AddQueueMember(queuetax,Dongle/dongle1/${CALLERID(num)}) делать нельзя
или вы нас собрались удивить и собрать связку из 100 USB модемов ?
Уже давно сотовые операторы дают привязку городского номера с КУЧЕ симок - звонок с ЛЮБОЙ симки будет выглядеть как будто вы звоните с ОДНОГО НОМЕРА
В идеале ваши агенты в очереди это номера сотовых таксистов и вызывать их надо через Local выбирая любой свободный модем или SIP линию
_________________
платный суппорт по мере возможностей
Единственный способ добавить динамически агента в очередь - AddQueueMember..
Это отсюда взято - "AsteriskTM: будущее телефонии .Второе издание. Джим Ван Меггелен, Лейф Мадсен и Джаред Смит"
И потом, я не прошу просто ответить - ради ответить, а хотел по-существу вопроса ответ увидеть или ближе к этому... На нету и суда нет.
но Local/8906123456
и вызов тоже через Local - где и сделать проверку того что вам нужно
_________________
платный суппорт по мере возможностей
И как Админ системы будет с мобилы менять queue.conf не понятно? А если он один из таксистов? Функционал системы урезан по сравнению с инет-сип системами, но в этом и суть проекта - он такой как задуман. Аналоги только в железе видел...
Про Local - знаю, в свое время с ним пытался добиться нужного функционала... Но не было нужной динамики очереди - отказался...
Из контекста очереди:
- [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
В итоге де-регистрация из очереди и невозможность зарегатся в ней, до пополнения своего баланса...
А что будет, если MySQL вернет error на каком то из этапов ?
А если MySQL не найдет пользователя и NUM_AGBALANCE будет просто пустым ?
Вообщем что я хочу сказать:
У вас обработчик ошибок просто отсутствует, это плохо.
Все sql запросы и логику лучше переделать на AGI, где в скрипте реализовать обработчик ошибок и вероятно некие действия, если случилась ошибка или ошибки. А ели все ОК, то возвращать в dialplan необходимое действие.
[/offtop]
_________________
mega-net.ru - IT аутсорсинг
| 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 и отладка показала, что сбоев не было...
И так как проектик, не коммерческий - поставляется и работает устойчиво - так как есть...
Если же появятся вышеобозначенные грабли в работе Диспетчера - в частном порядке можно будет подумать и о реализации на скриптах и тэ.дэ
А так не вижу смысла усложнять то, что и так хорошо робит.. По принципу - если работает - не трогай, трогай если не работает...