Отслеживание статуса звонка через AMI
Сообщений: 866
|
Отслеживание статуса звонка через AMI
А делал кто такую штуку чтобы следить в каком статусе звонок который мы сами через Originate начали? имеется в виду что:
1. через веб-интерфейс в meetme конференцию приглашается новый участник
2. мы делаем Originate. одна нога - Local/number@default вторая - Local/start@meetmecontext Причем "первая нога" именно человек - чтобы сначала дозвонится до него и только когда он ответит - ввести в онференцию.
3. при этом в веб интерфейсе мы нового участника хотим показывать сразу - еще до того как он ответит но с соответствующим статусом - Ringing там или Busy. Ну и если не ответил - убрать из участников.
Все упирается в какое-то адекватное отслежитвание статуса звонка. Смотрю на ивенты которые по AMI идут - там страх и ужас. Простые случаи естественно просты (нужно ловить Newexten, newstate, MeetmeJoin и Hangup). Но когда вовлечены Local каналы, там начинается мяско - между каналами случается Link, Unlink и Rename. А если Local-каналов больше одного то без поллитры вообще не разберешься. (Могу привести поток ивентов для такого звонка если интересно).
Соответственно вопрос - кто-нибудь этот велосипед уже изобретал?
|
Откуда: Уфа
Сообщений: 5856
|
Re: Отслеживание статуса звонка через AMI
дык а в чем проблема-то? сугубо программисткая задача.
Понаставь везде юзерэвентов как надо и по ним ориентируйся.
И потом, когда делаешь оригинейт, должен возвращаться статус,
в котором uinqueid звонка.
|
Сообщений: 866
|
Re: Отслеживание статуса звонка через AMI
Ммм. Не очень понял.
1. при одном звонке я видел кучу разных uniqueid - фактически каждый Dial и каждая нога local канала имела свой личный uniqueid. Как свести все это к общему знаменателю - неясно.
2. по юзеривенту как я понимаю я буду видеть канал на котором его дернули. а проблема именно по каналу понять к какому именно originated звонку он относится.
вот диалплан:
spb-voip1*CLI> dialplan show meetmecontext
[ Context 'meetmecontext' created by 'pbx_ael' ]
'start' => 1. MeetMe(1234|d) [pbx_ael]
-= 1 extension (1 priority) in 1 context. =-
spb-voip1*CLI> dialplan show ctest
[ Context 'ctest' created by 'pbx_ael' ]
'forwardeduser' => 1. Dial(SIP/1001|10) [pbx_ael]
'internaluser' => 1. Dial(SIP/1001|1) [pbx_ael]
2. Dial(Local/forwardeduser@ctest) [pbx_ael]
-= 2 extensions (3 priorities) in 1 context. =-
диалплан неким образом пытается "воспроизвести" вызов на локальный телефон который не удается и делается форвард звонка куда-то дальше.
вот что делаю и лог звонка:
spb-voip1*CLI> originate Local/userexten1@usercontext extension start@meetmecontext
-- Executing [userexten1@usercontext:1] Dial("Local/userexten1@usercontext-7913,2", "Local/internaluser@ctest") in new stack
-- Called internaluser@ctest
-- Executing [internaluser@ctest:1] Dial("Local/internaluser@ctest-22ee,2", "SIP/1001|1") in new stack
-- Called 1001
-- SIP/1001-09349e18 is ringing
-- Local/internaluser@ctest-22ee,1 is ringing
-- Nobody picked up in 1000 ms
-- Executing [internaluser@ctest:2] Dial("Local/internaluser@ctest-22ee,2", "Local/forwardeduser@ctest") in new stack
-- Called forwardeduser@ctest
-- Local/internaluser@ctest-22ee,1 stopped sounds
-- Executing [forwardeduser@ctest:1] Dial("Local/forwardeduser@ctest-f047,2", "SIP/1001|10") in new stack
-- Called 1001
-- SIP/1001-09293810 is ringing
-- Local/forwardeduser@ctest-f047,1 is ringing
-- Local/internaluser@ctest-22ee,1 is ringing
-- SIP/1001-09293810 answered Local/forwardeduser@ctest-f047,2
-- Local/forwardeduser@ctest-f047,1 stopped sounds
-- Local/forwardeduser@ctest-f047,1 answered Local/internaluser@ctest-22ee,2
-- Local/internaluser@ctest-22ee,1 stopped sounds
-- Local/internaluser@ctest-22ee,1 answered Local/userexten1@usercontext-7913,2
== Spawn extension (ctest, forwardeduser, 1) exited non-zero on 'Local/forwardeduser@ctest-f047,2'
== Spawn extension (ctest, internaluser, 2) exited non-zero on 'Local/internaluser@ctest-22ee,2'
-- Executing [start@meetmecontext:1] MeetMe("Local/userexten1@usercontext-7913,1", "1234|d") in new stack
-- Created MeetMe conference 1023 for conference '1234'
-- <Local/userexten1@usercontext-7913,1> Playing 'conf-onlyperson' (language 'en')
[Sep 15 14:19:36] WARNING[9685]: file.c:1273 waitstream_core: Unexpected control subclass '-1'
[Sep 15 14:19:36] WARNING[9685]: file.c:1273 waitstream_core: Unexpected control subclass '-1'
[Sep 15 14:19:36] WARNING[9685]: file.c:1273 waitstream_core: Unexpected control subclass '-1'
== Spawn extension (usercontext, userexten1, 1) exited non-zero on 'Local/userexten1@usercontext-7913,2'
== Spawn extension (meetmecontext, start, 1) exited non-zero on 'SIP/1001-09293810'
показать что при этом сыпется по AMI? :)
|
Откуда: Уфа
Сообщений: 5856
|
Re: Отслеживание статуса звонка через AMI
ну так как у тебя в оригинате не прямой вызов, а через два диала по одному в каждом леге, новые звонки после диала будут новые uniqueid будут...
Как вариант: не использовать диалы, а goto.
один лег - напрямую в sip девайс, второй - в конференцию
а вообще: в оригинате делай переменную (не помню, можно или нет) и эту переменную свети везде userevent`ом, по ней и ориентруйся
|
Сообщений: 866
|
Re: Отслеживание статуса звонка через AMI
Ну так я сразу и написал что у меня локал каналов много :=)
Естественно они Dial'ами дергаются.
Без локальных каналов не смогу по двум причинам:
1. к настоящему моменту у меня контест default (в который переходим для набора исходящего) сильно волосат - там дофига всякого функционала - и поиск абонента в кластере и форвард звонка на мобильные и еще всякая фигня. В общем диалплан большой, переделать его на goto легко не получится.
2. если звонить в конференцию напрямую то т.к. нет бриджа - не работают и features. А народ привык комбинацией кнопок включать запись разговора. Чтобы эта же комбинация работала в meetme, нужно заводить на нее звонок через Local.
В originate переменную можно. Не через CLI'шный originate конечно, но у меня CLI только для теста, а так через AMI делается.
С переменной тема выглядит очень здраво, надо попробовать.
|
Сообщений: 866
|
Re: Отслеживание статуса звонка через AMI
мдя... там все-таки не так все красиво как хотелось бы: Meetme(xxx) в диалплане выполняется на локальном канале:
-- Executing [start@confinvite-meetme:5] MeetMe("Local/userexten1@confinvite-user-c346,1", "1234|d") in new stack
(и юзеривент перед митми придет с того же самого канала). А уже MeetmeJoin прилетает с Channel=SIP/1001-093620c0 то есть уже после маскарадинга. так что проматчить MeetmeJoin с непосредственно перед ним сделанным UserEvent проблематично.
Понятно что можно словив MeetmeJoin прочитать какую-нибудь переменную из канала но это тоже не очень кошерно - хочется на ивенты реагировать быстро без асинхронных операций :( Видимо надо еще AMI Rename обрабатывать - перед джоином проходит ренейм канала.
|
Откуда: Уфа
Сообщений: 5856
|
Re: Отслеживание статуса звонка через AMI
не понял!
Т.е. после того, как попадаешь в митми, у тебя номер канала меняется???
Или митми как-то сам звонит абонентам???
|
Сообщений: 866
|
Re: Отслеживание статуса звонка через AMI
Не. Смотри, у меня диалплан вроде
UserEvent(XXX!${CHANNEL});
MeetMe(1234,d)
так вот в консоле видно что UserEvent и Meetme выполняются в канале Local/что-то. И в AMI UserEvent прилетает вида XXX!Local/что-то.
Однако следующий за ним в AMI ивент MeetmeJoin (который уже само приложение meetme генерирует) - там в ивенте приходит Channel: SIP/1001-что-то.
То есть когда астериск приземляет канал на приложении meetme (точнее видимо когда приложение делает answer) - происходит вся эта колбала с маскарадингом и каналы переименовываются.
|
Сообщений: 866
|
Re: Отслеживание статуса звонка через AMI
уфф.. При этом у обоих каналов CDR(uniqueid) сохраняется после переименования, так что можно по нему пасти а не по имени канала... копаем дальше :)
|
Откуда: Уфа
Сообщений: 5856
|
Re: Отслеживание статуса звонка через AMI
я думал uniqueid меняется. если нет - то тебе больше ничо и не надо.
имя канала ненадежная штука.
|
|