freeswitchforum.com

Форум поддержки FreeSWITCH

FreeSWITCH is a registered trademark of Anthony Minessale. Official FreeSWITCH site.

Текущее время: 16 май 2024 02:07

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 05 май 2015 16:29 

Зарегистрирован: 24 дек 2014 10:40
Сообщения: 85
Ребята привет.

Вот такая задачка у меня имеется.
Мне надо определить, закончился разговор на этом пользователе, или он перевел звонок другому абоненту. Т.е. у меня в статистике на звонок с одним переводом будет две записи. a->b и a->c. И надо пометить звонок a->b как звонок окончившейся переводом на другого абонента.

Сравнивал три вывода info:
1) a->b(hangup)(info)
2) a->b(transfer)(info)->c
3) a->b(transfer)->c(hangup)(info)

В варианте 2 и 3 присутствуют variable_transfer_history и variable_transfer_history. Причем они одинаковы. Т.е. по ним можно определить что перевод был, но нельзя определить завершился разговор или продолжается дальше, но с другим абонентом.

Думал оттолкнуться от переменной variable_originated_legs, но тогда как определить что пользователь C положил трубку, а не перевел звонок, так как у него присутствуют variable_transfer_history и variable_transfer_source. и они не отличаются.

Есть предположение использовать
Channel-State: [CS_EXECUTE]
Channel-Call-State: [ACTIVE]
Channel-State-Number: [2]

При звонке с трансфером код состояния равен 2, при обычном звонке(финальном) код состояния равен 4. Предполагаю что это [2] - CS_ROUTING и [4] - CS_EXECUTE
Придумано вот отсюда https://wiki.freeswitch.org/wiki/Channel_States, отсчет начал с 0.

Я придумал корректный способ определения состояния? Или есть более правильный и красивый?

_________________
Если бы я был админом одной организации, я бы сделал все по другому.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 май 2015 16:34 
FreeSWITCH_GuRu

Зарегистрирован: 22 авг 2012 09:52
Сообщения: 1710
смотрите cdr в режиме ab

_________________
ЛС: @rostel
Сообщество: @ru_freeswitch


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 май 2015 17:38 

Зарегистрирован: 24 дек 2014 10:40
Сообщения: 85
Я так понимаю, что cdr в ab это не совсем то что надо
В спойлере звонок a->b->c
[+] cdr
"Никола Петрович Сидоров","2*1010","2*1000","main-context","2015-05-05 19:18:45","2015-05-05 19:18:50","2015-05-05 19:18:53","8","3","NORMAL_CLEARING","e0239270-24bf-4609-95a9-21ce726d534b","", "","PCMA","PCMU","3CXPhone 6.0.26523.0","","","",""
"Никола Петрович Сидоров","2*1010","2*1005","main-context","2015-05-05 19:18:53","2015-05-05 19:18:59","2015-05-05 19:19:04","11","5","NORMAL_CLEARING","e0239270-24bf-4609-95a9-21ce726d534b","", "","PCMA","PCMA","X-Lite 4.8.2 76122-a8b94977-W6.2","","","",""
"2*1010","2*1010","1005","main-context","2015-05-05 19:18:45","2015-05-05 19:18:45","2015-05-05 19:19:04","19","19","NORMAL_CLEARING","e0239270-24bf-4609-95a9-21ce726d534b","03716a38-76b6-453e-8229-b4a89adcac1b", "","PCMA","PCMA","Z 3.6.25251 r25476","","","",""


не совсем понятно как использовать данную информацию. И еще одно уточнение. У меня диалплан на питоне(интеграция с билингом, так сказать), и считывать статистику вне текущего скрипта не совсем хотелось бы, так как использую для статистики не cdr, а свой формат со своим велосипедом.

А почему не корректно использовать мой вариант с Channel-State-Number? Просто я инфы никакой не нашел, вот и спрашиваю у бывалых.

Спасибо.

_________________
Если бы я был админом одной организации, я бы сделал все по другому.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 май 2015 18:21 
FreeSWITCH_GuRu

Зарегистрирован: 22 авг 2012 09:52
Сообщения: 1710
cdr - это совсем то что нужно
смотреть надо в xml_cdr, долго сравнивать для поиска нужных переменных
потом пытаться отыскать их пока вызов ещё не завершен

_________________
ЛС: @rostel
Сообщество: @ru_freeswitch


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 май 2015 11:33 

Зарегистрирован: 24 дек 2014 10:40
Сообщения: 85
[+] Спасибо
да. xml-cdr это сильно. как минимум оставлю себе под пост дебаг с обязательной ротацией, а то за месяц набежит гигов 100 логов :)


а по поводу моего вопроса: вроде нашел параметр который мне подходит
Цитата:
<endpoint_disposition>BLIND_TRANSFER</endpoint_disposition>

Только мне надо ее прочитать в канале перед его завершением, а в этот момент значение переменной endpoint_disposition всегда равно ANSWER. получить нужное значение можно только если сделать hangup каналу(я так предполагаю), но в этом случае сбрасывается и звонок, который переадресовывается.

Т.е. получается что надо или использовать пост анализ CDR-ки или опираться на параметр Channel-State-Number, и смотреть когда у него значение равно 2

Или можно как то принудительно заставить cdr считать что данный канал завершен и надо сбросить статистику по каналу(предполагаю что и значение переменной endpoint_disposition тоже изменится)?

_________________
Если бы я был админом одной организации, я бы сделал все по другому.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 май 2015 11:48 
FreeSWITCH_GuRu

Зарегистрирован: 22 авг 2012 09:52
Сообщения: 1710
внимательно посмотрите на все поползновения по диалплану в момент трансфера
если нет однозначных штатных переменных, вставьте свои в нужное место

_________________
ЛС: @rostel
Сообщество: @ru_freeswitch


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 май 2015 14:44 

Зарегистрирован: 24 дек 2014 10:40
Сообщения: 85
Просмотрел все вдоль и поперек. И наполовину решил задачку.
Объявил hangup_hook, и в нем передается статус hangup или transfer. Но как всегда есть одно НО!

Кейс 1:
Цитата:
a -[call]-> b -[transfer]-> c
В этом случае я в hangup_hook функции ловлю transfer в качестве причины. Все ок.


Кейс 2:
Цитата:
a -[call]-> b
a -[transfer]-> c
Т.е. соединяю c и b. Эмуляция секретаря так сказать.
В этом случае я в hangup_hook функции ловлю hangup, хотя жду конечно от экстеншена a статус transfer


Как в этом случае обойти не совсем понятно.
И еще, а как можно перехватить реакцию свитча на переключение в холд и получение refer пакетика? Что бы можно было что то выполнить в этот момент(к примеру выставить статус экстеншену)

_________________
Если бы я был админом одной организации, я бы сделал все по другому.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 май 2015 16:14 
FreeSWITCH_GuRu

Зарегистрирован: 22 авг 2012 09:52
Сообщения: 1710
Код:
...
my $sip_refer_to = $xml_cdr->{'variables'}->[0]->{'sip_refer_to'}->[0];
my $sip_referred_by = $xml_cdr->{'variables'}->[0]->{'sip_h_Referred-By'}->[0];
my $sip_redirected_to = $xml_cdr->{'variables'}->[0]->{'sip_redirected_to'}->[0];

...
my $callerprofile = '';
for (my $i=0; $i < $#{$xml_cdr->{'callflow'}}+1; $i++) {
    if ($xml_cdr->{'callflow'}->[$i]->{'profile_index'} =~ m/^1$/) {
        $callerprofile = $xml_cdr->{'callflow'}->[$i]->{'caller_profile'}->[0]->{'caller_id_number'}->[0];
    }
}

if (defined($sip_refer_to) && $sip_refer_to =~ m/^%3Csip%3A(.*).*%40.+/) {
    $sip_refer_to = $1;
} else {
    undef $sip_refer_to;
}

if (defined($sip_referred_by) && $sip_referred_by =~ m/^%3Csip%3A(.*)%40.+/) {
    $sip_referred_by = $1;
} else {
    undef $sip_referred_by;
}

if (defined($sip_redirected_to) && $sip_redirected_to =~ m/^%3Csip%3A(.*)%40.+/) {
    $sip_redirected_to = $1;
} else {
    undef $sip_redirected_to;
}
...

а дальше полный фарш с их анализом

_________________
ЛС: @rostel
Сообщество: @ru_freeswitch


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 май 2015 17:02 

Зарегистрирован: 24 дек 2014 10:40
Сообщения: 85
Ваш вариант хороший, я о нем думал после Вашего первого комментария насчет xml_cdr. Только вот я не понял как именно получить готовый набор cdr в текущем канале, а не после его завершения. Если рассматривать пост обновление данных с разбором файла(или получения данных по url), то этот вариант лучший. К тому же, полная картина будет созранена только после того, как будет завершен канал b
По крайней мере я по трем созданным файлам увидел такую картину.
Первый файл создался сразу после перевода a->c. В нем нет никакой информации по трансферу
Второй и третий файл создались после завершения каналов b и c. В с видно что на него перевели с a. В b видно полное движение всех переводов(referer, callflow и т.д.)


Но я вроде решил вопрос. Не факт что самым правильным способом, но по крайней мере попахивает логичным решением.
hangup_hook + variable_endpoint_disposition. В первом случае hangup_hook даст transfer а variable_endpoint_disposition ANSWER, во втором случае hangup_hook даст hangup а variable_endpoint_disposition BLIND_TRANSFER.

Т.е. так как хочется....

Спасибо за подсказки и участие.

_________________
Если бы я был админом одной организации, я бы сделал все по другому.....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 май 2015 10:40 
FreeSWITCH_GuRu

Зарегистрирован: 22 авг 2012 09:52
Сообщения: 1710
первые три переменные доступны в канале

когда прилетает hangup зависит от того кто переводит

_________________
ЛС: @rostel
Сообщество: @ru_freeswitch


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB