На рис. 6.6 приведен пример установления соединения с использованием протокола Megaco/H.248 между двумя шлюзами типа Residential Gateway, управляемыми одним Softswitch. В этом примере вызывающий шлюз MG1 имеет IP-адрес 212.86.42.1, адрес вызываемого шлюза MG2 - 218.68.122.41, адрес контроллера шлюзов Softswitch - 216.44.88.1. Порт для связи по протоколу Megaco для всех трех устройств по умолчанию имеет номер 55555.
Таблица 6.5. Дополнительные наборы
|
Абонент А Шлюз MG1 Softswitch Шлюз MG2 Абонент B Рис. 6.6. Сценарий установления и разрушения соединения по протоколу Megaco/Н.248 |
В самом начале шлюз MG1 регистрируется в Softswitch при помощи команды ServiceChange. Использование нулевого контекста означает, что порт в настоящий момент не участвует ни в каком соединении, а использование идентификатора порта ROOT означает, что команда относится ко всему шлюзу, а не к какому-нибудь определенному порту:
|
|
|
|
MG1 to Softswitch: Megaco/1.0 [212.86.42.1] Transaction = 9998 { Context = - {
ServiceChange = ROOT {Services {
Method=Restart, Port=55555, Profile=ResGW/1.0}
}
}
Далее Softswitch подтверждает регистрацию шлюза:
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555
Reply = 9998 {
Context = - {ServiceChange = ROOT { Services {
Port=55555, Profile=ResGW/1.0} }
}
}
Шлюз имеет свободные аналоговые порты, которые должны быть запрограммированы для отслеживания изменения сопротивления абонентского шлейфа, когда абонент поднимет трубку, после чего шлюз должен передать абоненту акустический сигнал «Ответ станции».
Программирование производится при помощи команды Modify с соответствующими параметрами, причем программируется порт, находящийся в нулевом контексте. В команде указывается идентификатор порта (terminationId) - A4444, идентификатор информационного потока (streamId) - 1, транспортный адрес оборудования, передавшего команду - [216.44.88.1]:55555, специфицируется режим функционирования - дуплексный (SendReceive).
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555
Transaction = 9999 { Context = - {
Modify = A4444 { Media {
TerminationState {
BufferedEventHandling{Step,Process}
},
Stream = 1 {
LocalControl {
Mode = SendReceive, g/GainControl=2,; in dB, g/Encryption=xxx, g/EchoCancellation=G165, g/VoiceActDet=yes
}
}
},
Events = 2222 {glinesup/offhook} },
Signals {g/PlayTone{tone=dialtone}} }
}
}
На этом же этапе в шлюз может быть загружен план нумерации в дескрипторе Digit Map. В этом случае, после того как абонент поднимет трубку, шлюз должен передать ему акустический сигнал «Ответ станции» и начинать прием сигналов DTMF в соответствии с планом нумерации. Однако в нашем примере план нумерации будет загружен только после того, как абонент поднимет трубку.
Шлюз MG1 подтверждает выполнение команды Modify:
MG1 to Softswitch: Megaco/1.0 [212.86.42.1]:55555 Reply = 9999 {
Context = - {Modify}
}
Аналогичным образом программируется аналоговый порт шлюза MG2, в нашем примере имеющий идентификатор A5555. Далее шлюз MG1 обнаруживает, что абонент A поднял трубку, и извещает об этом событии Softswitch при помощи команды Notify.
MG1 to Softswitch: Megaco/1.0 [212.86.42.1]:55555 Transaction = 10000 { Context = - {
Notify = A4444 {ObservedEvents =2222 { 19990729T22000000:glinesup/offhook}}
}
}
Softswitch подтверждает получение команды Notify:
Softswitch to MG1: Megaco/1.0 [216.44.88.1]:55555 Reply = 10000 {
Context = - {Notify}
}
На следующем шаге Softswitch дает шлюзу инструкцию накапливать цифры номера вызываемого абонента в соответствии с выбранным планом нумерации. Кроме того, после получения первой цифры номера необходимо остановить передачу акустического сигнала «Ответ станции».
Softswitch to MG1: Megaco/1.0 [216.44.88.1]:55555 Transaction = 10001 { Context = - {
Modify = A4444 { Events = 2223 {
glinesup/onhook {
Action { DigitMap=Dialplan0 }
}
},
Signals { g/StopTone} },
DigitMap= Dialplan0{
(0T|00T|[17]xxx|8xxxxxxx|#xxxxxxx|*xx|91xxxxxxxxxx|9011x.T)} }
}
}
Шлюз подтверждает получение и этой команды Modify:
MG1 to Softswitch: Megaco/1.0 [212.86.42.1]:55555 Reply = 10001 {
Context = - {Modify}
}
Цифры номера вызываемого абонента накапливаются шлюзом MG1, после чего они сравниваются с планом нумерации и передаются в Softswitch.
MG1 to Softswitch:
Megaco/1.0 [212.86.42.1]:55555
Transaction = 10002 { Context = - {
Notify = A4444 {ObservedEvents =2223 {
19990729T22010001:g/tonesdt{tones=«16135551212»}}}
}
}
Полученное сообщение подтверждается шлюзом:
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555
Reply = 10002 {
Context = - {Notify}
}
Далее Softswitch анализирует цифры номера вызываемого абонента, полученные от шлюза MG1, и определяет, что соединение должно проходить через шлюз MG2, к которому подключен вызываемый абонент. К вновь образованному контексту в шлюзе MG1 добавляются при помощи команды Add физическое окончание (аналоговый абонентский интерфейс) A4444 и виртуальный порт (RTP-порт). Так как в этот момент шлюз, к которому прикреплен вызывающий абонент, не имеет информации о шлюзе MG2 (такой как IP-адрес, номер RTP-порта и поддерживаемые алгоритмы декодирования принимаемой речевой информации), то контроллер Softswitch предписывает шлюзу MG1 только принимать информацию (режим ReceiveOnly). Кроме того, Softswitch специфицирует в команде Add предпочтительные для использования алгоритмы кодирования.
|
|
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555
Transaction = 10003 { Context = $ { Add = A4444 { Media {
Stream = 1 { Events = 2224 {glinesup/onhook} }
}
},
Add = $ { Media {
Stream = 1 {
LocalControl {
Mode = ReceiveOnly, g/NetworkType = RTP/IP4,; g/MaxJitterBuffer=40,; in ms g/PreferredPacketization=30,; in ms g/PreferredPacketization=30,; in ms g/PreferredEncoders =[G723, PCMU], g/PreferredDecoders=[G723, PCMU], g/Gain=0; in dB
}
}
}
}
Softswitch указывает предпочтительные параметры в дескрипторе LocalControl, как это показано выше. В требовании, получаемом шлюзом от контроллера, отсутствуют дескрипторы Local и Remote, в которых от вызывающей стороны к вызываемой переносится вся адресная информация и сведения об используемых алгоритмах кодирования. Дескрипторы Local и Remote передаются шлюзом в ответе на это требование.
Шлюз MG1 создает новое виртуальное окончание (RTP-порт), указывает его транспортный адрес: IP-адрес (212.86.42.1) и UDP/RTP-порт (22220). Кроме того, шлюз выбирает алгоритмы кодирования информации, которые будут использоваться в соединении, основываясь на предпочтениях Softswitch.
MG1 to Softswitch: Megaco/1.0 [212.86.42.1]:55555 Reply = 10003 { Context = 2000 { Add,
Add=A4445{ Media {
Stream = 1 {
Local = SDP {
v=0
c=IN IP4 212.86.42.1 m=audio 2222 RTP/AVP 4 0 a=ptime:20 a=recvonly
}; RTP profile for G.723 is 4
}
}
}
}
}
Softswitch создает в шлюзе MG2 контекст для установления дуплексного соединения (режим SendReceive) с вызывающим пользователем.
Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 50003 { Context = $ { Add = A5555 { Media {
Stream = 1 {
}
}
},
Add = $ {
Media { Stream = 1 {
LocalControl {
Mode = SendReceive, g/NetworkType = RTP/IP4, g/MaxJitterBuffer=40,; in ms g/PreferredPacketization=30,; in ms g/PreferredEncoders =[G723, PCMU], g/PreferredDecoders=[G723, PCMU],
g/Gain=0; in dB
},
Remote=SDP{
v=0
c=IN IP4 212.86.42.1 m=audio 2222 RTP/AVP 4 0 a=sendrecv
}; RTP profile for G.723 is 4
}
}
}
}
}
Создание контекста подтверждается, физический порт шлюза MG2 A5555 соединяется с UDP/RTP-портом, имеющим идентификатор A5556. Отметим, что RTP-порт имеет номер 1111, т.е. отличный от номера порта Megaco/H.248 - 55555.
MG2 to Softswitch:
Megaco/1.0 [212.86.42.1]:55555 Reply = 50003 {
Context = 5000 { Add,
Add = A5556{
Media {
Stream = 1 {
Local = SDP {
v=0
c=IN IP4 218.68.122.411 m=audio 1111 RTP/AVP 4 0 a=sendreceive
}
}; RTP profile for G723 is 4
}
}
}
}
Контроллер предписывает шлюзу MG1 начать передачу вызывающему абоненту акустического сигнала контроля посылки вызова КПВ.
|
|
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 10005 { Context = 2000 { Modify = A4444 {
Signals {g/PlayTone{tone=ringback}}
}
}
}
Шлюз MG1 подтверждает передачу указанного акустического сигнала в порт A4444.
MG1 to Softswitch:
Megaco/1.0 [212.86.42.1]:55555 Reply = 10005 {
Context = 2000 {Modify}
Контроллер Softswitch предписывает порту A5555 шлюза MG2 начать передачу вызывного сигнала.
Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 50004 { Context = 5000 { Modify = A5555 {
Signals {glinesup/PlayTone{tone=ring}}
}
}
}
Шлюз MG2 подтверждает передачу сигнала «Посылка вызова» вызываемому абоненту.
MG2 to Softswitch:
Megaco/1.0 [218.68.122.41]:55555 Reply = 50004 {
Context = 5000 {Modify}
}
На этом этапе обоим абонентам, участвующим в соединении, посылаются соответствующие сигналы, и шлюз MG2 ждет, пока вызываемый абонент примет входящий вызов, после чего между двумя шлюзами будут организованы двунаправленные разговорные каналы.
Шлюз MG2 обнаружил, что вызываемый абонент поднял трубку, и извещает об этом контроллер Softswitch.
MG2 to Softswitch:
Megaco/1.0 [218.68.122.41]:55555 Transaction = 50005 { Context = 5000 {
Notify = A5555 {ObservedEvents =1234 { 19990729T22020002:glinesup/offhook}}
}
}
Контроллер подтверждает получение команды Notify. Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Reply = 50005 {
Context = - {Notify}
}
Далее контроллер Softswitch предписывает шлюзу MG2 прекратить передачу вызывного сигнала.
Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 50006 { Context = 5000 { Modify = A5555 {
Events = 1235 {glinesup/onhook}, Signals {g/StopTone}; to turn off ringing
} }
Шлюз MG2 подтверждает выполнение команды.
MG2 to Softswitch:
Megaco/1.0 [218.68.122.41]:55555 Reply = 50006 { Context = 5000 {Modify}
}
Далее контроллер разрешает шлюзу MG1 не только принимать, но и передавать информацию (режим SendReceive), и останавливает передачу вызывающему абоненту акустического сигнала КПВ.
Softswitch to MG1:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 10006 { Context = 2000 { Modify = A4445 { Media {
Stream = 1 { LocalControl {
Mode=SendReceive
}
}
}
},
Modify = A4444 {
Signals { g/StopTone}
}
}
}
Шлюз MG1 подтверждает выполнение команды.
MG1 to Softswitch:
Megaco/1.0 [212.86.42.1]:55555 Reply = 10006 {
Context = 2000 {Modify, Modify}}
После этого начинается разговорная фаза соединения, в течение которой участники сеанса связи обмениваются речевой информацией. Следующим шагом контроллер Softswitch принимает решение проверить PTP-порт в шлюзе MG2.
Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Transaction = 50007 {
Context = - {AuditValue = A5556{
Audit{Media, DigitMap, Events, Signals, Packages, Statistics }}
}
}
Шлюз MG2 выполняет команду. В ответе на команду AuditValue передается вся запрашиваемая информация, в том числе статистические данные, накопленные за время соединения. Кроме того, из ответа видно, что не произошло никаких событий и не передавалось никаких сигналов.
Megaco/1.0 [218.68.122.41]:55555 Reply = 50007 { Context = - { AuditValue { Media {
TerminationState {
BufferedEventHandling{Process}
},
Stream = 1 {
LocalControl {
Mode = SendReceive, g/MaxJitterBuffer=40,; in ms g/PreferredPacketization=30,; in ms g/PreferredEncoders =[G723, PCMU], g/PreferredDecoders=[G723, PCMU], g/Gain=0; in dB
},
Local = SDP {
v=0
c=IN IP4 218.68.122.41 m=audio 1111 RTP/AVP 4 0 a=sendrecv
},
Remote=SDP{
v=0
c=IN IP4 212.86.42.1 m=audio 2222 RTP/AVP 4 0 a=sendrecv
}; RTP profile for G.723 is 4
}
},
Packages {g, glinesup, RTPPkg},
Statistics { RTPPkg/PacketsSent=1200, RTPPkg/OctetsSent=62300, RTPPkg/PacketsReceived=700, RTPPkg/OctetsReceived=45100, RTPPkg/PacketsLost=6, RTPPkg/Jitter=20, RTPPkg/AverageLatency=40 }
}
}
}
Вызываемый абонент первым разрушает связь, и шлюз MG2 извещает об этом Softswitch.
MG2 to Softswitch:
Megaco/1.0 [218.68.122.41]:55555 Transaction = 50008 { Context = 5000 {
Notify = A5555 {ObservedEvents =1235 { 19990729T24020002:glinesup/onhook}
}
}
}
Softswitch подтверждает получение сообщения Notify.
Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555 Reply = 50008 {
Context = - {Notify}
Получив информацию от любого из шлюзов о том, что один из абонентов положил трубку, Softswitch разрушает соединение. К обоим шлюзам передается команда Subtruct.
Алгоритм разрушения соединения предусматривает одинаковый обмен сигнальными сообщениями между контроллером и обоими шлюзами, поэтому здесь этот алгоритм рассматривается на примере шлюза MG2.
From Softswitch to MG2:
Megaco/1.0 [216.44.88.1]:55555
Transaction = 50009 { Context = 5000 {
Subtract = A5555 {Audit{Statistics}}, Subtract = A5556 {Audit(Statistics}}
}
}
Каждый из портов шлюза MG2, участвующих в соединении (физический порт - A5555 и RTP-порт - A5556), передает статистические данные, накопленные за время соединения. В общем случае, Softswitch может запрашивать статистическую информацию только у одного из портов.
From MG2 to Softswitch:
Megaco/1.0 [218.68.122.41]:55555
Reply = 50009 { Context = 5000 { Subtract {
Statistics {; what are the stats for a TDM connection? TDMPkg/OctetsSent=45123,
TDMPkg/Duration=40; in seconds }
},
Subtract {
Statistics {
RTPPkg/PacketsSent=1245,
RTPPkg/OctetsSent=62345,
RTPPkg/PacketsReceived=780,
RTPPkg/OctetsReceived=45123,
RTPPkg/PacketsLost=10,
RTPPkg/Jitter=27,
RTPPkg/AverageLatency=48
}
}
}
}
После разрушения соединения Softswitch предписывает шлюзам MG1 и MG2 быть готовыми к тому, что кто-то из обслуживаемых ими абонентов поднимет трубку.
Отметим, что портам шлюза, отображаемым окончаниями в нулевом контексте, по умолчанию может быть предписано обнаруживать снятие трубки абонентом, при этом Softswitch не должен передавать шлюзам специальные команды, как это было в рассмотренном примере.
11. Б.С. Гольдштейн