Получить корректный CDR при attended transfer?
Добавлено: 30 янв 2022, 00:50
Смысл в следующем, обычная ситуация: приходит входящий звонок на оператора 1, он переводит звонок на оператора 2, после чего по завершении разговора кто-то из сторон (внешний клиент или оператор 2) кладет трубку, и звонок завершается.
Но при этом в CDR генерируются 4 записи:
src: Клиент, dst: Оператор 1 [начало звонка - начало перевода звонка]
src: Оператор 1, dst: Оператор 2 [начало перевода - оператор 1 кладет трубку]
src: Клиент, dst: Оператор 1 [время начала и конца соответствует предыдущей запси] <-- Видимо, соответствует каналу, где висит клиент на удержании, пока операторы разговаривают
src: Клиент, dst: Оператор 1 [оператор 1 кладет трубку, начало разговора оператора 2 с клиентом - конец разговора]
Вопрос по последней записи. По идее, там д.б. Оператор 2, вместо 1. В выводе консоли в этом simple_bridge операторы меняются местами, оператор 1 покидает, а оператор 2 помещается в него, и такое событие, судя по всему, не обновляет значения переменных об участниках канала.
Есть ли способы это пофиксить хотя бы костылями?
Что пробовал:
Но при этом в CDR генерируются 4 записи:
src: Клиент, dst: Оператор 1 [начало звонка - начало перевода звонка]
src: Оператор 1, dst: Оператор 2 [начало перевода - оператор 1 кладет трубку]
src: Клиент, dst: Оператор 1 [время начала и конца соответствует предыдущей запси] <-- Видимо, соответствует каналу, где висит клиент на удержании, пока операторы разговаривают
src: Клиент, dst: Оператор 1 [оператор 1 кладет трубку, начало разговора оператора 2 с клиентом - конец разговора]
Вопрос по последней записи. По идее, там д.б. Оператор 2, вместо 1. В выводе консоли в этом simple_bridge операторы меняются местами, оператор 1 покидает, а оператор 2 помещается в него, и такое событие, судя по всему, не обновляет значения переменных об участниках канала.
Есть ли способы это пофиксить хотя бы костылями?
Что пробовал:
- В диалплане какого-то отдельного обработчика, срабатываемого после attended transfer, когда операторы меняются местами, я не нашел (можно было бы установить из него свои переменные CDR).
- Думал хотя бы по окончании разговора фиксировать последнего оператора: в hangup handler при завершении разговора делаю dumpchan, во всех переменных канала фигурирует оператор 1. В секции Info оператор 2 присутствует в поле ConnectedLineIDNum. Но проблема в том, что Info в dumpchan это не переменная канала, и непонятно, как это значение можно дёрнуть из диалплана. Можно было бы на худой конец распарсить вывод dumpchan, но само приложение не возвращает никакого значения, оно просто выводит текст в консоль, в диалплане он недоступен
- Посмотрел в сырцах dumpchan, там юзается внутренняя функция
ведущая в chan_internal_api.c:
Код: Выделить всё
S_COR(ast_channel_connected(c)->id.number.valid, ast_channel_connected(c)->id.number.str, "(N/A)"),
В исходниках ни одного приложения или функции диалплана не нашел возврата chan->connected в диалплан (на то наверное оно и internal api).Код: Выделить всё
struct ast_party_connected_line *ast_channel_connected(struct ast_channel *chan) { return &chan->connected; }