Страница 1 из 1
Общение с АТС через xmpp
Добавлено: 28 июн 2023, 10:07
sergio
Добрый день.
Иногда у меня возникает мысль предоставить пользователям возможность обращаться к астериску через сообщения xmpp, но после неудачи я бросаю это дело так надолго, что возвращаясь к ней снова уже не помню причину неудачи.
Основная проблема в том, что я не могу определить от какого buddy приходит сообщение, что бы прочитать его из JABBER_RECEIVE. Это надо делать в произвольный момент времени, без привязки к экстеншену.
Пока есть идея включить дебаг xmpp(там есть возможность разглядеть отправителя), ловить строки дебага rsyslog`ом и далее:
1 либо выполнять действие самим rsyslog`ом
2 либо выдергивать нужное из строки дебага в отдельный файл для последующего чтения из плана с помощью system
Может кто-нибудь имеет опыт? Может есть более очевидное решение или функционал о котором я не знаю/не заметил/не понял?
Re: Общение с АТС через xmpp
Добавлено: 28 июн 2023, 12:23
ded
Есть опыт, сделали даже свой форк - asterisk-with-messages, это было 11 лет назад.
Cisco systems, например, использует свой вариант xmpp, работает (не изучали - как).
У разработчиков Linphone.org - Belledonne Communications by Simon Morlat, всё работает из коробки, софтфоны обмениваются сообщениями. Правда я не проверял этот функционал последние 3 года. Имеет сысл установить и заглянуть туда в код, как это работает.
Re: Общение с АТС через xmpp
Добавлено: 28 июн 2023, 14:02
sergio
Это немного не то. Cообщения через SIP пробовал, работает на многих софт и сип фонах из коробки.
У меня есть корп.мессенджер openfire. Пользователи мессенджера опционально получают уведомления от телефонной станции о вызовах. Привязка абонент-jid через database, там же хранятся опции.
Вот хотелось бы иметь возможность в произвольное время написать из мессенджера на jid телефонной станции команду и получить ответ либо файлом либо текстом либо действием. Например недельный отчет о пропущеных. Чат-бот такой.
В xmpp.conf есть такая опция:
Код: Выделить всё
sendtodialplan=yes ; Send incoming messages into the dialplan. Off by default.
context=messages ; Dialplan context to send incoming messages to. If not set,
; "default" will be used.
sendtodialplan отрабатывает, но прочитать сообщение можно только явно указав jid отправителя который мы не знаем: JABBER_RECEIVE(account,jid,timeout)
Я думал может есть какая-то переменная или еще какое свойство позволяющее узнать от кого пришло сообщение и кому отвечать, но не нашел ничего.
Если включить xmpp set debug on, можно увидеть и само сообщение и метаданные:
Код: Выделить всё
<--- XMPP received from 'aster_user' --->
<message type="chat" to="aster_user@ofsrv.some.local/asterisk-xmpp" id="mir1789bbf4f6d5ad20_10162" from="user@ofsrv.some.local/ITOENG2"><body>test</body></message>
<------------->
Если выдернуть значение поля from, то можно получить сообщение и двигаться дальше по контексту.
Но что-то мне кажется гиблое это дело, прихожу к мнению что проще использовать отдельно запущенного клиента.
Re: Общение с АТС через xmpp
Добавлено: 28 июн 2023, 17:59
ded
Мысль понятна, но, к сожалению, я не глубок в этой технологии. Ничего кроме базовых описаний протокола, типа
https://xmpp.org/extensions/xep-0184.html
5.1 Bare JID
If the sender knows only the recipient's bare JID, it cannot determine (via Service Discovery (XEP-0030) [5] or Entity Capabilities (XEP-0115) [6]) whether the intended recipient supports the Message Delivery Receipts protocol. In this case, the sender MAY request a receipt when sending a content message of type "chat", "headline", or "normal" to the recipient's bare JID. However, the sender MUST NOT depend on receiving an ack message in reply.
Почему бы не парсить значение поля from? Регулярное выражение будет выдёргивать нужное совершенно точно.