<html>
<head>
    <base href="https://wiki.asterisk.org/wiki">
            <link rel="stylesheet" href="/wiki/s/en/2172/18/9/_/styles/combined.css?spaceKey=AST&amp;forWysiwyg=true" type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://wiki.asterisk.org/wiki/display/AST/Jabber+in+Asterisk">Jabber in Asterisk</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://wiki.asterisk.org/wiki/display/~mdavenport">Malcolm Davenport</a>
    </h4>
        <br/>
                         <h4>Changes (1)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-added-lines" style="background-color: #dfd;">{warning}This information applies to Asterisk 10 and earlier versions.  XMPP Support for Asterisk 11 has been completely rewritten{warning} <br> <br></td></tr>
            <tr><td class="diff-unchanged" >[XMPP|http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol] (Jabber) is an XML based protocol primarily for presence and messaging.  It is an open standard and there are several open server implementations, such as ejabberd, jabberd(2), openfire, and others, as well as several open source clients, Psi, gajim, gaim etc. XMPP differs from other IM applications as it is immensly extendable.  This allows us to easily integrate Asterisk with XMPP. The Asterisk XMPP Interface is provided by res_jabber.so. <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <div class='panelMacro'><table class='warningMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/forbidden.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>This information applies to Asterisk 10 and earlier versions.  XMPP Support for Asterisk 11 has been completely rewritten</td></tr></table></div>

<p><a href="http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" class="external-link" rel="nofollow">XMPP</a> (Jabber) is an XML based protocol primarily for presence and messaging.  It is an open standard and there are several open server implementations, such as ejabberd, jabberd(2), openfire, and others, as well as several open source clients, Psi, gajim, gaim etc. XMPP differs from other IM applications as it is immensly extendable.  This allows us to easily integrate Asterisk with XMPP. The Asterisk XMPP Interface is provided by res_jabber.so.</p>

<p><tt>res_jabber</tt> allows for Asterisk to connect to any XMPP (Jabber) server and is also used to provide the connection interface for <tt>chan_jingle</tt> and <tt>chan_gtalk</tt>.</p>

<p>Functions (<tt>JABBER_STATUS</tt>, <tt>JABBER_RECEIVE</tt>) and applications (<tt>JabberSend</tt>) are exposed to the dialplan.</p>

<p>You'll find examples of how to use these functions/applications hereafter. We assume that 'asterisk-xmpp' is properly configured in <tt>jabber.conf</tt>.</p>

<h5><a name="JabberinAsterisk-%7B%7BJabberSend%7D%7D"></a><tt>JabberSend</tt></h5>

<p><tt>JabberSend</tt> sends an XMPP message to a buddy. Example:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>extensions.ael</b></div><div class="codeContent panelContent">
<pre class="theme: Confluence; brush: plain; gutter: false">context default {
        _XXXX =&gt; {
              JabberSend(asterisk-xmpp,buddy@gmail.com,${CALLERID(name)} is calling ${EXTEN});
              Dial(SIP/${EXTEN}, 30);
              Hangup();
        }
}</pre>
</div></div>

<h5><a name="JabberinAsterisk-%7B%7BJABBERSTATUS%7D%7D"></a><tt>JABBER_STATUS</tt></h5>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>As of Asterisk 1.6.0, the corresponding application <tt>JabberStatus</tt> is still available, but marked as deprecated in favor of this function.</td></tr></table></div>

<p><tt>JABBER_STATUS</tt> stores the status of a buddy in a dialplan variable for further use. Here is an AEL example of how to use it:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>extensions.ael</b></div><div class="codeContent panelContent">
<pre class="theme: Confluence; brush: plain; gutter: false">1234 =&gt; {
        Set(STATUS=${JABBER_STATUS(asterisk-xmpp,buddy@gmail.com)});
        if (${STATUS}=1) {
                NoOp(User is online and active, ring his Gtalk client.);
                Dial(Gtalk/asterisk-xmpp/buddy@gmail.com);
        } else {
                NoOp(Prefer the SIP phone);
                Dial(SIP/1234);
        }
}</pre>
</div></div>

<h5><a name="JabberinAsterisk-%7B%7BJABBERRECEIVE%7D%7D"></a><tt>JABBER_RECEIVE</tt></h5>

<p><tt>JABBER_RECEIVE</tt> waits (up to X seconds) for a XMPP message and returns its content. Used along with <tt>JabberSend</tt> (or <tt>SendText</tt>, provided it's implemented in the corresponding channel type), <tt>JABBER_RECEIVE</tt> helps Asterisk interact with users while calls flow through the dialplan.</p>

<p><tt>JABBER_RECEIVE</tt>/<tt>JabberSend</tt> are not tied to the XMPP media modules <tt>chan_gtalk</tt> and <tt>chan_jingle</tt>, and can be used anywhere in the dialplan.  In the following example, calls targeted to extension 1234 (be it accessed from SIP, DAHDI or whatever channel type) are controlled by user bob@domain.com. Asterisk notifies him that a call is coming, and asks him to take an action. This dialog takes place over an XMPP chat.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>extensions.ael</b></div><div class="codeContent panelContent">
<pre class="theme: Confluence; brush: plain; gutter: false">context from-ext {
        1234 =&gt; {
                Answer();
                JabberSend(asterisk-xmpp,bob@jabber.org,Call from $CALLERID(num) - choose an option to process the call);
                JabberSend(asterisk-xmpp,bob@jabber.org,1 : forward to cellphone);
                JabberSend(asterisk-xmpp,bob@jabber.org,2 : forward to work phone);
                JabberSend(asterisk-xmpp,bob@jabber.org,Default action : forward to your voicemail);
                Set(OPTION=${JABBER_RECEIVE(asterisk-xmpp,bob@jabber.org,20)});
                switch (${OPTION}) {
                        case 1:
                                JabberSend(asterisk-xmpp,bob@jabber.org,(Calling cellphone...);
                                Dial(SIP/987654321);
                                break;
                        case 2:
                                JabberSend(asterisk-xmpp,bob@jabber.org,(Calling workphone...);
                                Dial(SIP/${EXTEN});
                                break;
                        default:
                                Voicemail(${EXTEN}|u)
                }
        }
}</pre>
</div></div>

<p>When calling from a GoogleTalk or Jingle client, the <tt>CALLERID(name)</tt> is set to the XMPP id of the caller (i.e. his JID). In the following example, Asterisk chats back with the caller identified by the caller id. We also take advantage of the <tt>SendText</tt> implementation in <tt>chan_gtalk</tt> (available in <tt>chan_jingle</tt>, and <tt>chan_sip</tt> as well), to allow the caller to establish SIP calls from his GoogleTalk client:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>extensions.ael</b></div><div class="codeContent panelContent">
<pre class="theme: Confluence; brush: plain; gutter: false">context gtalk-in {
        s =&gt; {
          NoOp(Caller id : ${CALLERID(all)});
          Answer();
          SendText(Please enter the number you wish to call);
          Set(NEWEXTEN=${JABBER_RECEIVE(asterisk-xmpp,${CALLERID(name)})});
          SendText(Calling ${NEWEXTEN} ...);
          Dial(SIP/${NEWEXTEN);
          Hangup();
        }
}</pre>
</div></div>

<p>The maintainer of <tt>res_jabber</tt> is Philippe Sultan &lt;philippe.sultan@gmail.com&gt;.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;" class="grey">
                        <a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=AST">Stop watching space</a>
            <span style="padding: 0px 5px;">|</span>
                <a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action">Change email notification preferences</a>
</div>
        <a href="https://wiki.asterisk.org/wiki/display/AST/Jabber+in+Asterisk">View Online</a>
        |
        <a href="https://wiki.asterisk.org/wiki/pages/diffpagesbyversion.action?pageId=4260008&revisedVersion=3&originalVersion=2">View Changes</a>
                |
        <a href="https://wiki.asterisk.org/wiki/display/AST/Jabber+in+Asterisk?showComments=true&amp;showCommentArea=true#addcomment">Add Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>