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

Несохранненые переменные в dialplan после звонка [закрыт]

0

Здраствуйте! Я прошу прощение за мое ламерство, но я не знаю как заставить глобальные переменные сохранить свое значение после звонка. Теоретически я хотел создать что-то вроде rrmemory. В CLI поставил значение dialplan set global I 1 , далее по задумке после окончания звонка переменная I приобретает значение 2 и при новом звонке свисток должен набрать следующий номер и записать новое значение для I и.т.д. Если решение не удачна, можете посоветовать что-нибудь похожее без использования рандома?

[from-phone]
exten => s,1,Answer()
exten => s,n,GotoIf($[${I}=1]:tax1)
exten => s,n,GotoIf($[${I}=2]:tax2)
exten => s,n,GotoIf($[${I}=3]:tax3)
exten => s,n,GotoIf($[${I}=4]:tax4)

exten => s,n(tax1),Set(GLOBAL(I)=2)
same => n,Dial(Dongle/dongle0/111)

exten => s,n(tax2),Set(GLOBAL(I)=3)
same => n,Dial(Dongle/dongle0/222)

exten => s,n(tax3),Set(GLOBAL(I)=4)
same => n,Dial(Dongle/dongle0/333)

exten => s,n(tax4),Set(GLOBAL(I)=1)
same => n,Dial(Dongle/dongle0/333)
удалить переоткрыть спам изменить тег редактировать

спросил 2013-10-17 22:47:10 +0400

firedark Gravatar firedark
85 4 4

Comments

После изменения констркции на exten => s,n,Goto(tax${I}) вроде работает, кстати инициализация переменной из CLI это шлишком временное решение, как элегантнее сделать инициализацию на "первое выполнение" что-бы дальше не мешал последуищей работе?

firedark ( 2013-10-18 02:40:58 +0400 )редактировать

1 Ответ

1

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

но вам явно нехватает навыка в программировании. вы переменную забыли инициалировать(тоесть учесть когда ${I} пустое)

а также вам надо ${GLOBAL(I)} наверно брать.

еще можно asterisk db использовать

и да, еще подумайте что будет в случае одновременного выполнения потоков и в случае когда до конца дойдет.

кстати конструкцию выше можно переписать вмнесто

exten => s,n,GotoIf($[${I}=1]:tax1)
exten => s,n,GotoIf($[${I}=2]:tax2)
exten => s,n,GotoIf($[${I}=3]:tax3)
exten => s,n,GotoIf($[${I}=4]:tax4)

еквивалент

exten => s,n,Goto(tax${I})
ссылка удалить спам редактировать

ответил 2013-10-18 00:31:43 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2013-10-18 00:32:00 +0400

Comments

Опыта в программированние конечно не хватает, но я ведь перед выполнением в CLI инициализировал переменную с помощью dialplan set global I 1. Код расчитан на 1 поток, в конце ведь I=1, так что теоретически при новом звонке он должен начинать с tax1.

firedark ( 2013-10-18 00:50:46 +0400 )редактировать

асткриск моежт упасть например. короче, слечай неинициализированной переменной надо определять.

meral ( 2013-10-18 15:16:42 +0400 )редактировать

уже убедился что так не следует делать :) как изящнее инициализировать переменную чтобы она потом не мешала при повторном выполнении цикла?

firedark ( 2013-10-18 16:07:19 +0400 )редактировать

ну неициализированная она будет пустой. выше написано как изящнее.

meral ( 2013-10-18 21:32:34 +0400 )редактировать

Все сделал, спасибо. Исправил кусок кода на: exten => s,2,GotoIf($["${GLOBAL(I)}" = ""]?3:4) exten => s,3,Set(GLOBAL(I)=1) exten => s,4,Goto(taxi${I})

firedark ( 2013-10-19 03:18:47 +0400 )редактировать

зачем? достаточно было просто метку tax( бзе индекса) поставить перед любым из выборов. когда переменная неопределена будет прыгать на tax

meral ( 2013-10-19 03:36:59 +0400 )редактировать

Спасибо, не знал что и так можно, учту. Кстати как увидеть в астериске какой код Q.931 получает GSM шлюз от мобильного телефона?

firedark ( 2013-10-19 03:55:12 +0400 )редактировать

если chan_dongle - включить дебаг. а еси сип - то спросите у производителя шлюза

meral ( 2013-10-19 17:57:13 +0400 )редактировать

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

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

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

Статистика

Задан: 2013-10-17 22:47:10 +0400

Просмотрен: 508 раз

Обновлен: Oct 18 '13

Похожие вопросы:

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