на фирме несколько операторов, обрабатывающих звонки клиентов при помощи софтфонов. например sip/101, sip/102, sip/103
звонок клиента попадает в queue астериска
доходит очередь этого клиента и его вызов соединяется например с sip/101
как узнать какому именно оператору достался этот клиент? или наоборот - кто звонит сейчас оператору sip/101?
в целом задача такая - в момент вызова\поднятия трубки оператором sip/101, информацию по данному клиенту вывести на экран компа оператора.
в моей ситуации этот пупкин может ещё в очереди проторчать минуты две-три....
мне нужно чтоб оповещение пришло именно в момент начала разговора с пупкиным, ну или в момент когда очередь пупкина подошла и в операторский телефон sip/101 пошёл вызов именно от пупкина.
а может есть способ, чтоб как только очередь пупкина подошла, вместо того, чтоб выполнить соединение (dial), передать управление из очереди следующей строке после queue() в дайлплан?
или может событие есть какое, генерируемое внутри queue(), которое происходит именно в момент соединения очередного пупкина?
А если агенты будут на основе local channel, то можно из команды дайте макро вызвать
| Цитата: |
| как у Wapo. неприменимо к моей ситуации. в том примере идёт оповещение как только пупкин позвонил. т.е. заранее. в моей ситуации этот пупкин может ещё в очереди проторчать минуты две-три.... мне нужно чтоб оповещение пришло именно в момент начала разговора с пупкиным, ну или в момент когда очередь пупкина подошла и в операторский телефон sip/101 пошёл вызов именно от пупкина. |
Ну, дык, команда Queue + macro + AGI - какие проблемы-то? У меня так и работает.
| andyk74 писал(а): |
| Я астериск менеджер мониторинг, есть соответствующее событие. А если агенты будут на основе local channel, то можно из команды дайте макро вызвать |
а поподробней никак?
хоть бы название этого события написал....
было бы что гуглить....
Added after 14 minutes:
| Leon77 писал(а): |
| какие проблемы-то? |
проблемы такие:
1. я новичёк в астериске.
2. мало литературы на русском.
3. что такое queue macro и AGI знаю, но по отдельности и не углублённо (только то что в книге написано). а как это связать вместе ума не приложу.
4. не умею читать ваши мысли....
Added after 22 minutes:
| andyk74 писал(а): |
| А если агенты будут на основе local channel, то можно из команды дайте макро вызвать |
а можно по русски? )))
Насчет 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 версии астериска надо все равно самому допиливать и нет разницы, какой тип агента, это если мы говорим о динамических агентах;
далее тесты, проверки и все получится.
от вашего объяснения чес слово только ещё печальнее стало.... )))
по сути мне нужно сделать запись в базу при снятии трубки оператором. записать - кто снял трубку (sip/101) и номер телефона звонящего клиента (+7918.....).
гугление меня наткнуло на
http://asterisk-support.ru/forum/topics/7405/
и
http://asteriskforum.ru/viewtopic.php?p=51345
пока читал, весь мозг сломал....
посоветуйте как проще сделать?
А насчет вопроса: вы сами обнаружили варианты в последней ссылке. Возьмите в руки "напильник" и сделайте скрипт (хоть на php, хоть на perl, хоть внутри диалплана в макро с MYSQL-функцией) - и пишите в БД что угодно.
И еще можете прочесть данную статью:http://asterisk.ru/news/175
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
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
Вот мой пример:
| Код: |
| [macro-777] exten => s,1,AGI(xxx.php,${CDR(clid)},${CDR(dstchannel)},${CDR(channel)}) |
И туда можно запихнуть всё, что душа пожелает.
И использовать тот язык, какой хочется. Мне вот пхп хочется.
Работает. Прекрасно пишет в базу всё, что мне требуется.
А как сделать - прочитал в этом же разделе, буквально на предыдущей странице. И разбирали ну ровно тот же вопрос!
Читать, читать и еще раз читать, используя форум и Гугл! (почти завещание В.И.Ленина).
я просто направил 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
Вот, сами же решение и нашли
Это говорит о пользе чтения
на обработку очереди у меня настроены 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
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
И мой пример из сообщения выше работать перестал. То есть, из 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, работать будет или нет? На живом пробовать не очень хочется, если честно...