Дмитрий Барышников
19.02.2019
877

Использование ForkCDR, ResetCDR и NoCDR

Сегодня рассмотрим приложения диалплана, которые очень важны для кастомизации заполнения CDR. Применяются данные приложения когда есть необходимость не писать CDR вовсе или как-то обнулять значения, например при попадания абонента на «парковку» или же при бриджевании каналов, когда вызов часто мигрирует по маршрутизации. Начнем с приложения ForkCDR([options]). Данное приложение позволяет раздвоить CDR, назначая определенные параметры на […]

Сегодня рассмотрим приложения диалплана, которые очень важны для кастомизации заполнения CDR.

Применяются данные приложения когда есть необходимость не писать CDR вовсе или как-то обнулять значения, например при попадания абонента на «парковку» или же при бриджевании каналов, когда вызов часто мигрирует по маршрутизации.

Использовать данные приложение можно только на свой страх и риск, т.к. вы можете поломать CDR

Начнем с приложения ForkCDR([options]).

Данное приложение позволяет раздвоить CDR, назначая определенные параметры на ту часть, которую мы отсоединяем.

Аргументы приложения:

  • v – копирует переменные, созданные в текущем CDR, на новый CDR. Если данная опция не указана, то те переменные, которые были прикреплены к начальному CDR – удалятся
  • r – НЕ производить сброс новой CDR
  • e – Полностью прерывает заполнения оригинального CDR. Необходимо использовать только после того, как все переменные скопированы в новый CDR
  • T – Исходный CDR отмечается ключом DONT_TOUCH.
  • S(name=var) – К исходным переменным CDR задает значение var
  • D – Очистка поля dstchannel на созданной CDR после сброса

Приведем небольшой пример

Пример приведен из чистого Asterisk
[test-context]
exten => 777,1,Answer()                ; Отвечаем на вызов.
exten => 777,n,Verbose(${CDR(dst)} )   ; отображаем номер.
exten => 777,n,GoTo(test-context-2,888,1)   ; отправляемся в test-context-2 к номеру 888

Как только мы перейдем во второй контекст и отобразим dst мы увидим 777

[test-context-2]
exten => 888,1,Verbose(${CDR(dst)})

А если мы применим ForkCDR, то при отображении dst мы уже увидим 888

[test-context-2]
exten => 888,1,ForkCDR()     ; раздваиваем CDR
exten => 888,n,Verbose(${CDR(dst)})
Использование ForkCDR

Теперь рассмотрим приложение ResetCDR.

Данное приложение полностью сбрасывает данные о совершенном вызове (зависит от используемых опций).

Если применить без опций, то произойдет следующее:

  1. Время начала записи станет текущим
  2. Время ответа устанавливается также текущим
  3. Полностью удаляются переменные в CDR

Аргументы:

  • v – сохранить переменные
  • e – включает CDR, но только для текущего канала.
Опция ‘e’ является устаревшей, вместо неё теперь используется CDR_PROP

В качестве примера можно рассмотреть контекст macro-parked-call, находящийся в диалплане FreePBX. Данный контекст отвечает за парковку вызовов, и сброс CDR здесь как нельзя кстати, потому, что неизвестно, кто заберет припаркованный вызов.

[macro-parked-call]
include => macro-parked-call-custom
exten => s,1,Macro(user-callerid,)
exten => s,n,Gosub(sub-record-check,s,1(parking,${AMPUSER},${AMPUSER}))
exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
exten => s,n,GotoIf($[${LEN(${SHARED(PARKRETURNTO,${CHANNEL})})} > 0]?backtosender)
exten => s,n,GotoIf($[${LEN(${BLINDTRANSFER})} > 0 | ${LEN(${ATTENDEDTRANSFER})} > 0]?attemptpark)
exten => s,n,AGI(parkfetch.agi,${ARG1},${ARG2})
exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => s,n(next),Set(CCSS_SETUP=TRUE)
exten => s,n,GotoIf($["${PARKIE}" != ""]?pcall)
exten => s,n,ResetCDR()                                                             ;здесь происходит сброс CDR
exten => s,n,Set(CDR_PROP(disable)=true)
;Здесь мы отключаем запись в CDR
exten => s,n,Wait(1)
exten => s,n,Playback(pbx-invalidpark)
exten => s,n,Wait(1)
exten => s,n,Hangup
exten => s,n(pcall),Noop(User: ${CALLERID(all)} attempting to pick up Parked Call Slot ${ARG1})
exten => s,n,Noop(PARKIE: ${PARKIE})
exten => s,n,Set(SHARED(PARKRETURNTO,${PARKIE})=)
exten => s,n,Set(PARKOWNER=1)
exten => s,n,ParkedCall(${ARG2},${ARG1})
exten => s,n,Hangup
exten => s,n(attemptpark),Noop(User: ${CALLERID(all)} attempting to Park into slot ${ARG1})
exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER})
exten => s,n,Noop($[${LEN(${PARKOWNER})} = 0])
exten => s,n,GotoIf($[${LEN(${PARKOWNER})} = 0]?parkit)
exten => s,n,Macro(hangupcall,)
exten => s,n(parkit),Set(PARKINGEXTEN=${ARG1})
exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})} > 0]?Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(BLINDTRANSFER,-,1)}):Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(ATTENDEDTRANSFER,-,1)}))
exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
exten => s,n,Park(${ARG2},sc(${CONTEXT},s,200))
exten => s,1+199(backtosender),Noop(Attempting to go back to sender)
exten => s,n,Set(PARKCALLBACK=${PARKER})
exten => s,n,Set(SHARED(PARKRETURNTO,${CHANNEL})=)
exten => s,n,Goto(park-return-routing,${PARKINGSLOT},1)
Пример ResetCDR

Приложение NoCDR. Говорит нам, надо ли вообще что-то записывать в CDR.

На текущий момент данное приложение не поддерживается, вместо него используется function ‘CDR_PROP’

Данная функция задает свойства канала CDR_PROP(name). Свойства задаются следующими аргументами:

Party_a  — текущий канал ставится в приорите, когда 2 канала находятся в бридже.

Disable – выключает заполнение CDR для текущего канала.

Аргумент disables рекомендуется использовать с приложением GoToIf, чтобы производить отключение CDR, только при необходимом выполняемом условии.

Например, если мы не хотим передавать какие-то значения в какую-нибудь интегрированную систему, то диалплан будет выглядеть так:

Использование CDR_PROP
Перед использованием всех выше описанных приложений, рекомендуется делать резервную копию не только текущих настроек, но и сделать дамп вашей базы данных.
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.