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

Использование 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 оборудование

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices