Страница 1 из 1

Originate и корректный billsec в CDR

Добавлено: 22 янв 2022, 12:53
aclz
День добрый.

Перерыл массу форумов, но не могу взять в толк, можно так сделать или нет:

Два абонента, внутренний и внешний соединяются с помощью Originate (по AMI или из диалплана или из консоли, не важно, результат один).

И проблема следующая: начиная с Астериска 12-13 статус звонка в CDR считается Answered (и начинают тикать billsec), когда трубку берет первый вызываемый абонент.
На Астериске 11 и ранее звонок начинал считаться Answered, когда трубку брал второй абонент, и устанавливался bridge между двумя каналами.
На форуме астера люди так и не смогли победить, разрабы уклончиво отвечают, что типа так и должно быть. Кто-то говорит юзать CEL.

Перепробовал все советы из инета, какими костылями обойти, ничего не помогло. Пробовал:
  • Nocdr / CDR_PROP("disable") + локальные каналы --отключал cdr звонящего, просто запись CDR отсутствует
    ResetCDR со всеми комбинациями ключей --просто секунды тикают с момента ResetCDR, а не с ответа вызываемого. Если ответа вызываемого нет, то получаем NO_ANSWER и billsec > 0
    ForkCDR со всеми комбинациями ключей --почти те же яица, только в профиль
    CDR_PROP("party_a") = "true"/"false" менять местами абонентов --ноль реакции
    Вызов через локальные каналы (/n) --никаких изменений
    Dial с опцией C --почти то же самое, что ResetCDR
Делал вышеперечисленное как перед Dial на внешнего абонента, так и в обработчиках по ключам "b" и "B" как у app.dial(), так и у app.originate().

Читал https://wiki.asterisk.org/wiki/display/ ... cification, в примере "Local channel between bridges" всё по красоте, но у меня как у них записи CDR не формируются, время ответа не равно времени соединения абонентов, а равно времени нахождения первого абонента на линии.

У кого-то это работает? Что я делаю не так? Как сделать, чтобы первый абонент после поднятия трубки (никаких answer() в диалплане нет) не менял статус канала на answered и не запускал счетчик billsec? :oops: Если официальных путей нет, то костыли тоже приветствуются.

Re: Originate и корректный billsec в CDR

Добавлено: 23 янв 2022, 23:40
aclz
Если несколько переформулировать проблему:

1. Когда я напрямую звоню с экстеншена Х на экстеншен Y, то пока идет вызов второго абонента, у канала X статус Ring, у канала Y - Ringing. Поэтому биллинг не начинается, пока второй абонент не поднимет трубку.

2. Когда я звоню с экстеншена Х на экстеншен Y через originate, то пока идет вызов второго абонента, у канала X статус уже Up, у канала Y - Ringing. Поэтому биллинг уже запущен и тикает ещё до того, как второй абонент поднял трубку.

Если бы как-то можно было повлиять на такой характер работы и привести вариант 2 к варианту 1...

Re: Originate и корректный billsec в CDR

Добавлено: 24 янв 2022, 00:09
Zavr2008
В опциях Dial при originate макрос при Answer - там уже просто и сохранять в своей БД таймстемп и uniqueid. Также в CDR в юзерфилд как вариант.
Также где-то юзал просто запись в переменную, далее при Hangup в хандлере и разруливал.
Тоже думал глюк какой-то.

Re: Originate и корректный billsec в CDR

Добавлено: 25 янв 2022, 17:42
aclz
Спасибо, из общения на официальном форуме и курения сурсов для себя тоже сделал вывод, что это единственный приемлемый вариант. Второй вариант: написать свое приложение диалплана по образу и подобию ResetCDR, но с возможностью сброса/установки руками поля answer из макроса, и тогда при финализации CDR billsec посчитается относительно нового значения answer.

То, что разрабы с момента выхода Астера 13 отпинываются от проблемы, это, конечно, печалька :roll:

Re: Originate и корректный billsec в CDR

Добавлено: 25 янв 2022, 23:01
Zavr2008
Свое приложение это конечно хорошо, только сразу тонны проблем - обновления астера и необходимость пересборки своего C-кода вместе с ним ну или свой реп с данным обновлением итп.
так что костыль забиваем и давим на мозоль ребятам из Сангомы)