Хотел написать о Интеграции с гуглопочтой, гуглокалендарем.. Но решил более детально остановится на Gtalk, гугложабер называйте как хотите, лишь бы было понятно о чем)
1.Небольшой обзор функций в *1.8
2.Плавно переходим к *10
3.Неожиданно “написался” кусочек статьи о мгновенных сообщениях, спс хабру)
4. Функции которые будут в *11(уже 2 бета доступна)
но обо всем по порядку…
Для начала нам нужна учетка гугла.
Формат файлов в 1.8 и 10 идентичен
Сначала правим jabber.conf(подключаем туда учетку гугла)
Как и во всех файла астериска присутствует секция general(для общих настроек)
А дальше мы сами придумываем нужную нам секцию, например asterisk
[general] ; вкл режим отладки(более детальные сообщения) debug=no ; удалять или нет людей из списка контактов, каждый раз при подкл к серверу autoprune=no ; проводить ли авторегистрацию пользователей из списка контактов autoregister=yes ; поведение при запросе авторизации(разрешить/запретить) auth_policy=accept [asterisk] ;тип клиента client или component, в 99% используется первое type=client ;сервер куда будем коннектится serverhost=talk.google.com ; учетка на гугле [email protected] ; пароль к учетке secret=vtufctrhtnysqgfhjkm ;Приоритет этого ресурса, по отношению к другим. priority=1 ;порт соединения port=5222 ; использовать TLS или нет usetls=yes ; Использовать SASL или нет usesasl=yes ;Устанавливаем статус контакта(chat, available, away, xaway, и dnd.) status=available ; сообщение статуса(обязательно в кавычках) statusmessage="Asterisk Online" ;Добавляем человека в свой список контактов при соединение с сервером [email protected] ; Можно другим серверам рассказывать о том что у вас творится(передавать статусы и события) ;distribute_events=yes ; Сколько секунд хранить сообщение в очереди. По умолчанию 5. Только для входящих сообщений которые планируется обрабатывать в функцией диалплана JABBER_RECEIVE(). timeout=5 ;;Добавлено в ASTERISK10 ; Отправлять входящие сообщения в диалплан. По умолчанию выкл ;sendtodialplan=yes ; Контекст для отправки входящих сообщений, по умолчанию "default" ;context=messages
Перезагружаем модуль
*CLI> jabber reload Jabber Reloaded.
Проверяем соединение:
bos*CLI> jabber show connections Jabber Users and their status: [asterisk] [email protected] - Connected ---- Number of users: 1
Если проблемы с соединением:
1. проверяем правильность настроек
2. логин пароль
3. перезагружаем модуль еще раз
4. перезагружаем астериск
5. Выполняем jabber purge nodes
Все работает переходим к Диалплану
JabberSend(account,jid,message) – Отправить сообщение из диалплана
account – имя секции в jabber.conf,
jid – человек кому мы будем отправлять,
message – текст сообщения.
[LocalSets] exten => 104,1,Answer() same => n,JabberSend(asterisk,[email protected],Call from ${CALLERID(all)}) same => n,Dial(SIP/103,30) same => n,Hangup()
JABBER_RECEIVE(account,jid[,timeout]) Функция диалплана которая получает ответы
account – имя секции в jabber.conf,
jid – человек от кого мы получаем ответ,
timeout – время ожидания ответа, по умолчанию 20сек.
Поскольку обработка диалплана замирает пока мы ожидаем ввода, или таймаута, то лучше использовать каналы local
exten => 106,1,Dial(Local/jabber@${CONTEXT}/n&Local/dial@${CONTEXT}/n) exten => jabber,1,Verbose(2,Send an XMPP message and expect a response) same => n,JabberSend(asterisk,[email protected],Incoming call from ${CALLERID(all)}. Press 2 to send to voicemail.) same => n,Set(JabberResponse=${JABBER_RECEIVE(asterisk,[email protected],6)}) same => n,GotoIf($["${JabberResponse}" = "2"]?voicemail,1) same => n,Hangup() exten => dial,1,Verbose(2,Calling our desk) same => n,Dial(SIP/678,15) same => n,Goto(voicemail,1) exten => voicemail,1,Verbose(2,VoiceMail) same => n,Answer() same => n,Set(VoiceMailStatus=${IF($[${ISNULL(${DIALSTATUS})} | "${DIALSTATUS}" = "BUSY"]?b:u)}) same => n,Playback(silence/1) same => n,VoiceMail(100@office,${VoiceMailStatus}) same => n,Hangup()
JABBER_STATUS(account,jid) возвращает статус человека из списка контактов
account – имя секции в jabber.conf,
jid – человек статус которого мы хотим узнать
Статусы от 1 до 7.
1=Online, 2=Chatty, 3=Away, 4=XAway, 5=DND, 6=Offline 7= Не в списке контактов.
Также можно использовать приложения JabberJoin() и JabberLeave(), который используется для входа/выхода из XMPP конференц комнаты; и JabberSendGroup() позволяет отослать сообщение в XMPP чат комнату.
Звонки с помощью chan_gtalk правим gtalk.conf
[general] bindaddr=0.0.0.0 ; Адрес ифейса к какому привязываемся allowguests=yes ; принимать звонки от людей не из контакт листа ; Доп параметры, например если вы за натом ; externip=; stunaddr= ;context=default ; контекст по умолчанию ; Настройка кодеков ;disallow=all ;allow=gsm ;allow=ulaw ;parkinglot=soccer ; Слот парковки по умолчанию ; сам слот должен быть настроен в features.conf ;Создаем секцию для принятия ВХОДЯЩИХ звонков. ;Исходящие роутятся на основании профиля в jabber.conf [avenue.com.ua] [email protected] ; имя пользователя от кого будем инициировать вызов, или кому предназначаются вызовы disallow=all allow=alaw allow=ulaw context=gtalk_incoming connection=asterisk ; имя соединения заданного в jabber.conf
Теперь диалплан
Входящие
[gtalk_incoming] exten => my_asterisk_user,1,Verbose(2,Gtalk call from ${CALLERID(all)}) same => n,Answer() same => n,Wait(2) same => n,SendDTMF(1) same => n,Dial(SIP/765,20)
Где my_asterisk_user – имя нашего ящика без @gmail.com(удобно если есть несколько гугл аккаунтов)
“Wait” должен быть от 2 секунд, иногда больше, зависит от настроения гугла), иначе Ваш звонок может быть не совсем успешен;) Без SendDTMF(1) гугл будет спрашивать хотим мы принять звонок или нет. Поэтому нужно всегда отсылать 1.
Исходящие
[LocalSets] exten => 123,1,Verbose(2,Extension 123 calling [email protected]) same => n,Dial(Gtalk/asterisk/[email protected],30) same => n,Hangup() ;Для звонков в забугряндию через гугл войс(если вам разрешено) [LocalSets] exten => _1NXXNXXXXXX,1,Verbose(2,Placing call to ${EXTEN} via Google Voice) same => n,Dial(Gtalk/asterisk/+${EXTEN}@voice.google.com) same => n,Hangup()
Где:
Gtalk – технология
asterisk – имя соединения в jabber.conf
[email protected] – кому будем звонить
Если вдруг CallerID “НиПаНяТнЫй” можно обрезать первую часть.
exten => s,1,NoOp() same => n,Set(crazygooglecid=${CALLERID(name)}) same => n,Set(stripcrazysuffix=${CUT(crazygooglecid,@,1)}) same => n,Set(CALLERID(all)=${stripcrazysuffix}) same => n,Dial(SIP/malcolm,20,D(:1))
В Asterisk 10, добавлена поддержка онлайн сообщений без звонка SIP абонентам, делаем свою асю с блекджеком и…
правим sip.conf
accept_outofcall_message = yes outofcall_message_context = messages auth_message_requests = yes textsupport=yes
Добавляем контекст messages в extensions.conf
[messages] exten => _X.,1,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)}) ;отрезаем адрес назначения без домена same => n,Set(ACTUALFROM1=${CUT(MESSAGE(from),@,1)}) ;приводим в порядок CID, same => n,Set(ACTUALFROM=${CUT(ACTUALFROM1,:,2)}) ;грандстримы в упор не хотели видеть от кого сообщение same => n,Set(MESSAGE(body)=${ACTUALFROM}:${MESSAGE(body)}) ; правим текст сообщения для грандстримов same => n,MessageSend(${ACTUALTO},${MESSAGE(from)}) ; отправляем same => n,NoOp(Send status is ${MESSAGE_SEND_STATUS}) same => n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg) ; статус отправки same => n,Hangup() same => n(sendfailedmsg),Set(MESSAGE(body)="[${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}]Your message to ${EXTEN} has failed. Retry later.") ; делаем печальный текст same => n,Set(ME_1=${CUT(MESSAGE(from),<,2)}) ; обрезаем откого same => n,Set(ACTUALFROM=${CUT(ME_1,@,1)}) ; same => n,MessageSend(${ACTUALFROM},"ServiceCenter" <700>) ; отправляем c указанием от кого) same => n,Hangup()
Как все это работает?
Сначала устанавливаем текст сообщения, а потом собственно отправляем)
Используем функцию MESSAGE(arg)
- В качестве аргументов:
- to -только чтение. Адрес назначения сообщения
- from – только чтение. Адрес отправителя
- body – Текст сообщения. UTF-8
С помощью Set(MESSAGE(body)=TXT) устанавливаем текст сообщения который потом отправим из Астериска.
MessageSend(to[,from])
to – кому отправить
from – от кого
!!! для SIP этот параметр может быть задан как имя пира или в формате “display-name”
Приложение возвращает переменную ${MESSAGE_SEND_STATUS}:
INVALID_PROTOCOL: не знает как обработать технологию в адресе назначения
INVALID_URI: неверный адрес назначения
SUCCESS: Сообщение успешно ушло по протоколу, но это не гарантия того, что сообщение будет получено)
FAILURE: Сообщение не доставлено
В 11 версии MESSAGE(from) будет в виде “display-name”
А теперь о будущем, в Asterisk 11 будет реализована поддержка общения через res_xmpp и chan_motif
motif.conf
[google] context=incoming-motif disallow=all allow=ulaw connection=google
xmmp.conf
[general] [google] type=client serverhost=talk.google.com [email protected] secret=examplepassword priority=1 port=5222 usetls=yes usesasl=yes status=available statusmessage="I am available" timeout=5
Дальше все без изменений