@ru_freeswitch

Страница 384 из 430
Marc
04.09.2018
10:07:52
нет
Ещё вопрос: в дебаг консоли нет ошибок в месте вызова playback?

Borik
04.09.2018
10:08:13
нет, только сообщение о несоответствии рэйта

switch_core_file.c:342 File /var/lib/freeswitch/storage/http_file_cache/53598a4413f70d87017a71f690931e27.wav sample rate 48000 doesn't match requested rate 8000

Google
Borik
04.09.2018
10:09:44
да

Alex
04.09.2018
10:10:05
Так и uuid_dump тоже сработает ведь?)
а как его вызвать в Lua и как найти нужный uuid?

Marc
04.09.2018
10:10:09
да
Тогда даунсамплинг и тестировать

Borik
04.09.2018
10:10:20
черт...

:)

Marc
04.09.2018
10:12:14
черт...
Если нужно давать именно ХД качество, нужно юзать Опус, но абонентский терминал должен поддерживать

Borik
04.09.2018
10:13:36
не, у меня совершенно другая задача. У меня есть хранилище, где лежат хер его знает какие файлы (в плане, какой пользователь промт загрузил, то и лежит), которые мне надо проиграть в канал.

Marc
04.09.2018
10:13:38
Типа такого

Alex
04.09.2018
10:14:51
API:executeString("uuid_dump "..uuid);
так, с этим понятно. а как узнать uuid ног?

назначить принудительно?

Google
Borik
04.09.2018
10:16:12
Если нужно давать именно ХД качество, нужно юзать Опус, но абонентский терминал должен поддерживать
а идея, достать файл, реассемплить его в соответствии с параметрами плеча, и потом уже скармливать в канал - долго и сложно. я вообще делаю: <action application="playback" data="http://xx.xx.xx.xx/media/prompt/6319bd79-79ca-45ef-b963-252d74d023d1.wav?client-id=6d07ceaa-f7fd-49c7-8ab4-9edb3aa067ed&amp;user-id=None"/>

ну и хорошо б было, что б оно работало как-то так просто

Marc
04.09.2018
10:20:42
ну и хорошо б было, что б оно работало как-то так просто
Если пользователя не ограничивать в форматах, возможны проблемы - от тяжёлых файлов до атак на кодеки с помощью специально собранных аудиофайлов )

так, с этим понятно. а как узнать uuid ног?
Запускаете из диалплана ваш луаскрипт с аргументом ${uuid}

Запускаете из диалплана ваш луаскрипт с аргументом ${uuid}
Но я еще раз уточняю, что при таком способе (вызов из диалплана) после завершения вызова часть переменных будет недоступна, плюс в диалплане нужно задать hangup_after_bridge=false, а также выполнить set_zombie_exec при этом после завершения звонка сессия не убьется и из нее можно будет прочитать часть переменных

https://freeswitch.org/confluence/display/FREESWITCH/mod_dptools%3A+set+zombie+exec

Возможно для вашей задачи (прочитать переменные _после_ завершения звонка) способ с curl xml который предложил коллега выше, будет проще

Алексей
04.09.2018
10:58:51
добрый день. есть расхождения по длительности звонка в CDR, между оператором и фрисвичом, расхождение с 1-2 секунды на звонок, подскажите куда копать ?

? Stan
04.09.2018
10:59:03
это нормально

Alex
04.09.2018
11:00:09
Конечная цель какая? Записать длительность обеих ног в субд?
нет, в базу пишется переменная billsec 2-х ног. Мне нужно в скрипте Lua выловить billsec второй ноги

Алексей
04.09.2018
11:01:13
это нормально
выливается в разницу выставляемых счетов за телефонию...

? Stan
04.09.2018
11:01:58
выливается в разницу выставляемых счетов за телефонию...
это даже на межопе нормально. До двух процентов разница обычно оплачивается по данным поставщика

Плюс фрисвич по дефолту округляет математическа, а оператор всегда вверх

Marc
04.09.2018
11:02:32
нет, в базу пишется переменная billsec 2-х ног. Мне нужно в скрипте Lua выловить billsec второй ноги
Вы всё делаете в этом скрипте? В диалплане вызывается луа, в которой всё делается?

Alex
04.09.2018
11:02:57
да

Google
Alex
04.09.2018
11:03:55
Не срабатывает uuid_dump после бриджа - ошибка

Marc
04.09.2018
11:04:47
да
именно ошибка или в переменных _undef_ ?

Alex
04.09.2018
11:06:01
2018-09-04 14:05:39.941043 [INFO] switch_cpp.cpp:1365 -ERR No such channel!

Алексей
04.09.2018
11:06:11
Alex
04.09.2018
11:07:06
if (gate == "mixnet" and legA:ready()) then session:execute("playback", "tone_stream://L=2;%(800,3200,425)"); if (gate == "mixnet" and legA:ready()) then freeswitch.bridge(session, legA); freeswitch.consoleLog("info",legA:getVariable("billsec")); billsec = legA:getVariable("billsec"); API = freeswitch.API() API:executeString("uuid_dump "..my_uuid); freeswitch.consoleLog("info",API:executeString("uuid_dump "..my_uuid)); end;

? Stan
04.09.2018
11:07:17
механизм округления возможно изменить ? где почитать ?
надо брать переменную которая точное время фиксирует с долями секунды и самому окряглять. billmsec вроде называется или ка то так. Но разница всёравно будет, потому что сигнализация ваша не сразу доходит оператору, плюс его станции надо время на обработку.

Плюс если у вас фрисвич в виртуалке работает, то там может время плавать

? Stan
04.09.2018
11:08:43
да, да, все дело в разном времени прихода пакетов сигнализации.
латенцию чинить) Но еще раз - расхождения это нормально. У вас скока процентов?

Алексей
04.09.2018
11:09:03
больше 2х

? Stan
04.09.2018
11:09:21
а что за характер трафика? не с маленьким ацд?

Алексей
04.09.2018
11:10:01
транзит

? Stan
04.09.2018
11:10:29
транзит
ну вас еще накалывать могут чуток. Там процент, плюс от неточности процент, получается 2+

Marc
04.09.2018
11:11:15
а вы с этим пробовали? session:execute("set_zombie_exec")

Alex
04.09.2018
11:11:47
в диалплане прописано. сек...

<include> <extension name="out_mixnet"> <condition field="${toll_allow}" expression="domestic"/> <condition field="destination_number" expression="^(\+38|38)(\d{10})$"> <action application="set" data="early_media=true"/> <action application="set" data="hangup_after_bridge=false"/> <action application="set_zombie_exec"/> <action application="set" data="instant_ringback=true"/> <action application="set" data="ringback=${ru-ring}"/> <action application="set" data="media_bug_answer_req=true"/> <action application="lua" data="billing.lua '${accountcode}' '38$2' '${domain_name}' '${uuid}'"/> </condition> </extension> </include>

Алексей
04.09.2018
11:16:25
ну вас еще накалывать могут чуток. Там процент, плюс от неточности процент, получается 2+
спасибо, пойду читать про billmsec, "латенцию" починить не получиться, сервера в ....

Marc
04.09.2018
11:17:10
в диалплане прописано. сек...
вы этот биллсек из второй ноги хотите потом использовать в расчётах и далее записывать результат в базу?

Google
Alex
04.09.2018
11:18:32
да, хочу в скрипте расчитывать, но не могу выловить его. А в базу он, зараза, пишется)

где то же он есть в какой то переменной

Marc
04.09.2018
11:21:53
Я сталкивался с подобной проблемой в более ранних версиях, в итоге я просто создал кастомные канальные переменные, относящиеся к тарифу и позволяющие вычислить стоимость, а сам расчёт делал с помощью триггера в базе, куда записывались все переменные

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

Alex
04.09.2018
11:23:49
может быть в скрипте задать 2 ноги и бриджевать их, не используя session, только пока не представляю как

Marc
04.09.2018
11:27:11
может быть в скрипте задать 2 ноги и бриджевать их, не используя session, только пока не представляю как
Ну дело, как я понимаю не в способе бриджевания, а в том, что после завершения ноги, все ее переменные уничтожаются, для обхода этого разрабы придумали set_zombie_exec, но как заставить ее работать непонятно. Я планировал с ее помощью прочитать hangup_cause из leg B после завершения звонка, но не вышло

Alex
04.09.2018
11:28:45
1.6.19

Anton
04.09.2018
11:28:48
скажу страшное слово .) esl

Marc
04.09.2018
11:29:16
скажу страшное слово .) esl
та да, но не хочется ))

Alex
04.09.2018
11:29:50
скажу страшное слово .) esl
Я его не понимаю)

Marc
04.09.2018
11:30:27
Я его не понимаю)
у фрисвича есть сокет, через который им можно управлять и подписываться на разные события

Это дает максимально полный контроль над всем

Alex
04.09.2018
11:31:02
Да это я знаю. Но не программер я. Мне тяжко это

Anton
04.09.2018
11:31:07
'Event-Name': 'CHANNEL_HANGUP_COMPLETE'

'variable_billmsec': '7900'

если милисекунды .)

Marc
04.09.2018
11:31:31
Ну да

Anton
04.09.2018
11:31:46
будет на каждой ноге

по своему hangup_complete .)

Google
Marc
04.09.2018
11:32:25
Да это я знаю. Но не программер я. Мне тяжко это
Нужно будет писать отдельное приложение, которое будет подписываться на ивенты, выдавать управляющие команды и писать в базу. Вместо текущей луы

будет на каждой ноге
А сам диалплан, кстати, нужен в этом случае?

Anton
04.09.2018
11:33:23
нет

Marc
04.09.2018
11:33:31
:)

Anton
04.09.2018
11:33:32
в dialplan никакие изменения вносить не потребуется

только слушать

Marc
04.09.2018
11:35:22
в смысле слушать, посчитать и записать в базу?

Anton
04.09.2018
11:35:30
да

Marc
04.09.2018
11:35:56
а модуль который пишет в базу сам по себе, отключить?

Anton
04.09.2018
11:35:58
управлять вызовом из esl в озвученном сценарии не обязательно

<action application="lua" data="billing.lua '${accountcode}' '38$2' '${domain_name}' '${uuid}'"/>

Marc
04.09.2018
11:36:17
mod_odbc_cdr

Anton
04.09.2018
11:36:21
там я так понимаю вопрос того чтобы сюда передать нужное значение

а это уже как захочется

это не сильно связанные между собой вещи

Marc
04.09.2018
11:37:08
в работающем скрипте после завершения легБ прочитать ее биллсек

Anton
04.09.2018
11:39:33
не совсем понял сейчас... я за то чтобы в подобном сценарии написать логику на чём угодно что подцепится на сокет в фрисвитч, получит доступ к нужным событиям, и канальным переменным

а дальше - база, не база, не важно...

писать естественно так чтобы не блокировать сокет в процессе обработки, недавно кто то упоминал о том что у него есть опыт когда подписались на все события и работали с сокетом блокируя поток и при этом терялись сообщения

Marc
04.09.2018
11:42:14
у коллеги, как я понял вся логика реализована на луа, включая создание legB и bridge. Нужно по завершению legB прочитать из нее billsec так чтобы ее значение стало доступно в скрипте для дальнейшего использования. Правильно?

Alex
04.09.2018
11:42:36
а можно в текущем скрипте подключится к сокету и вытянуть нужные данные?

Страница 384 из 430