Hangouts+asterisk

Дело было вечером, делать было нечего.. Собственно я уже писал о интеграции гуглоголоса и Asterisk. Вот тут. Но все течет все меняется, и та статейка уже изрядно устарела, и нам не остается ничего другого как обновить статейку.
0. До того как начать:
Для того чтобы все получилось у нас должна быть почта на гугле
Asterisk соединяется с Google Voice и Google Talk используя драйвер канала chan_motif и модуль res_xmpp. Также нужны библиотеки iksemel и OpenSSL.
Нормальная работа гарантируется только в asterisk11 и старше.
Google Voice позволяет также звонить на PSTN, но доступен не во всех странах(
В гуглоаккаунте можно выбрать режим чата, и автоматом принимать сообщения от людей с которыми вы общаетесь или только если вы дадите добро на это действие!

1. Настройка RTP
chan_motif просит включить ICE.

Unable to add Google ICE candidates as ICE support not available or no candidates available

Идем в rtp.conf и в секции [general]
[general]
icesupport=yes

2. chan_motif (motif.conf)
Выбираем транспорт из 3 возможных вариантов, в порядке предпочтения:
Jingle через ICE-UDP, Google Jingle и Google-V1.

Jingle описан в XEP-0166 поддерживает кучу плюшек. В этом файле устанавливается как «ice-udp».
Google Jingle соответствует спецификации Jingle в части сигнализации, но использует свой транспорт для передачи мультимедиа. поддерживается в Google Talk Plug-in в Gmail и некоторыми другими Jingle клиентами. В этом файле устанавливается как «google».
Google-V1 оригинальный Google Talk сигнальный протокол который использует предварительную, начальную версию Jingle. Использует тот же протокол для передачи мультимедиа что и Google Jingle. Поддерживается в Google Voice, в некоторых других Jingle клиентах и Windows Google Talk клиенте. В этом файле устанавливается как «google-v1».

Входящие сессии автоматически будут выбирать нужный протокол.
В исходящих сессиях возможно определить какой протокол поддерживает удаленная сторона (Jingle или Google) если клиент в ростере. К сожалению, невозможно определить протокол до установки сессии. Клиент будет пытаться установить соединение на предпочитаемом протоколе, если не удастся переберет остальные протоколы!
Правила набора:
Motif//target
Когда мы совершаем исходящий звонок, происходит поиск адресата в ростере. Если присутствует то используется Jingle или Google Jingle. В зависимости от того, какой протокол поддерживает клиент. Если адресат не в ростере, тогда будет использоваться протокол из конфига, если транспорт не указан, то будет использоваться ice-udp.
Дополнительно настраивать видео не требуется, просто включаем кодеки в клиенте и все)
DTMF только RFC2833.
При входящем вызове сначала ищем имя пира в соответствующем контексте, если нет, то автоматически переходит в «s».
CallerID(num) — юзернейм звонящего CallerID(name) — полное описание звонящего
Не используйте одно и тоже соединение в нескольких клиентах!
[default]
transport=ice-udp
disallow=all
allow=alaw
allow=ulaw
allow=g722
allow=h264
context=incoming-motif ; контекст для входящих вызовов
maxicecandidates = 10 ; максимальное к-во ICE кандидатов которое мы поддерживаем
maxpayloads = 30 ; максимальное к-во полезной нагрузки которую мы поддерживаем
accountcode=jingle ; для CDR
connection=gvoice-account ; какое используется XMPP соединение

Поддерживаемые кодеки:
PCMA
PCMU
G.722
iLBC
Speex 16kHz
Speex 8kHz
H.264/SVC
H.264
H.263-1998

3.XMPP Configuration (xmpp.conf)
Настройки по умолчанию которые в 99% будут работать:
[general]
[google]
type=client
serverhost=talk.google.com
username=example@gmail.com
secret=examplepassword
priority=25
port=5222
usetls=yes
usesasl=yes
status=available
statusmessage="I am available"
timeout=5

Если хотим копать глубже:
[general]
debug=no ; вкл режим отладки(более детальные сообщения)
autoprune=no ; удалять или нет людей из списка контактов, каждый раз при подкл к серверу
autoregister=yes ; проводить ли авторегистрацию пользователей из списка контактов
auth_policy=accept ; поведение при запросе авторизации(разрешить/запретить)
collection_nodes=yes ; Поддержка XEP-0248 для распространения состояния. по умолчанию ‘no’.
pubsub_autocreate=yes ; если PubSub поддерживает автосоздание нод мы сначала создаем ноды перед их публикацией, по умолчанию ‘no’.
[asterisk]
type=client ;тип клиента client или component, в 99% используется первое
serverhost=talk.google.com ;сервер куда будем коннектится
username=avenue.com.ua@gmail.com ; учетка на гугле
secret=v45uft3434nys ; пароль к учетке
priority=1 ;Приоритет этого ресурса, по отношению к другим.
port=5222 ;порт соединения
usetls=yes ; использовать TLS или нет
usesasl=yes ; Использовать SASL или нет
status=available ;Устанавливаем статус контакта(chat, available, away, xaway, и dnd.)
statusmessage=»Asterisk Online» ; сообщение статуса(обязательно в кавычках)
buddy=bos.avenue.com.ua@gmail.com ;Добавляем человека в свой список контактов при соединение с сервером
distribute_events=yes ; Можно другим серверам рассказывать о том что у вас творится(передавать статусы и события)
timeout=5 ; Сколько секунд хранить сообщение в очереди. По умолчанию 5. Только для входящих сообщений которые планируется обрабатывать в функцией диалплана JABBER_RECEIVE().
sendtodialplan=yes ; Отправлять входящие сообщения в диалплан. По умолчанию выкл
context=messages ; Контекст для отправки входящих сообщений, по умолчанию «default»
pubsub_node=pubsub.astjab.org ;Нода, которая используется для публикации событий PubSub.

О приоритетах:
Поскольку одна и та же учетка может быть включена на нескольких устройствах одновременно, то нужно явно указать приоритеты входящих звонков. Чем выше приоритет тем лучше
Gmail chat client= 20, Windows GTalk client =24. Максимум 127. Указав в конфиге приоритет 25 мы будем принимать все входящие звонки в астериск! Приориет не действует на исходящие звонки!

4. Теперь диалплан:
Входящие звонки
[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.

Если вдруг 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)) ;еще один способ ответить гуглу!

Исходящие звонки
Через google talk
[LocalSets]
exten => 123,1,Verbose(2,Extension 123 calling some_user@gmail.com)
same => n,Dial(Motif/asterisk/some_user@gmail.com,30,r) ;гугл не дает КПВ
same => n,Hangup()

;Для звонков в забугряндию через гугл войс(если вам разрешено)
[LocalSets]
exten => _1NXXNXXXXXX,1,Verbose(2,Placing call to ${EXTEN} via Google Voice)
same => n,Dial(Motif/asterisk/${EXTEN}@voice.google.com,,r)
same => n,Hangup()

Где:
Motif — технология
asterisk — имя соединения в xmpp.conf или motif.conf(Talk или Voice)
some_user@gmail.com — кому будем звонить

Если не можем зарегистрироваться и в консоль валят вот такие сообщения:

WARNING[100928] res_xmpp.c: Parsing failure: Invalid XML.
WARNING[100928] res_xmpp.c: JABBER: socket read error
WARNING[100928] res_xmpp.c: Parsing failure: Hook returned an error.

и через некоторое время астер может повиснуть наглухо, проблема не в астере, не надо пытаться делать патчи итд, а нужно:
1. зайти в ваш гуглоаккаунт
2. добавить номер мобильного телефона
3. разрешить сторонние приложения(гугл сразу напишет вам письмо, что это опасно)

P.S. Если честно для нормальной настройки всего этого дела, нужно еще степень по шаманству, к тому же гугл переводит всех на hangouts,а там позвонить с мобильного приложения в астериск у меня так и не получилось. Если часто трогать настройки, передергивать модуль, то астер иногда падает в кору. Для меня в этой технологии больше — чем +. Если я пропустил какой-то шаг и у Вас все прекрасно работает, пожалуйста расскажите мне как вы это сделали.

Литература:
https://wiki.asterisk.org/wiki/display/AST/Calling+using+Google

Google Integration +IM


конфиги


Комментарии: