Tamkovich.com: Телеком/VoIP блог
Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys
Asterisk и текстовые сообщения: JABBER_RECEIVE
Январь 21st, 2009 by Сергей Тамкович
Asterisk jabber, xmppСовременные телекоммуникационные протоколы поддерживают не только передачу аудио данных – текстовыми сообщениями или видео звонками сегодня уже никого не удивить. Создатели протокола SIP вообще не стали привязываться к типу медиа данных передаваемых в установленном сеансе связи. Вот, например, цитата из RFC3261:
13.1 Overview
When a user agent client desires to initiate a session (for example,
audio, video, or a game), it formulates an INVITE request. The
INVITE request asks a server to establish a session.
То есть, протокол позволяет установить сеанс связи, а что будет передано в этом сеансе – видео, аудио или даже игры – забота UA. SIP не единственный протокол управляющий соединениями абстрактно от медиа данных, подобный уровень абстракции поддерживается и другими, например jabber/xmpp протоколом.
На сегодняшний день, Asterisk используется, в основном, для обработки и передачи аудио данных. Работа с текстовыми сообщениями, до недавнего времени, ограничивалась приложением SendText. Приложение SendText позволяет, используя ограниченный набор каналов, отправлять вызывающему абоненту текстовое сообщение. Приложения, которое бы принимало текст от вызывающего пользователя в диалплане – не существовало. Это очень сильно ограничивало сферу применения текстовых сообщений в Asterisk.
В ближайшем будущем, в Asterisk появится новая функция для диалплана – JABBER_RECEIVE. На данный момент, код этой функции находится в частной ветке Philippe Sultan и уже более месяца помечен в багтракере как ready for review/ready for testing, что говорит о его отлаженности. Синтаксис новой функции таков:
Set(VALUE=${JABBER_RECEIVE(xmpp-account,bob@jabber.org,30)})В этом примере, функция диалплана будет ожидать 30 секунд (timeout) сообщения от пользователя someone@jabber.ru (jid) на аккаунт xmpp-account (account). Аккаунты настраиваются в файле jabber.conf. Параметры jid и account – обязательны. Параметр timeout – опционален, если он отсутствует, то используется таймаут по умолчанию – 20 секунд. Как следует из примера, ответ пользователя сохраняется в переменную диалплана с именем VALUE. Это открывает фантастические возможности по интерактивному управлению звонками / диалпланом. Пара примеров проиллюстрирует новые возможности лучше всяких слов.
context from-ext {
1234 => {
Answer();
JabberSend(axmpp,bob@jabber.org,Call from $CALLERID(num) - choose an option to process the call);
JabberSend(axmpp,bob@jabber.org,1 : forward to cellphone);
JabberSend(axmpp,bob@jabber.org,2 : forward to work phone);
JabberSend(axmpp,bob@jabber.org,Default action : forward to your voicemail);
Set(OPTION=${JABBER_RECEIVE(axmpp,bob@jabber.org,20)});
switch (${OPTION}) {
case 1:
JabberSend(axmpp,bob@jabber.org,(Calling cellphone...);
Dial(SIP/987654321);
break;
case 2:
JabberSend(axmpp,bob@jabber.org,(Calling workphone...);
Dial(SIP/${EXTEN});
break;
default:
Voicemail(${EXTEN}|u)
}
}
}В этом примере, при поступлении звонка на номер 1234 контекста from-ext, Asterisk запрашивает пользователя bob@jabber.org по протоколу xmpp, и, в зависимости от ответа, посылает звонок на мобильный телефон (1), посылает звонок на SIP аккаунт 1234 или переводит звонок в голосовую почту (по таймауту в 20 секунд).
context gtalk-in {
s => {
NoOp(Caller id : ${CALLERID(all)});
Answer();
SendText(Please enter the number you wish to call);
Set(NEWEXTEN=${JABBER_RECEIVE(axmpp,${CALLERID(name)})});
SendText(Calling ${NEWEXTEN} ...);
Dial(SIP/${NEWEXTEN);
Hangup();
}
}Этот пример контекста для xmpp клиента умеющего работать с аудиоданными (например, gtalk). При звонке с такого клиента, CALLERID(name) устанавливается в JID вызывающего пользователя. В последствии вы можете использовать CALLERID(name) для отправки и приема сообщений с помощью JabberSend и JABBER_RECEIVE соответственно. Данный пример реализует DISA с помощью текстовых сообщений (отвечает на входящий звонок и спрашивает, какой номер набрать далее).
Как я уже писал – JABBER_RECEIVE открывает фантастические возможности по интеграции управления звонками с системами Интернет пейджеров. Текстовые сообщения давно стали важной частью коммуникаций. Полноценная обработка текстовых сообщений – это большой шаг вперед для Asterisk как для современной коммуникационной платформы.
Asterisk jabber, xmpp

Хорошая статья, но больше интересует обычный текст..
перепробовал несколько софтфонов – между ними не ходят текстовые сообщения. Например в X-Lite жмешь Send и все, типа он отправил, но сообщение до адресата не доходит. Другие софтфоны ругаются ошибкой что не могут отправить.
По голосовой связи софтфоны прекрасно общаются.
Сервер нормально отправляет сообщения софтфону и тот их получает (диалплан Exten => 1001,1,SendText(Hello world).
А вот между софтфонами не ходят.
Вопрос – можете подсказать ресурс по настройке * для работы с текстовыми сообщениями или написать в эту тему кусок настроек?
Алексей, а какая версия Asterisk? что пишется в логи?
Asterisk 1.6.2.9
тексты не проходят :(
по моему астериск – это набор костылей, а костыли для текста они ещё не сделали и не спешат, а что вы хотите, бесплатно ведь.
Серёжа, заметке этой (про работу с jabber сообщениями) почти три года – многое с тех пор изменилось.
Очень приятно, что результат в том числе и моей работы, ты уважительно называешь «набором костылей». Надеюсь сам ты работаешь не в пример лучше и продукты на выходе – соответствующие, только они секретные, по этому про них никто не знает :)
Ну и самое главное – зачем ссылаться на мифических «они»? – возьми да сделай сам, ты же профи. Это, если ты не в курсе, Open Source.