Tamkovich.com: Телеком/VoIP блог
Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys
Asterisk и текстовые сообщения: JABBER_RECEIVE
21 января, 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.