[asterisk-app-dev] ARI resource for technology agnostic messaging
Matthew Jordan
mjordan at digium.com
Tue Apr 15 14:22:19 CDT 2014
Hey all:
I've been thinking through how to handle technology agnostic messaging
in ARI. Since Asterisk 10, we've had the ability to send/receive
messages in Asterisk (either SIP or XMPP) using the dialplan in a
cohesive fashion. Outbound messages are sent using the MessageSend
dialplan application/AMI action; inbound messages are handled by a
special purpose channel driver (Message) in the dialplan. Various
functions (MESSAGE, MESSAGE_DATA) allow for extraction of message
information from the received text message.
While the existing process works, there's some drawbacks to it.
(1) The dialplan is not an ideal place to process a text message.
Doing a lot of string manipulations in the dialplan is not much fun.
(2) Dispatching the channel servicing the message to a Stasis dialplan
application (or to AGI, or any other externally controlled entity) is
not ideal, as only a single instance of the channel driver exists to
serve all messages. What's more, as a special purpose channel driver,
there are many operations that could be executed on a 'normal' channel
that would have odd effects on the Message channel. This creates a
burden on the consumer of Asterisk to know what is acceptable and what
is not.
Ideally, we'd have a mechanism in ARI to send messages to SIP/XMPP
endpoints/URIs and to be notified over the WebSocket when a message
arrives at Asterisk that an application is interested in. This would
never hit the dialplan: posting to a REST resource to send a message
would get dispatched to the appropriate channel driver immediately;
receiving a message would simply send an event out over the WebSocket.
This should be possible with only minimal changes in Asterisk's messaging core.
I've written a proposal up on the wiki for this here:
https://wiki.asterisk.org/wiki/x/ew6wAQ
---- The highlights ----
Allow sending a message to an endpoint through the endpoints resource:
POST /endpoints/PJSIP/alice/message
{
"from": "pjsip:bob",
"body": "I am the very model of a major general"
"variables": [
{ "X-Foo-Bar": "I am a special header" },
{ "X-Foo-Yack": "I am not" },
],
}
Alternatively, if who you are sending the message to is a bit more
arbitrary, simply send it directly to the technology and let the
technology sort it out:
POST /endpoints/PJSIP/message
{
"from": "xmpp:bob at jabber.org",
"to": "pjsip:generic/sip:alice at mysipserver.org"
"body": "No, *I* am the very model of a major general"
}
Subscribing to an endpoint subscribes you to messages that are sent
to/received from that endpoint:
{
"type": "MessageReceived",
"from": "pjsip:alice",
"to": "\"bob\" <bob at my_asterisk_server.org>",
"body": "Who's the major general now?",
"variables": [
{"SIP_RECVADDR", "127.0.0.1"},
],
}
And that's about it.
Enabling this functionality is pretty interesting - some SIP providers
transform SIP MESSAGE requests into SMS messages; an XMPP chat room
could be monitored such that a participant could choose to cause an
audio conference to be automatically created and all current
participants dialled; applications could use SIP and XMPP to send
arbitrary messages to their Asterisk server to control their ARI
application. Lots of 'unified communication' possibilities in there.
Thoughts & comments appreciated -
Matt
--
Matthew Jordan
Digium, Inc. | Engineering Manager
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
Check us out at: http://digium.com & http://asterisk.org
More information about the asterisk-app-dev
mailing list