...
Пример 3. Синхронизация переменных между плечами вызова.
Схема:
"TRUNK_IN(MODTABLE_IN)" нужно заменить на "TRUNK_IN(MODTABLE_IN_TRUNK_IN)", "TRUNK_OUT" заменить на "TRUNK_OUT(MODTABLE_OUT_TRUNK_OUT)"
В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. Из TRUNK_IN приходит INVITE с заголовком Route. Требуется, используя только переменную var1, скопировать значение заголовка Test_header из INVITE на первом плечаплече, вставить его в заголовок Test_header_INVITE в ответе 180 на втором плече и скопировать значение заголовка Test_header из ответа 200 на втором плече и вставить его в заголовок Test_header_200 в запрос BYE на первом плече.
| Блок кода | ||
|---|---|---|
| ||
vesbc# vesbc# configure vesbc(config)# esbc #Создание таблицы модификаторов MODTABLE_IN_TRUNK_IN для модификаций на первом плече: vesbc(config-esbc)# mod-table sip MODTABLE_IN_TRUNK_IN vesbc(esbc-mod-table)# #Добавление в таблицу модификаторов правила copy для копирования значения заголовка Route в переменную route: vesbc(esbc-mod-table)# mod 0 copy vesbc(esbc-mod-table-modification)# #Выбор запроса, в котором будет использоваться модификатор copy (в данном случае INVITE): vesbc(esbc-mod-table-modification)# sip method type Invite #Указать название заголовка, из которого необходимо копировать значение (в данном случае Test_header): vesbc(esbc-mod-table-modification)# sip header-pattern Test_header #Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках: vesbc(esbc-mod-table-modification)# value-pattern '(.+)' #Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+): vesbc(esbc-mod-table-modification)# variable-str 'var1' vesbc(esbc-mod-table-modification)# exit #Добавление в таблицу модификаторов правила add для добавления заголовка Test_header_180 в BYE: vesbc(esbc-mod-table)# mod 1 add #Выбор запроса, в котором будет использоваться модификатор add (в данном случае BYE): vesbc(esbc-mod-table-modification)# sip method type Bye #Название добавляемого заголовка: vesbc(esbc-mod-table-modification)# header name Test_header_180200 #Указать значение заголовка(переменная var1): vesbc(esbc-mod-table-modification)# header value '${var1}' vesbc(esbc-mod-table-modification)# exit vesbc(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящему транку TRUNK_IN: vesbc(config-esbc)# trunk sip TRUNK_IN vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN_TRUNK_IN vesbc(config-esbc-trunk-sip)# exit #Создание таблицы модификаторов MODTABLE_IN_TRUNK_OUT для модификаций на втором плече: vesbc(config-esbc)# mod-table sip MODTABLE_IN_TRUNK_OUT vesbc(esbc-mod-table)# #Добавление в таблицу модификаторов правила copy для копирования значения заголовка Test_header в переменную var1: vesbc(esbc-mod-table)# mod 0 copy vesbc(esbc-mod-table-modification)# #Выбор ответа, в котором будет использоваться модификатор copy (в данном случае 180200): vesbc(esbc-mod-table-modification)# sip response-pattern 180200 #Указать название заголовка, из которого необходимо копировать значение (в данном случае Test_header): vesbc(esbc-mod-table-modification)# sip header-pattern Test_header #Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках: vesbc(esbc-mod-table-modification)# value-pattern '(.+)' #Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+): vesbc(esbc-mod-table-modification)# variable-str 'var1' vesbc(esbc-mod-table-modification)# exit #Добавление в таблицу модификаторов правила add для добавления заголовка Test_header_INVITE в 180: vesbc(esbc-mod-table)# mod 1 add #Выбор ответа, в котором будет использоваться модификатор add (в данном случае 180): vesbc(esbc-mod-table-modification)# sip response-pattern '180' #Название добавляемого заголовка: vesbc(esbc-mod-table-modification)# header name Test_header_INVITE #Указать значение заголовка(переменная var1): vesbc(esbc-mod-table-modification)# header value '${var1}' vesbc(esbc-mod-table-modification)# exit vesbc(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящему транку TRUNK_OUT: vesbc(config-esbc)# trunk sip TRUNK_OUT vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN_TRUNK_OUT #Применить и подтвердить изменения: vesbc(config-esbc-trunk-sip)# do commit Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds. vesbc(config-esbc-trunk-sip)# do confirm Configuration has been confirmed. Commit timer canceled. |
После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE, значение заголовка Test_header копируется в переменную var1:
| Блок кода | ||
|---|---|---|
| ||
INVITE sip:23002@192.168.113.195:5060 SIP/2.0 Via: SIP/2.0/UDP 192.168.113.190:5061;rport;branch=z9hG4bK-1151121-1-1 From: "24001" <sip:24001@192.168.113.195>;tag=1 To: "23002" <sip:23002@192.168.113.195:5060> Call-ID: 1-1151121@192.168.113.190 Cseq: 1 INVITE Contact: <sip:24001@192.168.113.190:5061> Max-Forwards: 70 Subject: Performance Test Allow: INVITE, ACK, BYE, CANCEL Content-Type: application/sdp Test_header: INVITE Supported: timer Content-Length: 142 [SDP]... |
Модифицированный ответ 180 Ringing, отправленный с TRUNK_OUT на TRUNK_IN содержит заголовок Test_header_INVITE со значением из переменной var1:
| Блок кода | ||
|---|---|---|
| ||
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.168.113.190:5061;rport=5061;received=192.168.113.190;branch=z9hG4bK-1152099-1-1
Call-ID: 1-1152099@192.168.113.190
From: "24001" <sip:24001@192.168.113.195>;tag=1
To: "23002" <sip:23002@192.168.113.195>;tag=e782be58-9527-409a-8c9f-de4f32d8fdb2
CSeq: 1 INVITE
Contact: <sip:23002@192.168.113.195:5060;transport=udp>
Allow: INVITE, ACK, BYE, CANCEL, UPDATE
Warning: warning
Test_header_INVITE: INVITE
Content-Length: 0
[SDP]... |
Далее с TRUNK_OUT на TRUNK_IN приходит ответ 200 OK, значение заголовка Test_header копируется в переменную var1:
| Блок кода | ||
|---|---|---|
| ||
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPjf8b5024e-425d-434c-83ea-e315a365644a
From: "24001" <sip:24001@192.168.113.195>;tag=9ca5b465-69ee-4d19-8891-6d99cc8d7b2c
To: "23002" <sip:23002@192.168.113.190>;tag=1
Call-ID: e5e140176f2119a643b0504e9afa69bb
CSeq: 1446 INVITE
Contact: <sip:23002@192.168.113.190:5063;transport=UDP>
Allow: INVITE, ACK, BYE, CANCEL, UPDATE
Test_header: 200 OK
Warning: warning
Min-Expires: 300
Supported: 100rel, timer, replaces, qwe
Require: 100rel, answermode
Content-Type: application/sdp
Content-Length: 166
[SDP]... |
Модифицированный запрос запрос BYE, отправленный с TRUNK_IN На на TRUNK_OUT содержит заголовок INVITETest_header_Route 200 со значением заголовка Route из запроса INVITEпеременной var1:
| Блок кода | ||
|---|---|---|
| ||
BYE sip:23002@192.168.113.190:5063;transport=UDP SIP/2.0 Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPja999d007z9hG4bKPj091e9a98-7d8754a1-46f74631-98caa024-dcc40ee3188e6fe968fa0ba5 Max-Forwards: 70 From: "24001" <sip:24001@192.168.113.195>;tag=a25bc5579ca5b465-78fd69ee-4a9c4d19-871d8891-87099fbfc9ce6d99cc8d7b2c To: "23002" <sip:23002@192.168.113.190>;tag=141 Call-ID: 38a3fddd817f6b738707b21ee5fe1c7de5e140176f2119a643b0504e9afa69bb CSeq: 105881447 BYE Allow: INVITE, ACK, BYE, CANCEL INVITETest_header_Route200: <sip:192.168.113.195>200 OK Content-Length: 0 [SDP]... |
...
