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

Не удается передать переменную между каналами (Asterisk 1.6.2.9)

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

Не удается передать переменную между каналами (Asterisk 1.6.2.9)


Пробовал функции ImportVar, SHARED... Ничего не вышло.

Решил, что проще всего будет использовать глобальные переменные.

Задаю так:

[globals]
gsmname=XXX

Потом, в одном из экстеншенов, в контексте [default], пытаюсь делать Verbose или Set для этой переменной. А она пустая...

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

Помогите пожалуйста. Хотя бы ссылкой на подходящую документацию... http://voip.rus.net/tiki-index.php?page=Asterisk+Variables - не помогает - не работает ничего из описанного там...


Вот мой план (это дополнительный план в отдельном файле, подключенный через include, так как накручен FreePBX).
Т.е. может мой [globals] не канает?..


[globals]
gsmname=xxxXXX

[general]
autofallthrough=no

[default]

;Первая нога (начало). Переводит звонок на сторону, откуда он потом приходит в экстеншн 17081 - где мне нужно получить значение переменной gsmname, установленное в 17079
exten => 17079,1,Answer
exten => 17079,n,Verbose(${gsmname})
exten => 17079,n,Set(gsmname=/data/palmira)
;exten => 17079,n,Dial(SIP/1000@192.168.3.168)
exten => 17079,n,Hangup()

;Вторая нога - просто пишет звонок
exten => 17080,1,Answer
exten => 17080,n,MixMonitor(/zstorage/Asterisk_records/gsmbase/${wavname}_GSM.wav)
exten => 17080,n,Wait(999)
exten => 17080,n,StopMonitor()
exten => 17080,n,Hangup()


;Первая нога - окончание Wink
exten => 17081,1,Answer
exten => 17081,n,Verbose(${gsmname})
exten => 17081,n,Playback(${gsmname})
exten => 17081,n,Hangup()
#2

http://www.voip-info.org/wiki/view/Asterisk+cmd+Set
Почитайте там про глобальные переменные.
А вообще есть же синтаксис типа _VARNAME или __VARNAME

_________________
Asterisk 1.4.30 @ Ubuntu 9.04 + Cisco MC3810 + NEC NEAX 2000IPS + Polycom IP Phones
#3

Увы, но не всегда проходит конструкция с подчеркиваниями.
Мне на одном из проектов пришлось делать так:

exten => s,n,Set(GLOBAL(Who${CALLERID(num)})=${CALLERID(num)})

т.е. создавать некий пул глобальных переменных. Опасения за память были, но там нет интенсивной нагрузки, так что работает.

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

Конструкция с подчеркиванием, вроде бы, только для каналов типа Local...
А у меня Dial из канала с переменной уходи по SIP...

А вот Set(GLOBAL... помогло! Я где-то видел синтаксис Set(Global... и он не работал... Вот такое западло...

Спасибо большое за ваши ответы!
#5

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

Вот тут как раз самое любопытное...

У меня каналы соединены вначале 17079 и 17080 - и переменные они друг у друга видят.
Но звонок из 17079 уходит на всякие VoIP-GSM шлюзы и возвращается на 17081.
Таким образом - кто с кем соединен получается?))
Должна ли переменная из 17079 или 17080 быть видна (наследована посредством подчеркивания) в 17081?
#7

дык просто всё...

_VAR - установленное на первом леге может быть _прочитана_ на втором леге
__VAR - устанавленная на первом леге видна на всех созданных легах ( одного астериска ).

если звонок с астериска уходит в gsm и потом приходит по gsm опять в астериск, в том месте где звонок пришел из gsm видно ниче не будет.

SHARED вроде как тоже прекрасно работает но там надо знать имя канала для которого переменную ставить\читать

p.s. может в базе эти переменные хранить и не париться ?
#8

В базе ни к чему.

У меня задача - прогнать через GSM канал базу wav файлов...

Потому где звонок у меня уходит - он уходит, чтобы пройти через GSM.

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

Такие дела..
#9

А давайте подробнее задачу рассмотрим? В деталях, так сказать ) Может можно ее и по другому решить.
_________________
Asterisk 1.4.30 @ Ubuntu 9.04 + Cisco MC3810 + NEC NEAX 2000IPS + Polycom IP Phones
#10

Задача такова:

Дано:
Каталог wav файлов (1000 штук).

Требуется:
Получить те же wav файлы, после прогона их через GSM канал.
#11

А смысл?)))
#12

Для последующего анализа и адаптации специального ПО. ПО - для всестороннего анализа звукового сигнала.
#13

Тогда чем не устраивает база данных? Инициализируется звонок, делается запись в БД => принимается звонок, считывается запись из БД. Ну и т. д., по кругу.
#14

Какая разница - база - или обычный каталог? Я считываю файлы из одного каталога и пишу результаты в другой каталог... Мне база ни к чему.
#15

База, чтобы передать имя файла.
#16

Не понял я что-то... Как тут база поможет...
#17

Элементарно. Вы же имеете какую-то переменную с именем передаваемого файла? Соответственно, проигрываете его в канал:
Код:
same => n,Playback(/ПУТЬ_К_ФАЙЛУ/${FILENAME})

Кто мешает (хрен с ним, пусть будет AstDB) сделать:
Код:
same => n,Set(DB(RECORD/FILENAME)=${FILENAME}) ;Записываем в ключ RECORD/FILENAME имя файла
same => n,Playback(/ПУТЬ_К_ФАЙЛУ/${FILENAME})

А в принимающем канале в Record сделать:
Код:
same => n,Record(/НОВЫЙ_ПУТЬ_К_ФАЙЛУ/${DB(RECORD/FILENAME)}:gsm)
#18

Так вот - откуда принимающему каналу знать имя файла?)
Если это просто входящий SIP звонок...

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

Смысл в том - что на одном конце канала мне нужно было проигрывать файл, а на другом - записывать звонок.
При чем между концами канала, в цепочке, должен был быть GSM канал.
#19

Я уже перестал понимать, кто над кем глумится?
У вас Астериск физически один? База одна? Диалплан вы пишете? Не можете придумать 2001 способ определить, что это вы сами себе позвонили? Ну тогда я не знаю... Прошли этот шаг (мы знаем, что себе звоним сами): сложно положить значение в базу и забрать его? Или конкретизируйте проблему, или прекращайте издеваться. Я уже и кусок диалплана выложил... даже не знаю, что дальше делать.

Added after 6 minutes:

Уффф. Успокоился)))) Если совсем непонятно, вот (редактирую ваш код):
Код:
exten => 17079,1,Answer
exten => 17079,n,Set(DB(REC/GSMNAME)=/data/palmira)
;exten => 17079,n,Dial(SIP/1000@192.168.3.168)
exten => 17079,n,Hangup()

;Вторая нога - просто пишет звонок
exten => 17080,1,Answer
exten => 17080,n,MixMonitor(/zstorage/Asterisk_records/gsmbase/${DB(REC/GSMNAME)}_GSM.wav)
exten => 17080,n,Wait(999)
exten => 17080,n,StopMonitor()
exten => 17080,n,Hangup()


;Первая нога - окончание
exten => 17081,1,Answer
exten => 17081,n,Verbose(${DB(REC/GSMNAME)})
exten => 17081,n,Playback(${DB(REC/GSMNAME)})
exten => 17081,n,Hangup()


Так понятно?
#20

Вот я один из 2001 способов и использовал - глобальная переменная... А базы тут вообще ни при чем Wink Проблема давно решена и у меня уже файлы перегоняются...
Но спасибо за помощь в любом случае.

Added after 2 minutes:

Ну уж если принципиальный интерес...
То так, по-моему, не выйдет, как вы предлагаете:

;Первая нога - окончание
exten => 17081,1,Answer
exten => 17081,n,Verbose(${DB(REC/GSMNAME)})
exten => 17081,n,Playback(${DB(REC/GSMNAME)})
exten => 17081,n,Hangup()

- ибо в этом экстеншене ничего не будет известно о переменной ${DB(REC/GSMNAME)} - ибо это уже экстеншен другого канала...
(по крайней мере с обычными переменными этот номер не проходил - они были видны только в первых двух экстеншенах)

Added after 2 minutes:

Вот финальный диал-план. Если интересно.


exten => 17079,1,Answer
exten => 17079,n,Set(GLOBAL(gsmname)=${inputwav})
exten => 17079,n,Dial(SIP/1000@192.168.3.168)

exten => 17080,1,Answer
exten => 17080,n,MixMonitor(/zstorage/Sound_base/patrick_result/${wavname}_GSM.w av)
exten => 17080,n,Wait(300)
exten => 17080,n,StopMonitor()
exten => 17080,n,System(rm /gsmbase/lock/callgen.lock)
exten => 17080,n,Hangup()



exten => 17081,1,Answer
exten => 17081,n,Wait(5)
exten => 17081,n,Playback(${gsmname})
exten => 17081,n,System(rm /gsmbase/lock/callgen.lock)
exten => 17081,n,Hangup()
#21

Всё-таки вы не понимаете, в чем суть базы данных. Вообще, уже плакать хочется. Какая нафиг переменная? Это запись в БД, и она будет видна ОТОВСЮДУ!!! ВООБЩЕ ОТОВСЮДУ!!! Её предел видимости в нормальных условиях - весь ваш сервер, все экстеншены, все контексты, каналы любого типа. ВООБЩЕ ПОХЕР!!!

З.Ы. Вообще, в нашем диалоге идиотом оказался я. Потому что все остальные уже болт забили, а я с вами еще цацкаюсь.
#22

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

Все равно - спасибо за участие. И не плачьте.