IMPORT(CHANNEL,VARIABLE) - помогите разобраться
Есть .call файл где звоню себе по каналу local и вызываю real-time extension ЕКСТЕНСИОН
Channel: local/номер@manext/n
Account: ИД
Context: КОНТЕКСТ
Extension: ЕКСТЕНСИОН
Archive: Yes
ЕКСТЕНСИОН вызывает МАКРОС и передает два аргумента (НОМЕР,ИД)
А теперь я хочу в этом макросе реализовать ожидание ввода пользователя, и запись звонка, но согласно документации, могу использовать только extension "s"
Поэтому не придумал ничего лучше, чем из макроса вызывать другой extension и передавать ему эти аргументы с помощью функции IMPORT. Выглядит это так:
[Макрос]
exten => s,1,set(ARG1=${ARG1})
exten => s,2,set(ARG2=${ARG2})
exten => s,3,Goto(КОНЕКСТ_ДЛЯ_МАКРОСА,s,1)
[КОНТЕКСТ_ДЛЯ_МАКРОСА]
...
exten => s,1,Set(ARG1=${IMPORT(${CHANNEL},${ARG1})})
exten => s,2,Set(ARG2=${IMPORT(${CHANNEL},${ARG2})})
...
exten => s,6,MixMonitor(/КАТАЛОГ/${ARG2}.wav)
...
exten => 555,1,Dial(SIP/${ARG1}@ТРАНК,60,ntT)
...
И в логах получаю что-то вроде:
Set("Local/номер@контекст-00000030;1", "ARG1=") in new stack
Т.е. не передается переменная, хотя никаких ошибок не появляется.
Если делать через SHARED, то всё работает:
[Макрос]
exten => s,4,set(SHARED(ARG1)=${ARG1})
exten => s,5,set(SHARED(ARG2)=${ARG2})
[КОНТЕКСТ_ДЛЯ_МАКРОСА]
exten => s,3,MixMonitor(/elitgranit/${SHARED(ARG2)}.wav)
exten => 555,1,Dial(SIP/${SHARED(ARG1)}@telphin1,60,ntT)
но боюсь, что переменные будут пересекаться в случае нескольких вызовов одновременно.
По этим же причинам не использую глобальные переменные.
Если кто подскажет в чем дело, то буду очень благодарен, а если объясните, как обойтись без костылей вроде вызова [КОНТЕКСТ_ДЛЯ_МАКРОСА] из макроса, а все реализовать прямо в [Макрос], то вообще супер.
P.S. Пробовал прямо в макросе получить значение переменной ARG1 используя IMPORT - тоже не получилось.
для теста делал так:
...
exten => s,2,set(ARG2=${ARG2})
exten => s,3,set(IMP4=${ARG2})
exten => s,4,set(IMP5=${IMPORT(${CHANNEL},${IMP4})})
получил:
set("Local/номер@контекст-00000030;1", "ARG1=НОМЕР") in new stack
Set("Local/номер@контекст-00000030;1", "ARG2=ИД") in new stack
Set("Local/номер@контекст-00000030;1", "IMP4=ИД") in new stack
Set("Local/номер@контекст-00000030;1", "IMP5=") in new stack
где контекст,номер,НОМЕР и ИД реальные данные.
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
| Wapo @ Чт Окт 30, 2014 18:47 писал(а): |
| Использовать в имени переменно такую конструкцию: __VAR1. Оно? |
Не помогает.(
Это, насколько удалось понять, если нужно унаследовать между каналами переменную. А тут по факту в рамках одного канала, надо из макроса аргумент передать в екстенсион как переменную. Поэтому такой костыль, сначала объявляем переменную равную аргументу макроса, а потом пытаемся её считать из екстенсиона.
| Violator71 писал(а): |
| Не помогает.( |
неверю. покажите verbose из CLI
| Violator71 писал(а): |
| если нужно унаследовать между каналами переменную. А тут по факту в рамках одного канала |
такая переменная доступна и основному каналу и все последующим, который он может "родить": Asterisk variables
Так же вместо макроса использовать Asterisk cmd Gosub, т.к. макросы деприкейтнуты из астера.
| Цитата: |
| Violator71 писал(а): Не помогает.( неверю. покажите verbose из CLI |
Получается как то так:
В sql real-time есть, к примеру, такая строка:
ID Контекст Extension Priority Application Application Data
42 | test2 | 9514хххххх1024123314 | 1 | Macro | elitgranit,89514хххххх,9514xxxxxx1024123314
т.е. у меня ARG1=89514хххххх
ARG2=9514xxxxxx1024123314
где вместо хххххх реальные цифрфы
.call
Channel: local/1@manext/n
Context: sql
Extension: 9514xxxxxx1024123314
Дозвонившись по каналу local до абонента соединяем его с:
[macro-elitgranit]
exten => s,1,set(IMP5=${IMPORT(${CHANNEL},${ARG2})}) - для теста функции импорт
exten => s,2,set(SHARED(ARG1)=${ARG1}) - работающая конструкция
exten => s,3,set(SHARED(ARG2)=${ARG2}) - работающая конструкция
exten => s,4,set(__IMP1=${ARG2}) - для теста конструкции __VAR
exten => s,5,Goto(elitgranit,s,1)
[elitgranit]
exten => s,1,Set(TIMEOUT(digit)=5)
exten => s,2,MixMonitor(/elitgranit/record/${SHARED(ARG2)}.wav)
exten => s,3,Set(IMP7=${IMPORT(${CHANNEL},${IMP1})}) - для теста IMPORT
exten => s,4,Background(/elitgranit/Oblivion2)
exten => t,1,Goto(s,4)
exten => i,1,Playback(/elitgranit/invalid)
exten => i,2,Goto(s,4)
exten => 555,1,Dial(SIP/${SHARED(ARG1)}@telphin1,60,ntT)
Получаем:
[2014-10-31 08:16:54] VERBOSE[12158][C-0000009f] pbx_realtime.c: -- Executing [1@manext:1] Dial("Local/1@manext-0000004d;2", "SIP/835хххххххх@telphin1,120,ntT")
[2014-10-31 08:16:54] VERBOSE[12158][C-0000009f] netsock2.c: == Using SIP RTP TOS bits 184
[2014-10-31 08:16:54] VERBOSE[12158][C-0000009f] netsock2.c: == Using SIP RTP CoS mark 5
[2014-10-31 08:16:54] VERBOSE[12158][C-0000009f] app_dial.c: -- Called SIP/835хххххххх@telphin1
[2014-10-31 08:16:56] VERBOSE[12158][C-0000009f] app_dial.c: -- SIP/telphin1-000000af is making progress passing it to Local/1@manext-0000004d;2
[2014-10-31 08:16:56] VERBOSE[12158][C-0000009f] app_dial.c: -- SIP/telphin1-000000af is ringing
[2014-10-31 08:16:56] VERBOSE[12158][C-0000009f] app_dial.c: -- SIP/telphin1-000000af is making progress passing it to Local/1@manext-0000004d;2
[2014-10-31 08:16:56] VERBOSE[12158][C-0000009f] app_dial.c: -- SIP/telphin1-000000af answered Local/1@manext-0000004d;2
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx_realtime.c: -- Executing [9514хххххх1021135911@sql:1] Macro("Local/1@manext-0000004d;1", "elitgranit,89514хххххх,9514хххххх1021135911")
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:1] Set("Local/1@manext-0000004d;1", "IMP5=") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:2] Set("Local/1@manext-0000004d;1", "SHARED(ARG1)=8951хххххх") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:3] Set("Local/1@manext-0000004d;1", "SHARED(ARG2)=9514хххххх1021135911") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:4] Set("Local/1@manext-0000004d;1", "__IMP1=9514хххххх1021135911") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:5] Goto("Local/1@manext-0000004d;1", "elitgranit,s,1") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Goto (elitgranit,s,1)
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] app_macro.c: == Channel 'Local/1@manext-0000004d;1' jumping out of macro 'elitgranit'
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@elitgranit:1] Set("Local/1@manext-0000004d;1", "TIMEOUT(digit)=5") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] func_timeout.c: -- Digit timeout set to 5.000
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@elitgranit:2] MixMonitor("Local/1@manext-0000004d;1", "/elitgranit/record/9514хххххх1021135911.wav") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@elitgranit:3] Set("Local/1@manext-0000004d;1", "IMP7=") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@elitgranit:4] BackGround("Local/1@manext-0000004d;1", "/elitgranit/Oblivion2") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] file.c: -- Playing '/elitgranit/Oblivion2.slin' (language 'en')
[2014-10-31 08:16:56] VERBOSE[12159][C-0000009f] app_mixmonitor.c: == Begin MixMonitor Recording Local/1@manext-0000004d;1
2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] pbx.c: == CDR updated on Local/1@manext-0000004d;1
[2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [555@elitgranit:1] Dial("Local/1@manext-0000004d;1", "SIP/89514хххххх@telphin1,60,ntT") in new stack
[2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] netsock2.c: == Using SIP RTP TOS bits 184
[2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] netsock2.c: == Using SIP RTP CoS mark 5
[2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] app_dial.c: -- Called SIP/8951хххххх@telphin1
[2014-10-31 08:17:42] VERBOSE[12157][C-0000009f] app_dial.c: -- Local/1@manext-0000004d;1 requested media update control 20, passing it to SIP/telphin1-000000b0
[2014-10-31 08:17:47] VERBOSE[12157][C-0000009f] app_dial.c: -- SIP/telphin1-000000b0 is making progress passing it to Local/1@manext-0000004d;1
[2014-10-31 08:17:47] VERBOSE[12157][C-0000009f] app_dial.c: -- Local/1@manext-0000004d;1 requested media update control 20, passing it to SIP/telphin1-000000b0
[2014-10-31 08:17:47] VERBOSE[12157][C-0000009f] app_dial.c: -- Local/1@manext-0000004d;1 requested media update control 20, passing it to SIP/telphin1-000000b0
[2014-10-31 08:17:48] VERBOSE[12157][C-0000009f] app_dial.c: -- SIP/telphin1-000000b0 is ringing
[2014-10-31 08:17:48] VERBOSE[12157][C-0000009f] app_dial.c: -- Local/1@manext-0000004d;1 requested media update control 20, passing it to SIP/telphin1-000000b0
[2014-10-31 08:17:48] VERBOSE[12157][C-0000009f] app_dial.c: -- Local/1@manext-0000004d;1 requested media update control 20, passing it to SIP/telphin1-000000b0
[2014-10-31 08:17:49] VERBOSE[12157][C-0000009f] app_dial.c: -- SIP/telphin1-000000b0 answered Local/1@manext-0000004d;1
[2014-10-31 08:17:57] VERBOSE[12157][C-0000009f] pbx.c: == Spawn extension (elitgranit, 555, 1) exited non-zero on 'Local/1@manext-0000004d;1'
[2014-10-31 08:17:57] NOTICE[12157] pbx_spool.c: Call completed to local/1@manext/n
[2014-10-31 08:17:57] VERBOSE[12159][C-0000009f] app_mixmonitor.c: == MixMonitor close filestream (mixed)
[2014-10-31 08:17:57] VERBOSE[12159][C-0000009f] app_mixmonitor.c: == End MixMonitor Recording Local/1@manext-0000004d;1
[2014-10-31 08:17:57] VERBOSE[12158][C-0000009f] pbx.c: == Spawn extension (manext, 1, 1) exited non-zero on 'Local/1@manext-0000004d;2'
То есть по строкам :
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@macro-elitgranit:1] Set("Local/1@manext-0000004d;1", "IMP5=") in new stack
[2014-10-31 08:16:56] VERBOSE[12157][C-0000009f] pbx.c: -- Executing [s@elitgranit:3] Set("Local/1@manext-0000004d;1", "IMP7=") in new stack
Видим, что конструкция:
exten => s,1,set(IMP5=${IMPORT(${CHANNEL},${ARG2})}) - для теста функции импорт
exten => s,4,set(__IMP1=${ARG2}) - для теста конструкции __VAR
exten => s,3,Set(IMP7=${IMPORT(${CHANNEL},${IMP1})}) - для теста IMPORT
не работает.
Да дело точно не в __VAR, если даже в макросе переменной IMP5 не присваивается имя канала local.
Set: UID=$uid
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
| Wapo @ Пт Окт 31, 2014 14:33 писал(а): |
| А не пробовали в сам call-файл добавить требуемые переменные-значения типа: Set: UID=$uid |
Нет, кстати, спасибо за идею.
Попробовал Gosub, всё замечательно работает, макрос стал не нужен, аргументы передаются сразу в нужный контекст где можно использовать всё, что душа пожелает.
Огромное спасибо Wapo, virus_net!
Тему можно закрывать.