VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Как подружить Asterisk с WebSocket чатиком?

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

Есть работающая телефония с клиентами в виде андройд приложения и flash-звонилки на сайте.
Есть чатик на вебсокетах, работающий только в браузере. (Сохранение истории, завязка на базы данных и т.д.)
На тестовом сервере, реализовал чатик в андройд приложении, на основе exten => _XXXX,1,MessageSend
Аккаунты и для телефонии и для чатика одни и те-же.

Как теперь подружить Астериск с WebSocket чатиком?

Как решал проблему:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
Я планировал воспользоваться ARI, благо собрались переползать с 8го астериска на 13ый.
Настроил астериск, поигрался с ARI "хело-ворлд", но дальше дело не пошло.
Думал, что можно будет наладить обмен между WebSocket сервером и астериском через RESTful интерфейс.
Но не нашел никакой нормальной информации по этому поводу. Как аудио проиграть или статус проверить - это пожалуйста. (работает) Но как сообщения отправлять, непонятно.
Если использовать доку через http://ari.asterisk.org/ То в разделе endpoints, есть интересный запрос "PUT /endpoints/sendMessage". Однако не уверен, что имеется ввиду нечто аналогичное MessageSend диалплана... Во всяком случае у меня не заработало.
Разные подробности:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
Asterisk 13.7.2 чистый
Андройд клиент - Переделанный Linphone
Сообщения в Астериске отправляются через extensions.conf exten => _XXXX,1,MessageSend(pjsip:${EXTEN},"${CALLERID(name)}"${MESSAGE(from)})
Чат на сайте работает через WebSocket сервер (делал не я) и хорошо бы использовать его, а не делать новый.
ARI работает, проверено на простых примерах.

Пробовал "PUT /endpoints/sendMessage" из интерактивной документации по ARI.
http://localhost:8001/ari/endpoints/sen ... k:asterisk
Ругается 400 Invalid parameters for sending a message.
Response Body
{
"message": "Error parsing request body"
}
В from и to имя эндпоинта в формате pjsip:1111
В body просто строка "Hello from WS".
Буду крайне рад, если кто подскажет как подружить Астериск с WebSocket чатиком, лучше через ARI, но не обязательно. Благодарен любой помощи.

PS: Могу привести конфиги тестового Астериска, но пока не ясно какие, ведь сам по себе ARI работает.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение virus_net »

мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

virus_net, спасибо за ваш комментарий. Но Вы чересчур лаконичны...
sendMessageToEndpoint
Как я и писал, я попробовал воспользоваться данной функцией, однако она не сработала. Кроме того я не уверен, что она инициирует отправку сообщения через диалплан, а не выполняет функцию отправки какого-то сервисного сообщения... Примеров использования я не нашел, хотя по описанию выглядит, как то-что нужно.
ARI = not ARI
Эту статью я так-же читал, и протестировал. Работает. Но там речь о другой функции, использующей стазис и уже созданный канал.

Судя по вашему сообщению, вы согласны, что реализовывать интеграцию веб-чата и Астериска нужно именно через эту функцию?
Был ли у вас опыт в схожей задаче?
Как лучше организовать связь в другую сторону? Через ивенты вебсокет-сервера или есть способ лучше?
В общем хотелось бы услышать чуть более развернутый комментарий, как подружить Asterisk с WebSocket чатиком.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

Надеялся на опыт сообщества, но видимо все поздравляют милых дам с наступающим)
Ну, может на следующей неделе, кто ответит, не думаю, что у меня первого возникла необходимость связать чат для браузера и мобильный клиент.
По поводу sendMessageToEndpoint, оставлю небольшой комментарий.
Первоначально, при использовании http://ari.asterisk.org/ "PUT /endpoints/sendMessage", при казалось бы правильном заполнении полей, выдавалась ошибка 400 Error parsing request body. Потом, я попробовал в поле body записать {"body":"hello"}. Получил код 202 "no content", но передача состоялась, клиент получил сообщение.
Кто-нибудь знает в чем тут дело? Особенность работы ari.asterisk.org ?
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение virus_net »

Severd писал(а):Судя по вашему сообщению, вы согласны, что реализовывать интеграцию веб-чата и Астериска нужно именно через эту функцию?
Я не могу сказать что я согласен, я могу лишь указать, что это похоже на то, что необходимо, т.к. описание использования функции Application_MessageSend совпадает с описанием sendMessageToEndpoint:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
Снимок экрана_2016-03-10_08-25-22.png
Чтобы в этом убедиться нужно просто протестить MessageSend и sendMessageToEndpoint с включенным дампом трафика, да и просто сравнить результаты.Тогда никаких вопросов не останется.
Severd писал(а):Был ли у вас опыт в схожей задаче?
И да и нет.
Конкретно с MessageSend никогда не развлекался, более того даже не интересовался этим вопросом никогда, т.к. подобных задач не возникало. Да и считаю, что телефон это устройство для того чтобы говорить, а не писать :)
А вот связь с АMI через Websocket реализовывали. Собственно через AMI то уже можно выполнить что угодно.
Severd писал(а):выдавалась ошибка 400 Error parsing request body ... Особенность работы ari.asterisk.org ?
ari.asterisk.org это просто интерфейс, который отдает команды. Можно допустить что разрабы интерфейса могли ошибиться, но интерфейс сопровождается не только выводом ответов от сервера, но и показывает "Request URL", собственно в котором и написан URL по которому обращаются к ARI. Что написано у вас ? Что в "body" ?
Эти же команды вы можете отдавать самостоятельно, например через тот же curl или прямо из браузера Chrome с помощью плагина Simple REST Client
Исходя из описания:
body: string - The body of the message
Это должна быть строка, а не объект как пробовали вы.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение virus_net »

P.S. Так же не стоит забывать о том, что я писал в статье:
вы НЕ можете управлять каналом, который находится ВНЕ приложения Stasis
вы НЕ можете получать события по каналам, которые находятся ВНЕ приложения Stasis
во время исполнения приложения Stasis исполнение dialplan`а полностью прекращается и если ваше приложение не подает никаких ARI команд, то вызов (канал) будет просто висеть с тишиной в трубке
если к вашему приложению нет клиентов подключенных по Websocket, то такое приложение работать не будет и вызов (см. пример выше) уйдет по Hangup`у
Asterisk REST Interface (ARI)
What is Stasis?
Stasis is a dialplan application in Asterisk. It is the mechanism that Asterisk uses to hand control of a channel over from the dialplan - which is the traditional way in which channels are controlled - to ARI and the client. Generally, ARI applications manipulate channels in the Stasis dialplan application, as well as other resources in Asterisk. Channels not in a Stasis dialplan application generally cannot be manipulated by ARI - the purpose of ARI, after all, is to build your own dialplan application, not manipulate an existing one.
Относится ли это и к sendMessageToEndpoint на 100% сказать не могу, т.к. терзают сомнения о том, что по сути sendMessage это НЕ управление каналом, а односторонняя связь - послал и забыл.

В любом случае если подружить АMI с Websocket, то это точно будет решением вашей задачи.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

Спасибо за ответ. За статью спасибо, судя по всему, то-же вам))
На счет сложностей отправки сообщений чата через ARI напишу позже, с приведением данных, и как надеюсь, с решением.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

Спустя некоторое время, я вернулся к задаче подружить чат с астериском.
Как обещал опишу проблему отправки сообщения в sip-чат через ARI.
Для отправки использовалось endpoin API
Пробуем через интерфейс http://ari.asterisk.org/
Изображение
400 фэйл "message": "Error parsing request body"
Вроде в параметрах указанна строка, но... ладно пофиг попробуем засунуть в body JSON {"body":"hello-world"}
Ура! Стоп, что значит 202?! Запрос был принят на обработку, но она не завершена. В андройд клиенте появилось сообщение.
Работает, едем дальше.
Если использовать браузерное расширение для отправки запросов, и самому прописать заголовки. то работает и без извращений. Просто

Код: Выделить всё

http://localhost:8001/ari/endpoints/PJSIP/1111/sendMessage?from=1111&api_key=asterisk:asterisk&body=hello_PUT
но возвращает по прежнему 202
То-же самое для cURL

Код: Выделить всё

curl -v -X PUT -d api_key=asterisk:asterisk -d from=1111 -d body=hello_curl http://localhost:8001/ari/endpoints/PJSIP/1111/sendMessage
Собственно на 202 решил не обращать внимания. Причину такого поведения не удалось обнаружить ни в доках, ни при помощи анализа network activity. Если кто знает, в чем тут дело, буду рад узнать.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение Severd »

Попутно обнаружилась некоторая деревянность ARI и крайне малое количество информации.
Вот например, установили соединение WS-сервер <-> Астериск.

Код: Выделить всё

wscat -c 'ws://localhost:8001/ari/events?api_key=asterisk:asterisk&app=Test'
Хочется начать управлять астериском прямо из ws... но не нашел как посылать команды прямо оттуда. Ок, используем HTTP будто и нет WS-соединения.
Подписываемся на ивенты PJSIP

Код: Выделить всё

curl -v -u asterisk:asterisk -X POST "http://localhost:8001/ari/applications/Test/subscription?eventSource=endpoint:PJSIP"
теперь при отправке сообщений и вообще любой активности эндпоинов, WS-сервер будет получать JSON уведомления.
Это хорошо, но мне нужен только один тип уведомлений. Как подписаться на определенный тип event'ов?
Я не нашел ответа. Лишнее просто игнорирую.
Так передаются чат-сообщения из Астериска в WS-сервер. Для обратной передачи снова используется http.

Код: Выделить всё

curl -v -X PUT -d api_key=asterisk:asterisk -d from=1111 -d body=hello_curl http://localhost:8001/ari/endpoints/PJSIP/1111/sendMessage
При этом никакого ивента в ws-канал не отправляется, что даже хорошо, хоть и странно.
В итоге получается довольно громоздкая система [Web-браузер] <-websocket-> [WS-сервер] <-http\ws-> [Астериск] <-sip-> [Андройд]
Если кто-нибудь знает, как сделать лучше -пишите)) Буду рад.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Как подружить Asterisk с WebSocket чатиком?

Сообщение virus_net »

Вы все никак не осознаете:
Channels not in a Stasis dialplan application generally cannot be manipulated by ARI
вы НЕ можете получать события по каналам, которые находятся ВНЕ приложения Stasis
Severd писал(а):Хочется начать управлять астериском прямо из ws..
Вы не можете управлять Asterisk`ом, вы можете управлять КАНАЛАМИ на Asterisk`е и только теме каналами, которые находятся в Stasis
Severd писал(а):Как подписаться на определенный тип event'ов?
Никак.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH