Не удается передать переменную между каналами (Asterisk 1.6.2.9)
Решил, что проще всего будет использовать глобальные переменные.
Задаю так:
[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()
;Первая нога - окончание
exten => 17081,1,Answer
exten => 17081,n,Verbose(${gsmname})
exten => 17081,n,Playback(${gsmname})
exten => 17081,n,Hangup()
Почитайте там про глобальные переменные.
А вообще есть же синтаксис типа _VARNAME или __VARNAME
_________________
Asterisk 1.4.30 @ Ubuntu 9.04 + Cisco MC3810 + NEC NEAX 2000IPS + Polycom IP Phones
Мне на одном из проектов пришлось делать так:
exten => s,n,Set(GLOBAL(Who${CALLERID(num)})=${CALLERID(num)})
т.е. создавать некий пул глобальных переменных. Опасения за память были, но там нет интенсивной нагрузки, так что работает.
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
А у меня Dial из канала с переменной уходи по SIP...
А вот Set(GLOBAL... помогло! Я где-то видел синтаксис Set(Global... и он не работал... Вот такое западло...
Спасибо большое за ваши ответы!
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
У меня каналы соединены вначале 17079 и 17080 - и переменные они друг у друга видят.
Но звонок из 17079 уходит на всякие VoIP-GSM шлюзы и возвращается на 17081.
Таким образом - кто с кем соединен получается?))
Должна ли переменная из 17079 или 17080 быть видна (наследована посредством подчеркивания) в 17081?
_VAR - установленное на первом леге может быть _прочитана_ на втором леге
__VAR - устанавленная на первом леге видна на всех созданных легах ( одного астериска ).
если звонок с астериска уходит в gsm и потом приходит по gsm опять в астериск, в том месте где звонок пришел из gsm видно ниче не будет.
SHARED вроде как тоже прекрасно работает но там надо знать имя канала для которого переменную ставить\читать
p.s. может в базе эти переменные хранить и не париться ?
У меня задача - прогнать через GSM канал базу wav файлов...
Потому где звонок у меня уходит - он уходит, чтобы пройти через GSM.
В итоге - у меня получается цепочка Asterisk - GSM - GSM - Asterisk. И на одном конце я проигрываю файл, а на другом - записываю звонок.
Переменную нужно было прокидывать для сопоставления имен файлов.
Такие дела..
_________________
Asterisk 1.4.30 @ Ubuntu 9.04 + Cisco MC3810 + NEC NEAX 2000IPS + Polycom IP Phones
Дано:
Каталог wav файлов (1000 штук).
Требуется:
Получить те же wav файлы, после прогона их через GSM канал.
| Код: |
| 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) |
Если это просто входящий SIP звонок...
Эта проблема и была решена глобальной переменной, в которую начальный канал сохранял имя обрабатываемого файла, потом отправлял звонок с астериска.
Когда звонок возвращался в астериск - он мог взять значение глобальной переменной...
Смысл в том - что на одном конце канала мне нужно было проигрывать файл, а на другом - записывать звонок.
При чем между концами канала, в цепочке, должен был быть GSM канал.
У вас Астериск физически один? База одна? Диалплан вы пишете? Не можете придумать 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() |
Так понятно?
Но спасибо за помощь в любом случае.
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()
З.Ы. Вообще, в нашем диалоге идиотом оказался я. Потому что все остальные уже болт забили, а я с вами еще цацкаюсь.
Потому глобальной переменной оказалось достаточно.
Все равно - спасибо за участие. И не плачьте.