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

вопрос про очередь...

Newbies/FAQ Forum 17 сообщений -
#1

звонит клиент на фирму.
на фирме несколько операторов, обрабатывающих звонки клиентов при помощи софтфонов. например sip/101, sip/102, sip/103
звонок клиента попадает в queue астериска
доходит очередь этого клиента и его вызов соединяется например с sip/101

как узнать какому именно оператору достался этот клиент? или наоборот - кто звонит сейчас оператору sip/101?
в целом задача такая - в момент вызова\поднятия трубки оператором sip/101, информацию по данному клиенту вывести на экран компа оператора.
#2

Макрос+AGI какой-нибудь. Скриптом и выводите. Вон у Wapo в ЖЖ есть прекрасная статья на тему "Предвидеть будущее - легко!". Все решения можно адаптировать под свои нужды.
#3

как у Wapo. неприменимо к моей ситуации. в том примере идёт оповещение как только пупкин позвонил. т.е. заранее.
в моей ситуации этот пупкин может ещё в очереди проторчать минуты две-три....
мне нужно чтоб оповещение пришло именно в момент начала разговора с пупкиным, ну или в момент когда очередь пупкина подошла и в операторский телефон sip/101 пошёл вызов именно от пупкина.

а может есть способ, чтоб как только очередь пупкина подошла, вместо того, чтоб выполнить соединение (dial), передать управление из очереди следующей строке после queue() в дайлплан?
или может событие есть какое, генерируемое внутри queue(), которое происходит именно в момент соединения очередного пупкина?
#4

Я астериск менеджер мониторинг, есть соответствующее событие.
А если агенты будут на основе local channel, то можно из команды дайте макро вызвать
#5

Цитата:
как у Wapo. неприменимо к моей ситуации. в том примере идёт оповещение как только пупкин позвонил. т.е. заранее.
в моей ситуации этот пупкин может ещё в очереди проторчать минуты две-три....
мне нужно чтоб оповещение пришло именно в момент начала разговора с пупкиным, ну или в момент когда очередь пупкина подошла и в операторский телефон sip/101 пошёл вызов именно от пупкина.

Ну, дык, команда Queue + macro + AGI - какие проблемы-то? У меня так и работает.
#6

Сорри спелл чекер андроида. Не мониторинг, а мониторил
#7

andyk74 писал(а):
Я астериск менеджер мониторинг, есть соответствующее событие.
А если агенты будут на основе local channel, то можно из команды дайте макро вызвать


а поподробней никак?
хоть бы название этого события написал....
было бы что гуглить....

Added after 14 minutes:

Leon77 писал(а):
какие проблемы-то?


проблемы такие:
1. я новичёк в астериске.
2. мало литературы на русском.
3. что такое queue macro и AGI знаю, но по отдельности и не углублённо (только то что в книге написано). а как это связать вместе ума не приложу.
4. не умею читать ваши мысли....

Added after 22 minutes:

andyk74 писал(а):
А если агенты будут на основе local channel, то можно из команды дайте макро вызвать


а можно по русски? )))
#8

Ну, если новичек, то астериск менеджер тебе не подойдет - нужен опыт какой-то. название события agentcalled, дебагить менеджер можно например с adhearsion (вот инструкции настройки и пример кода там же)

Насчет local channel:

queues.conf
...
member => Local/120@somecontext

extensions.conf

[somecontext]
exten => 120,1,Dial(SIP/120,......M(....))

Про команду dial читай, кусочки:

M(x): Заставляет выполнить macro (x) в момент ответа на вызов

G: G(context^exten^pri) - Если на вызов ответили, перекидываем обоих абонентов в заданное место плана набора; однако, имеется в виду, что вызывающий (звонящий) абонент будет отправлен к приоритету x, а вызываемый (отвечающий) - к приоритету x+1 (новая опция в версии v1.2)

Макросы в команде Dial

Появилось в Asterisk 1.2, смотри: bug/patch 2905

Теперь Вы можете использовать аргументы в макросах, используя символ '^'

Dial(Zap/1|60|M(mymacro^cat^dog^bark))

Также, макрос может установить переменную MACRO_RESULT в следующие значения:

ABORT - оба участника соединения прервали связь
BUSY
CONTINUE - Отключить вызываемую сторону и продолжить выполнение команд, следующих за командой Dial
GOTO:^^ - перевод звонка.

Added after 4 minutes:

собственно, с макро все вопросы решаются, ты даешь нотификацию, при этом звонящему все еще идут гудки/музыка, а ответивший (агент) может что-то сделать, или получить нотификацию голосом или окошко в приложении.

Local channel не так стабилен как простые звонки на сип телефоны;
логин/паузу агентов начиная с 1.4 версии астериска надо все равно самому допиливать и нет разницы, какой тип агента, это если мы говорим о динамических агентах;

далее тесты, проверки и все получится.
#9

2 andyk74
от вашего объяснения чес слово только ещё печальнее стало.... )))

по сути мне нужно сделать запись в базу при снятии трубки оператором. записать - кто снял трубку (sip/101) и номер телефона звонящего клиента (+7918.....).

гугление меня наткнуло на
http://asterisk-support.ru/forum/topics/7405/
и
http://asteriskforum.ru/viewtopic.php?p=51345

пока читал, весь мозг сломал....
посоветуйте как проще сделать?
#10

Спасибо, что меня цитируют Smile

А насчет вопроса: вы сами обнаружили варианты в последней ссылке. Возьмите в руки "напильник" и сделайте скрипт (хоть на php, хоть на perl, хоть внутри диалплана в макро с MYSQL-функцией) - и пишите в БД что угодно.

И еще можете прочесть данную статью:http://asterisk.ru/news/175

_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#11

так, давайте последовательно попробуем меня научить.....

1. как вызвать макрос из очереди?
исходя из описания - Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule]]]]]]]])
так:
exten => s,n,Queue(managers,,,,,,xxx)
где xxx -
[macro-xxx]
exten => s,1,verbose( zzzzzzzzzzzzzzzzzzzz ${ARG1})

queue.conf
....
[managers]
strategy = rrmemory
member => sip/104
membermacro=somemacro


такая конструкция дала такой результат

Цитата:
== Starting Dongle/datacard0-010000001f at dongle-incoming,+79182119...,1 failed so falling back to exten 's'
-- Executing [s@dongle-incoming] NoOp("Dongle/datacard0-010000001f", "") in new stack
-- Executing [s@dongle-incoming] Set("Dongle/datacard0-010000001f", "cid=+79642055...") in new stack
-- Executing [s@dongle-incoming] Verbose("Dongle/datacard0-010000001f", "+79642055...") in new stack
+79642055....
-- Executing [s@dongle-incoming] Answer("Dongle/datacard0-010000001f", "") in new stack
-- Executing [s@dongle-incoming] Queue("Dongle/datacard0-010000001f", "managers,,,,,,xxx") in new stack
-- Started music on hold, class 'default', on Dongle/datacard0-010000001f
== Using SIP RTP CoS mark 5
[Dec 26 20] WARNING[6597]: channel.c:986 channel_indicate: [Dongle/datacard0-010000001f] Don't know how to indicate condition 22
-- SIP/104-000000a8 is ringing
[Dec 26 20] WARNING[6597]: channel.c:986 channel_indicate: [Dongle/datacard0-010000001f] Don't know how to indicate condition 22
-- SIP/104-000000a8 answered Dongle/datacard0-010000001f
[Dec 26 20] WARNING[6597]: channel.c:986 channel_indicate: [Dongle/datacard0-010000001f] Don't know how to indicate condition 22
-- Stopped music on hold on Dongle/datacard0-010000001f
-- Executing [s@macro-xxx] Verbose("SIP/104-000000a8", " zzzzzzzzzzzzzzzzzzzz ") in new stack
zzzzzzzzzzzzzzzzzzzz
== Spawn extension (dongle-incoming, s, 5) exited non-zero on 'Dongle/datacard0-010000001f'
kkv-1005HA*CLI>


т.е. я увидел свои "zzzzzzzzzzzzzzzzzzz" из макроса

но как передать в макрос ${CALLERID(num)} ?
не понимаю. подскажите....

Added after 1 hours 2 minutes:

вычитал, что в queue() в макрос ни чего передать не получится...
печально....

_________________
asterisk 1.8 ubuntu 11.10
#12

Ну, как же так-то?
Вот мой пример:
Код:

[macro-777]
exten => s,1,AGI(xxx.php,${CDR(clid)},${CDR(dstchannel)},${CDR(channel)})

И туда можно запихнуть всё, что душа пожелает.
И использовать тот язык, какой хочется. Мне вот пхп хочется.
Работает. Прекрасно пишет в базу всё, что мне требуется.
А как сделать - прочитал в этом же разделе, буквально на предыдущей странице. И разбирали ну ровно тот же вопрос!
Читать, читать и еще раз читать, используя форум и Гугл! (почти завещание В.И.Ленина).
#13

короче задача сама собой решилась без всяких макро и AGI

я просто направил queue_log в базу postgresql
а там, всё что нужно мне, уже есть.

extconfig.conf
Цитата:

queue_log => odbc,ast,queue_log


Added after 5 minutes:

Leon77 писал(а):
Ну, как же так-то?
Вот мой пример:


я имел ввиду непосредственно сюда
Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule]]]]]]]])

_________________
asterisk 1.8 ubuntu 11.10
#14

А непосредственно сюда - зачем?
Вот, сами же решение и нашлиSmile
Это говорит о пользе чтенияSmile
#15

очередной вопрос....

на обработку очереди у меня настроены 2 канала sip/101 и sip/102 стратегия rrmemory

идёт входящий звонок с номера 104 (первая строка лога очереди)
поднимает трубку sip/101
затем идёт входящий звонок с номера 105 (третья строка лога очереди)
звонок попадает на sip/102, но 102 трубку не берёт (четвёртая строка лога очереди)
и тогда вызов передаётся опять на 101, и при этом мешает разговаривать оператору sip/101 ....

как исключить такое поведение?

Код:
80;"managers";"2011-12-29 19:47:03.439027";"1325173623.23";"NONE";"ENTERQUEUE";"''";"104";"1";"''"
81;"managers";"2011-12-29 19:47:08.850920";"1325173623.23";"sip/101";"CONNECT";"5";"1325173623.24";"5";"''"
82;"managers";"2011-12-29 19:48:09.185522";"1325173688.25";"NONE";"ENTERQUEUE";"''";"105";"1";"''"
83;"managers";"2011-12-29 19:48:25.141627";"1325173688.25";"sip/102";"RINGNOANSWER";"15000";"''";"''";"''"
84;"managers";"2011-12-29 19:48:46.392538";"1325173688.25";"sip/101";"RINGNOANSWER";"15000";"''";"''";"''"
85;"managers";"2011-12-29 19:49:07.646845";"1325173688.25";"sip/102";"RINGNOANSWER";"15000";"''";"''";"''"
86;"managers";"2011-12-29 19:49:28.824591";"1325173688.25";"sip/101";"RINGNOANSWER";"15000";"''";"''";"''"
87;"managers";"2011-12-29 19:49:50.090322";"1325173688.25";"sip/102";"RINGNOANSWER";"15000";"''";"''";"''"

_________________
asterisk 1.8 ubuntu 11.10
#16

ringinuse=NO
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#17

Не было печали, но тут я обновился с 1.8.11.0-rc2 до 1.8.14.1...
И мой пример из сообщения выше работать перестал. То есть, из CDR в макросе, вызываемом из очереди, ничего полезного, кроме информации об ответившем агенте и uniqueid, не вытащишь. А хотелось бы не только эти параметры иметь, но еще и номер вызывающего абонента.
Лог очереди пишется в базу, но получить информацию, однозначно определяющую запись в этой таблице, у меня не получилось. Как делаю:
1. Вызываю макрос, куда передаю данные о номере агента и uniqueid (первую часть, до точки).
2. В макросе исполняю AGI-script (написан на php, но суть не в этом).
3. Запрашиваю таблицу queue_log с параметрами agent=номер ответившего агента, event like 'CONNECT' и data2 like 'первая часть uniqueid.%'. И получаю нулевой результат. Потому что скрипт отрабатывает раньше, чем в базу попадает запрашиваемая мной строка.
И вот вопрос у меня, в какой переменной хранится информация о uniqueid, которая пишется в лог в поле callid? То есть, с каким идентификатором звонок попадает в очередь?

И ещё одна мысль. Если взять app_queue.c от 1.8.11.0 и применить в 1.8.14.1, работать будет или нет? На живом пробовать не очень хочется, если честно...