Вход | Регистрация
Вы здесь: Главная / Форум / Главный форум по Asterisk / Общего характера / Отслеживание статуса звонка через AMI

Отслеживание статуса звонка через AMI

1 2>
Сообщений: 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-каналов больше одного то без поллитры вообще не разберешься. (Могу привести поток ивентов для такого звонка если интересно).

Соответственно вопрос - кто-нибудь этот велосипед уже изобретал?
2009-09-15 12:16

Avatara of switch
Откуда: Уфа
Сообщений: 5856

Re: Отслеживание статуса звонка через AMI

дык а в чем проблема-то? сугубо программисткая задача.
Понаставь везде юзерэвентов как надо и по ним ориентируйся.
И потом, когда делаешь оригинейт, должен возвращаться статус,
в котором uinqueid звонка.
http://www.lynks.ru - Решения телефонии, мини-АТС, VoIP на основе Trixbox и Asterisk
2009-09-15 12:18

Сообщений: 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? :)
2009-09-15 14:22

Avatara of switch
Откуда: Уфа
Сообщений: 5856

Re: Отслеживание статуса звонка через AMI

ну так как у тебя в оригинате не прямой вызов, а через два диала по одному в каждом леге, новые звонки после диала будут новые uniqueid будут...
Как вариант: не использовать диалы, а goto.
один лег - напрямую в sip девайс, второй - в конференцию

а вообще: в оригинате делай переменную (не помню, можно или нет) и эту переменную свети везде userevent`ом, по ней и ориентруйся
http://www.lynks.ru - Решения телефонии, мини-АТС, VoIP на основе Trixbox и Asterisk
2009-09-15 14:34

Сообщений: 866

Re: Отслеживание статуса звонка через AMI

Ну так я сразу и написал что у меня локал каналов много :=)
Естественно они Dial'ами дергаются.

Без локальных каналов не смогу по двум причинам:
1. к настоящему моменту у меня контест default (в который переходим для набора исходящего) сильно волосат - там дофига всякого функционала - и поиск абонента в кластере и форвард звонка на мобильные и еще всякая фигня. В общем диалплан большой, переделать его на goto легко не получится.
2. если звонить в конференцию напрямую то т.к. нет бриджа - не работают и features. А народ привык комбинацией кнопок включать запись разговора. Чтобы эта же комбинация работала в meetme, нужно заводить на нее звонок через Local.

В originate переменную можно. Не через CLI'шный originate конечно, но у меня CLI только для теста, а так через AMI делается.
С переменной тема выглядит очень здраво, надо попробовать.
2009-09-15 14:50

Сообщений: 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 обрабатывать - перед джоином проходит ренейм канала.
2009-09-15 16:16

Avatara of switch
Откуда: Уфа
Сообщений: 5856

Re: Отслеживание статуса звонка через AMI

не понял!
Т.е. после того, как попадаешь в митми, у тебя номер канала меняется???
Или митми как-то сам звонит абонентам???
http://www.lynks.ru - Решения телефонии, мини-АТС, VoIP на основе Trixbox и Asterisk
2009-09-15 16:24

Сообщений: 866

Re: Отслеживание статуса звонка через AMI

Не. Смотри, у меня диалплан вроде

UserEvent(XXX!${CHANNEL});
MeetMe(1234,d)

так вот в консоле видно что UserEvent и Meetme выполняются в канале Local/что-то. И в AMI UserEvent прилетает вида XXX!Local/что-то.

Однако следующий за ним в AMI ивент MeetmeJoin (который уже само приложение meetme генерирует) - там в ивенте приходит Channel: SIP/1001-что-то.

То есть когда астериск приземляет канал на приложении meetme (точнее видимо когда приложение делает answer) - происходит вся эта колбала с маскарадингом и каналы переименовываются.
2009-09-15 16:45

Сообщений: 866

Re: Отслеживание статуса звонка через AMI

уфф.. При этом у обоих каналов CDR(uniqueid) сохраняется после переименования, так что можно по нему пасти а не по имени канала... копаем дальше :)
2009-09-15 16:53

Avatara of switch
Откуда: Уфа
Сообщений: 5856

Re: Отслеживание статуса звонка через AMI

я думал uniqueid меняется. если нет - то тебе больше ничо и не надо.
имя канала ненадежная штука.
http://www.lynks.ru - Решения телефонии, мини-АТС, VoIP на основе Trixbox и Asterisk
2009-09-15 17:08

1 2>
Добавить страницу в закладки:  Delicious Google Slashdot Yahoo Yandex.ru Reddit Digg Technorati Bobrdobr.ru Newsland.ru Smi2.ru Rumarkz.ru Vaau.ru Memori.ru Rucity.com Moemesto.ru News2.ru Mister-Wong.ru Myscoop.ru 100zakladok.ru