AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

IMPORT(CHANNEL,VARIABLE) - помогите разобраться

Newbies/FAQ Forum 7 сообщений -
#1

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

где контекст,номер,НОМЕР и ИД реальные данные.
#2

Использовать в имени переменно такую конструкцию: __VAR1. Оно?
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#3

Wapo @ Чт Окт 30, 2014 18:47 писал(а):
Использовать в имени переменно такую конструкцию: __VAR1. Оно?


Не помогает.(
Это, насколько удалось понять, если нужно унаследовать между каналами переменную. А тут по факту в рамках одного канала, надо из макроса аргумент передать в екстенсион как переменную. Поэтому такой костыль, сначала объявляем переменную равную аргументу макроса, а потом пытаемся её считать из екстенсиона.
#4

Violator71 писал(а):
Не помогает.(

неверю. покажите verbose из CLI

Violator71 писал(а):
если нужно унаследовать между каналами переменную. А тут по факту в рамках одного канала

такая переменная доступна и основному каналу и все последующим, который он может "родить": Asterisk variables

Так же вместо макроса использовать Asterisk cmd Gosub, т.к. макросы деприкейтнуты из астера.
#5

За 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.
#6

А не пробовали в сам call-файл добавить требуемые переменные-значения типа:

Set: UID=$uid

_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#7

Wapo @ Пт Окт 31, 2014 14:33 писал(а):
А не пробовали в сам call-файл добавить требуемые переменные-значения типа:

Set: UID=$uid


Нет, кстати, спасибо за идею.

Попробовал Gosub, всё замечательно работает, макрос стал не нужен, аргументы передаются сразу в нужный контекст где можно использовать всё, что душа пожелает.

Огромное спасибо Wapo, virus_net!

Тему можно закрывать.