Возникают задачи, для решения которых необходимо произвести различные манипуляции с набранным пользователем номером - удалить первую набранную цифру, либо добавить несколько цифр.
Либо заменить набранный номер полностью другим. Для этого в ESR-12V\15V уже есть встроенный функционал. Рассмотрим на примере подробнее.
Дано: настроен функционал PBX на ESR. Настроен и зарегистрирован на внутреннем SIP-сервере пользователь. ESR связан с еще одной IP PBX sip транком.
Необходимо: часто для выхода в город используют префикс 9. Необходимо при наборе пользователем телефонного номера 9555 удалить префикс 9 и передать вызов на встречную IP PBX с номером 555.
Решение: для решения задачи создадим два контекста - в одном sip_phone будет происходить анализ набранного номера для связи внутри встроенной в ESR IP PBX. Другой trunk_to_SIP_server необходим для
маршрутизации исходящих вызовов в sip транк на встречную IP PBX. В контексте sip_phone выполним модификацию номера и отправим в контекст trunk_to_SIP_server для дальнейшего анализа цифр номера.
Модификацию номера будем производит с помощью переменной ${EXTEN}, которая содержит в себе ранее набранный пользователем номер.
Переменная ${EXTEN} в общем случае имеет полный синтаксис ${EXTEN:x:y}, где x – начальная позиция и y – количество возвращаемых цифр. Чтобы удалить первую цифру номера, надо выполнить ${EXTEN:1}.
pbx
ruleset sip_phone
rule 40
pattern '9555,1,Goto(trunk_to_SIP_server,${EXTEN:1},1)'
enable
exit
rule 41
pattern '9555,2,Hangup()'
enable
exit
exit
ruleset trunk_to_SIP_server
rule 30
pattern '555,1,Dial(SIP/${EXTEN}@203.0.113.1)'
enable
exit
rule 31
pattern '555,2,Hangup()'
enable
exit
exit
enable
exit
Посмотрим результат предложенной конфигурации на входе ESR
esr-12v# monitor gigabitethernet 1/0/1 protocol udp destination-port 5060
10:12:41.518418 00:15:65:be:19:a8 > e4:5a:d4:a1:8e:6a, ethertype IPv4 (0x0800), length 1086: (tos 0x68, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 1072)
192.0.2.2.5060 > 192.0.2.1.5060: SIP, length: 1044
INVITE sip:9555@192.0.2.1:5060 SIP/2.0
Via: SIP/2.0/UDP 192.0.2.2:5060;branch=z9hG4bK3282389953
From: "111" <sip:111@192.0.2.1:5060>;tag=3596110097
To: <sip:9555@192.0.2.1:5060>
Call-ID: 0_2748444977@192.0.2.2
CSeq: 2 INVITE
Contact: <sip:111@192.0.2.2:5060>
Authorization: Digest username="111", realm="realm", nonce="29061de5", uri="sip:9555@192.0.2.1:5060", response="d3792f35a1317274c3df1ce457d5250f", algorithm=MD5
Content-Type: application/sdp
Allow: INVITE, INFO, PRACK, ACK, BYE, CANCEL, OPTIONS, NOTIFY, REGISTER, SUBSCRIBE, REFER, PUBLISH, UPDATE, MESSAGE
Max-Forwards: 70
User-Agent: Yealink SIP-T21P_E2 52.80.14.2
Allow-Events: talk,hold,conference,refer,check-sync
Supported: replaces
Content-Length: 302
v=0
o=- 20022 20022 IN IP4 192.0.2.2
s=SDP data
c=IN IP4 192.0.2.2
t=0 0
m=audio 11940 RTP/AVP 9 0 8 18 101
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=ptime:20
a=sendrecv
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
И на выходе ESR
esr-12v# monitor gigabitethernet 1/0/4 protocol udp destination-port 5060
10:21:29.179613 e4:5a:d4:a1:8e:6d > a8:f9:4b:ad:22:35, ethertype IPv4 (0x0800), length 882: (tos 0x0, ttl 64, id 45714, offset 0, flags [none], proto UDP (17), length 868)
203.0.113.2.5060 > 203.0.113.1.5060: SIP, length: 840
INVITE sip:555@203.0.113.1 SIP/2.0
Via: SIP/2.0/UDP 203.0.113.2:5060;branch=z9hG4bK1a697fd0
Max-Forwards: 70
From: "111" <sip:111@203.0.113.2>;tag=as0f1674ca
To: <sip:555@203.0.113.1>
Contact: <sip:111@203.0.113.2:5060>
Call-ID: 0edb5a77624902181692f2ba3d19a90e@203.0.113.2:5060
CSeq: 102 INVITE
User-Agent: ESR-12V
Date: Thu, 24 Apr 2025 10:21:13 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces
Content-Type: application/sdp
Content-Length: 299
v=0
o=root 1403825271 1403825271 IN IP4 203.0.113.2
s=ESR-12V
c=IN IP4 203.0.113.2
t=0 0
m=audio 10250 RTP/AVP 8 3 0 101
a=rtpmap:8 PCMA/8000
a=rtpmap:3 GSM/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv
Также доступны более сложные варианты модификации. Например
pattern '9555,1,Goto(trunk_to_SIP_server,111${EXTEN:3},1)' заменит первые 3 цифры номера единицами, получится 1115.
pattern '9555,1,Goto(trunk_to_SIP_server,${EXTEN:2:2},1)' отсчитает две цифры и вернет две следующие, получится 55.
pattern '9555,1,Goto(trunk_to_SIP_server,${EXTEN:-4:2},1)' отсчитает четыре цифры с конца номера и вернет две,получится 95
interface gigabitethernet 1/0/1
description "LAN"
ip firewall disable
ip address 192.0.2.1/24
exit
interface gigabitethernet 1/0/4
ip firewall disable
ip address 203.0.113.2/24
exit
pbx
ruleset sip_phone
rule 40
pattern '9555,1,Goto(trunk_to_SIP_server,${EXTEN:1},1)'
enable
exit
rule 41
pattern '9555,2,Hangup()'
enable
exit
exit
ruleset trunk_to_SIP_server
rule 30
pattern '555,1,Dial(SIP/${EXTEN}@203.0.113.1)'
enable
exit
rule 31
pattern '555,2,Hangup()'
enable
exit
exit
profile sip_phone
client friend
codec allow g711a
codec allow g711u
codec allow g722
codec allow g726
nat comedia
qualify 10000
ruleset sip_phone
exit
profile trunk_to_SIP_server
type external
client friend
codec allow g711a
codec allow g711u
security level invite-port
nat comedia
qualify 10000
host-address 203.0.113.1
ruleset from_sip_server
exit
user 111
profile sip_phone
password encrypted CDE552
exit
enable
exit
