Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Передать CDR(dstchannel) в макрос

0
[macro-mfn1]
exten => s,1,Dial(${ARG1},${ARG2},mt)
exten => h,1,NoOp(${CDR(dstcannel)})
exten => h,n,Hangup()
[out]
exten => _1111,1,Macro(mfn1,sip/1001,60)
exten => h,1,NoOp(${CDR(dstchannel)})
exten => h,n,Set(CDR(userfield)=${CDR(dstchannel))
exten => h,n,StopMixMonitor()
exten => h,n,System(${monopt})

При звонке имеем

    -- Executing [1111@out:1] Macro("SIP/1004-0000014e", "mfn1,sip/1001,60") in new stack
    -- Executing [s@macro-mfn1:1] Dial("SIP/1004-0000014e", "sip/1001,60,mt") in new stack
  == Using SIP RTP CoS mark 5
    -- Called 1001
    -- Started music on hold, class 'default', on SIP/1004-0000014e
    -- SIP/1001-0000014f is ringing
    -- SIP/1001-0000014f answered SIP/1004-0000014e
    -- Stopped music on hold on SIP/1004-0000014e
    -- Executing [h@macro-mfn1:1] NoOp("SIP/1004-0000014e", "") in new stack
    -- Executing [h@macro-mfn1:2] Hangup("SIP/1004-0000014e", "") in new stack
  == Spawn extension (macro-mfn1, h, 2) exited non-zero on 'SIP/1004-0000014e'
  == Spawn extension (macro-mfn1, s, 1) exited non-zero on 'SIP/1004-0000014e' in macro 'mfn1'
  == Spawn extension (out, 1111, 1) exited non-zero on 'SIP/1004-0000014e'
    -- Executing [h@out:1] NoOp("SIP/1004-0000014e", "SIP/1001-0000014f") in new stack
    -- Executing [h@out:2] Set("SIP/1004-0000014e", "CDR(userfield)=SIP/1001-0000014f") in new stack
    -- Executing [h@out:3] StopMixMonitor("SIP/1004-0000014e", "") in new stack
    -- Executing [h@out:4] System("SIP/1004-0000014e", "") in new stack

Т.е. получается когда звонок в макросе (dstchannel) - пустой, а когда возвращается в контекст [out] - (dstchannel) снова есть.
Задача такая - записать в userfield номер принявший вызов т.е. Cut из dstchannel, но чет не получается. Если делать set cdr в контексте out , то в базе ничего нет. Может из макроса надо писать, но как в нем получить dstchannel ?

_____________часть 2___________

Для того чтобы получить в макросе того, кто принял звонок можно использовать переменную ${DIALEDPEERNAME}
Однако

exten => s,n,Set(CDR(userfield)=${CUT(DIALEDPEERNAME,-,1)})

в базу не пишет, в консоле ошибок нет вроде

Executing [s@macro-mfn1:2] Set("SIP/1004-00000188", "CDR(userfield)=SIP/1001") in new stack

В чем может быть проблема? как из макроса/(после макроса) изменить userfield ?

удалить закрыть спам изменить тег редактировать

спросил 2012-12-26 11:50:13 +0400

itprofit Gravatar itprofit
768 24 3 27
http://itprofit32.ru/

обновил 2012-12-27 10:29:47 +0400

2 Ответа

0

Надо так:

[macro-mfn1]
exten => s,1,Dial(${ARG1},${ARG2},mt)
exten => s,n,NoOp(${CDR(dstcannel)})

увлеклись экстеном h. Если не знаете для чего он и как он работает - не используйте его. StopMixMonitor(), как правило, явно делать не нужно, все само завершится.

ссылка удалить спам редактировать

ответил 2012-12-26 12:19:19 +0400

switch Gravatar switch
8334 11 7 92
http://lynks.ru/

обновил 2012-12-26 12:21:26 +0400

Comments

если не сделать явно то при выполнении System(конвертировать в МР3) файл еще занят, и не может быть сконвертирован.

itprofit ( 2012-12-26 13:12:17 +0400 )редактировать

И если уже так Dial(${ARG1},${ARG2},mt), то надо добавить (g) чтобы макрос продолжился после диал, иначе сразу после диал попадает в h@out:1

itprofit ( 2012-12-26 13:16:43 +0400 )редактировать

и если добавить g - то результат не меняется dstchannel - пустой

itprofit ( 2012-12-26 13:18:38 +0400 )редактировать

у MixMonitor есть параметры, в которых можно определить команду, которая сольет два файла в один и, если надо, сконвертирует в нужный формат.

switch ( 2012-12-26 13:27:35 +0400 )редактировать

да, в курсе я, не помню уже чего так сделал, но из миксМонитора что-то мне не подошло.

itprofit ( 2012-12-26 13:31:35 +0400 )редактировать

и да, MixMonitor может (и должен) сам закончить запись и вызвать обработчик, попробуйте так:

exten => _X.,n,Set(MONITOR_EXEC="/usr/scr/2wav2mp3.sh")
exten => _X.,n,Monitor(wav,${RECORDFILENAME},mb)

тут полный пример: http://www.voip-info.org/wiki/view/Monitor+stereo-example

тут про это же было: http://asterisk-support.ru/question/39117/khitraia-zapis-razgovorov/

viktorkho ( 2012-12-26 14:02:05 +0400 )редактировать
0

Если я не ошибаюсь, ${CDR(dstchannel)} будет сформирована, только когда вызов завершится (не так давно безрезультатно пытался её юзать в диалплане, есть вопрос на эту тему тут же)..

У себя использую ${CHANNEL(peerip)} / ${CHANNEL(recvip)}

https://wiki.asterisk.org/wiki/display/AST/Function_CHANNEL

ссылка удалить спам редактировать

ответил 2012-12-26 13:58:32 +0400

viktorkho Gravatar viktorkho flag of Kazakhstan
434 5 4 9

Comments

если делать просто диал из контекста , без макроса, то set crd dstchanel читается и записывается в юзерфилд без проблем. Но мне надо сделать чтоб с макросом работало.

itprofit ( 2012-12-26 14:04:19 +0400 )редактировать

вы ошибаетесь. будет выставлена по началу звонка. по теме - в макросе по ответу есть другие переменные с тем же смыслом. сделайте в макросе dumpchan и посмотрите.

meral ( 2012-12-26 16:29:18 +0400 )редактировать

спасибо, получил в макросе то, что мне нужно exten => s,n,Set(CDR(userfield)=${CUT(DIALEDPEERNAME,-,1)}) но в таблицу все равно не пишет userfild-пустой

itprofit ( 2012-12-27 10:20:26 +0400 )редактировать

ну да, в макросе не пишет в cdr. так и должно быть. можно евент послать,словить внешней программой и записать отложенное.

meral ( 2012-12-27 11:18:55 +0400 )редактировать

Сложновато для меня, ну а после макроса в out@h он чего не пишет CDR?

itprofit ( 2012-12-27 12:01:30 +0400 )редактировать

хз. такая вот особенность. насколько я помню он в userfield в после макроса звонка вообще не пишет. екперементируйте ;)

meral ( 2012-12-27 15:18:36 +0400 )редактировать

понятно, спс

itprofit ( 2012-12-28 09:48:24 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2012-12-26 11:50:13 +0400

Просмотрен: 1,754 раз

Обновлен: Dec 27 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.