Використання змінних в Asterisk

Asterisk можуть використовуватися як глобальні змінні, так і змінні специфічні для кожного каналу, які можуть бути використані як аргументи для команд в плані набору. Для змінних, що використовуються в плані набору (extensions.conf), використовується наступний синтаксис:

деfoo- ім'я змінної. Іменем змінної може бути цифробуквенний рядок, який повинен починатися з літери. Змінні, визначені користувачами, не є реєстрозалежними $ і $ посилаються на ту саму змінну. Але змінні, які визначаються самим Asterisk, є реєстрозалежними змінна $ працюватиме, але $ - не буде.

Існує три типи змінних: глобальні, змінні специфічні для кожного каналу та змінні оточення.

  • Глобальнізмінні можуть бути визначені або в розділі [globals] файлу конфігурації extensions.conf або використовуючи команду SetGlobalVar у плані набору. Якщо змінна одного разу визначена, вона може бути використана для будь-якого каналу в будь-який час.
  • Змінні специфічні для кожного каналузадаються за допомогою Set (команда SetVar застаріла). Кожен канал використовує ізольований простір для імен змінних, отже, для різних викликів не буде колізій у значеннях змінної з одним і тим же ім'ям і змінна буде автоматично очищена, коли виклик по якомусь каналу буде завершено.
  • Змінні оточеннязабезпечують доступ з Asterisk до змінних оточення unix. Їх список можна знайти нижче у цій сторінці.
Якщо Ви поставите змінну для будь-якого каналу з аналогічним ім'ям, як у існуючої глобальної змінної (запам'ятайте: певні користувачем змінніреєстронезалежні) то, посилаючись на це ім'я змінної в команді, Ви отримаєте значення, яке Ви визначили для цієї "канальної" змінної (а не значення глобальної змінної). Наприклад, подивіться самі, що вийде, якщо ми в контексті "FooTest" з одним екстеншеном 100, зробимо такі дії:

(Зауваження: використання команди NoOp допоможе нам відстежити наші дії та значення змінних.) Якщо ви здійсните виклик на екстеншен 100 у контексті FooTest, і перед вами консоль Asterisk, яка відображає докладну інформацію про те, що відбувається, то Ви побачите приблизно таку інформацію:

- Executing SetGlobalVar("Zap/1-1", "FOO=5") у новому стані - Setting global variable 'FOO' to '5' - Executing NoOp("Zap/1-1", "5") in new stack - Executing NoOp("Zap/1-1", "5") in new stack - Executing Set("Zap/1-1", "foo=8") in new stack - Executing NoOp("Zap/1-1", "8") in new stack - Executing NoOp("Zap/1-1", "8") in new stack

Ми бачимо, що після виконання команди SetGlobalVar, змінні $ і $ повертають значення глобальної змінної з наданим значенням 5. Після виконання команди Set, глобальна змінна "foo" перекривається канальною змінною "foo"; Обидві змінні $ і $ (насправді це та сама змінна) мають значення 8. Тим не менш, значення глобальної змінної залишається незмінним і рівним 5, і при використанні її в інших каналах буде отримано значення глобальної змінної $, яке як і раніше дорівнює п'яти.

Спадкування змінних специфічних для каналів

Якщо ми в команді Set приєднаємо спереду до імені змінної одиночний символ _ , то ця змінна буде успадкована каналом, який буде створено основним каналом, наприклад, при використанні командиDial (Local /.); . Якось успадкована, ця змінна не буде далі успадкована. У випадку, якщо ми приєднаємо спереду до імені змінної два символи _, змінна успадковуватиметься необмежену кількість разів.(Працює тільки для CVS HEAD, не підтримується в Asterisk 1.0.9.)

Зверніть увагу, що якщо нам потрібно отримати значення змінної, то при посиланні на її ім'я немає необхідності у провідних символах підкреслення.

[TestInherit] exten => 100,1,Set( __ FOO=5) exten => 100,2,Dial(Local/test@CheckInherit) exten => test,1,NoOp($)

Як результат, змінна FOO буде успадкована. Без символів підкреслення, у новому каналі типу local ця змінна буде визначено.

як результат отримаємо:

— Executing Set("SIP/oberon-365e", "FEE=fee") у новому стані — Executing Set("SIP/oberon-365e", "_FIE=fie") in new stack — Executing Set("SIP/oberon-365e", "__FUM=fum") in new stack - Executing Dial("SIP/oberon-365e", "Local/105") in new stack - Called 105 - Executing NoOp("Local/105@default-7263,2", "") in new stack - Executing NoOp("Local/105@default-7263,2", "") in new stack - Executing NoOp("Local/105@default-7263,2", "fum") in new stack - Executing Dial("Local/105@default-7263,2", "Local/106") in new stack - Called 106 - Executing NoOp("Local/106@default-49be,2", "") in new stack - Executing NoOp("Local/106@default-49be, 2", "") in new stack — Executing NoOp("Local/106@default-49be,2", "fum") in new stack

(Цей приклад не буде правильно працювати у версіях до релізу Asterisk 1.2.)

Зумовлені змінні специфічні для каналів

Змінні, що використовуються різними програмами

Змінні, специфічні для макросів

Змінні оточення

Ви можете отримати доступ до змінних оточення unix, використовуючи наступний синтакс:

  • $ : поточний CLI prompt? для Asterisk .
  • $ : ім'я файлу, під яким було збережено останній запис, зроблений командою Record (доступна в CVS > 2004-03-21)

Функції для роботи з рядками

Розмір рядка

повертає розмір рядкаfoo. Наприклад,

перша команда NoOp має показати значення 5 (розмір рядка "fruit"). Друга команда NoOp має показати значення 4 (розмір рядка "pear").

Цей метод дозволяє проводити чудову перевірку на порожні рядки і на змінні, що містять NULL.

повертає підрядок рядкаfoo, починаючи зі зміщенняoffsetі обмежуючи рядок, що повертається розміром уlengthсимволів.

  • Якщо значенняoffsetнегативне, то зміщення буде відраховуватися не від початку рядка, а від кінця.
  • Якщо значенняlengthпропущено або негативне, то розмір рядка, що повертається, не обмежується і буде повернуто весь рядок, починаючи зі зміщенняoffset.
Приклади:

exten => _NXX.,1,Set(areacode=$) - отримуємо перші 3 цифри зі змінної $ exten => _516XXXXXXX,1,Dial($) - отримуємо значення змінної $ після 3 цифри exten => 100,1,Set(whichVowel=4) exten => 100,2,Set(foo=AEIOU:$:1) - змінна $ матиме значення 'U'

З'єднання рядків

Для з'єднання двох рядків просто напишіть директиву, як показано нижче:

Математичні операції зі змінними

Для математичних процесів зі змінними, наприклад, інкремент, множення, додавання. Просто напишіть:

exten => s,1,Set(SOMEVAR=$[$ + 1]) ; інкремент exten => s, 2, Set (SOMEVAR = $ [2 * $]); множення і т.д.Ви повинні використовувати прогалини у виразах, як показано вище.

Починаючи з релізу Asterisks 1.2, також доступна функція MATH.