Tamkovich.com: Телеком/VoIP блог
Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys
Получение заголовков из SIP BYE
Август 31st, 2009 by Сергей Тамкович
Asterisk SIPВ конце сессии оборудование накапливает много полезной статистики. Многие вендоры передают эту статистику в виде заголовков BYE сообщения. Вот, например, заголовок P-RTP-Stat от Linksys, содержащий качественную статистику по звонку:
P-RTP-Stat: PS=256,OS=40960,PR=244,OR=39040,\ PL=29920,JI=5,LA=0,DU=4,EN=G711a,DE=G711a
Расшифровака: PS – пакетов отправлено, OS – октетов (байт) отправлено, PR – пакетов получено, OR – октетов (байт) получено, PL – пакетов потеряно, JI – джитер в милисекундах, LA – задержка в милисекундах, DU – длительность вызова в секундах, EN – кодер, DE – декодер. Или вот заголовок Reason от Cisco. Этот заголовок содержит ISDN Hangup Cause (причину разрыва):
Reason: Q.850;cause=16
Получить эти заголовки на своей «ноге» звонка – элементарно, например с помощью диалплана:
exten => h,1,SET(X=SIP_HEADER(Reason))
Однако получить эти заголовки с другой «ноги» звонка, сегодня невозможно, так как к моменту обработки h extension дальняя «нога» звонка уже уничтожена вместе со всеми служебными данными, заголовками и пр.
Долгое время я ломал голову над элегантным решением. Откладывать уничтожение канала во времени – нецелесообразно, во-первых это замедляет работу системы, а во-вторых патч меняющий архитектуру столь серьезно, имеет крайне мало шансов быть включенным в транк. Вместо этого я использовал «обратную связь».
Данный патч вводит специальную переменную SIPREMOTEBYEHEADER. При получении сообщения BYE, chan_sip проверяет, установлена ли переменная SIPREMOTEBYEHEADER на сбриджованом канале и, если да, проверяет её формат. Данная переменная должна содержать два ключевых слова разделенные запятой, например
P-RTP-Stat,PRS
. После проверки формата, chan_sip создает переменную с именем PRS на сбриджованом канале и присваивает ей содержимое заголовка P-RTP-Stat с локального канала.
Таким образом, если вы хотите получить некий заголовок Header1 от удаленного устройства, вам достаточно установить переменную SIPREMOTEBYEHEADER
exten => s,1,SET(SIPREMOTEBYEHEADER=Header1,MYVAR)
И тогда, на этапе обработки h extension Вам будет доступна переменная MYVAR содержащая желаемый заголовок.
Сейчас патч проходит процедуры одобрения для включения в транк. Надеюсь они не затянутся. Тем же, кому не терпится попробовать новый функционал, предлагаю патчи для транка и ветки 1.6.0. Комментарии и пожелания можно оставлять на багтракере, или здесь.
Asterisk SIP
