четверг, 6 февраля 2025 г.

Переменные в OpenSIPS

В OpenSIPS несколько типов переменных. Их отличия в том, в какой части скрипта они видны, за чем закреплены, могут ли хранить несколько значений (как массив) и являются ли перезаписываемыми.

Переменные определяются по наличию знака "$" перед их именем.

Обращение к переменной имеет следующий синтаксис (зеленые поля опциональны): $(<context>name(subname)[index]{transformation})

name - имя переменной. Например: pvar, avp, ru, DLG_status.

subname - идентификатор конкретного значения переменной данного типа (тип задаётся именем). Например: hdr(From), avp(name).

index - индекс в массиве, если переменная поддерживает хранение нескольких значений. Индекс может быть отрицательным числом, где "-1" означает последнее добавленное значение, а "-2" - предпоследнее.

transformation - некоторые преобразования, которые можно применить к переменной. Например: обрезка, преобразование типа, вычисление длины и т.п. Преобразования могут быть каскадными, в этом случае каждое последующее преобразование осуществляется над результатом предыдущего. Список преобразований тут.

context - контекст, где переменная будет востребована. Есть два контекста: reply и request. Контекст reply может быть указан в failure маршруте для получения переменной из ответа на запрос. Контекст request может быть указан в маршруте reply для получения переменной из соответствующего запроса.


Примеры использования.

- только имя: $ru

- имя и идентификатор: $hdr(Contact)

- имя и индекс массива: $(ct[0])

- имя, идентификатор и индекс: $(avp(i:10)[2])

Контексты:

- переменная $(<request>ru) из маршрута reply получит значение Request-URI из запроса

- переменная $(<reply>hdr(Contact)) может быть использована в маршруте failure для получения информации из ответа


Типы переменных.

Скриптовые переменные - как следует из названия, эти переменные строго связаны с маршрутами скрипта. Они видны только из основных блоков маршрутизации, т.е. они не связаны с сообщениями или транзакциями, но связаны с самим процессом OpenSIPS (скриптовые переменные будут унаследованы маршрутами скрипта, выполняемыми этим же процессом). Эти переменные перезаписываемы и могут быть строковыми или числовыми. Могут содержать только одно значение, т.е. новое назначение перезапишет прежнее значение.

Т.е. это самые обычные переменные, вида $var(MyName)="Petya";

 

AVP - Attribute Value Pair - динамические переменные, которые связаны с конкретным сообщением или транзакцией (в случае stateful состояния). Полученное сообщение или созданная транзакция изначально не имеют привязанных AVP. Далее в процессе работы скрипта новые AVP могут создаваться вручную или через вызов функций. Все они будут автоматически прикреплены к соответствующему сообщению или транзакции. Эти AVP будут видны во всех маршрутах, где обрабатывается любое сообщение/транзакция: branch_route, failure_route, onreply_route (для этого маршрута нужно включить параметр TM в onreply_avp_mode). AVP могут быть перезаписаны или даже удалены. AVP могут содержать несколько значений - задание нового добавит значение перед предыдущим, логика FILO. При этом, указанием специального индекса "append" можно добавить значение в конец массива: $(avp(name)[append]) = "last value".

Ещё для задания AVP можно использовать специальный оператор ":=". С ним, если правое значение пустое (NULL), то AVP с этим именем будет удалено. А если не пустое, то значение AVP будет полностью перезаписано.

Например:

$avp(name) = "Petya";

$avp(name) = "Gena";

Теперь у нас хранится два значения ("Gena","Petya")

xlog("Вывод без индекса: $avp(name)\n");

Это выведет последнее значение "Gena"

$avp(name) = NULL;

Это удалит последнее значение. Если значение одно, то удалит переменную.


Псевдо переменные (PV) - это переменные, обеспечивающие доступ к информации из обрабатываемых сообщений SIP (заголовки, RURI, SDP и т.д.) или к внутренней информации OpenSIPS (таймеры, PID, коды завершения и т.д.). В зависимости от того, какую информацию они предоставляют, PV либо привязаны к сообщению, либо ни к чему (глобальны). Большинство из псевдо переменных предназначены только для чтения. Могут возвращать несколько значений, но в основном одно. Полный список PV тут.


Комментариев нет:

Отправить комментарий