SlideShare ist ein Scribd-Unternehmen logo
1 von 81
Downloaden Sie, um offline zu lesen
Sep 16th, 2008




TMC Communication Developer Conference



Developing SIP Applications

RJ Auburn
CTO
rj@voxeo.com
© Voxeo Corporation
Telephony
© Voxeo Corporation
Sucks
© Voxeo Corporation - Confidential
Complex
© Voxeo Corporation
Arcane
© Voxeo Corporation
Proprietary
© Voxeo Corporation
This is not
                      how it should be...


© Voxeo Corporation
Simple
© Voxeo Corporation
Ubiquitous
© Voxeo Corporation
Open
© Voxeo Corporation
What to do?



© Voxeo Corporation
Leverage The
                       Web Model
© Voxeo Corporation
Utilize Standards
© Voxeo Corporation
SOAP/REST
© Voxeo Corporation - Confidential
What Does It
                       Look Like?


© Voxeo Corporation
Application




                           API      XML        Tools



                                  Platform




16   © Voxeo Corporation
Application


                           JSR289,    CCXML
                            REST,        &         Designer
                            SOAP     VoiceXML


                                     Prophecy




17   © Voxeo Corporation
Application
                                 Application




                           API      XML        Tools



                                  Platform




18   © Voxeo Corporation
Building Blocks



© Voxeo Corporation
Session Initiation Protocol

- Session Initiation Protocol (SIP)
  defines how to establish a
  communication session between
  two endpoints
- Primarily used for voice, but can for IM or virtually
  any other protocol
- Almost always used in client/server configuration
  with quot;SIP proxiesquot; in control of quot;SIP endpointsquot;
    - Work going on in P2PSIP - see www.p2psip.org
- Text-based protocol, originally modeled on HTTP


 © Voxeo Corporation
SIP Communication

                      INVITE
        Alice         180 RINGING   Bob
                      200 OK
                      ACK




                      RTP (voice)



                      BYE
                      200 OK




© Voxeo Corporation
Proxy         Proxy
                               A     SIP     B
                         P




                                                   SIP
                      SI




          Alice                      RTP                 Bob




© Voxeo Corporation
SIP Resources

- Internet Engineering Task Force (IETF)
    - RFC 3261
    - Hitchhiker’s Guide to SIP
- Open Source Info
    - VoIP Info Wiki: www.voip-info.org
- Industry Sites
    - SIP Forum: www.sipforum.org
    - SIP Foundry: www.sipfoundry.org
    - OpenSBC:     www.opensourcesip.org




 © Voxeo Corporation
Open Source SIP Software

- Systems
    - Asterisk:        www.asterisk.org
    - sipXecs:         www.sipfoundry.org
    - FreeSWITCH:      www.freeswitch.org
    - OpenSER:         www.openser.org
- SIP Stacks
    - reSIProcate:     www.resiprocate.org
- Phones:
    - Gizmo:           www.gizmoproject.org


- MANY, many more: www.voip-info.org
 © Voxeo Corporation
Religion
© Voxeo Corporation
XML
© Voxeo Corporation
CCXML

- Call Control XML (CCXML) is the
  W3C standard for call control
  using XML
- Sister standard to VoiceXML
- Integrates with VoiceXML for dialog control
- Provides a framework for issuing call control
  commands and handling call control events


- http://www.w3.org/TR/ccxml/


 © Voxeo Corporation
© Voxeo Corporation
CCXML Hello World
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<ccxml version=quot;1.0quot;>
  <eventprocessor>

      <transition event=quot;connection.alertingquot;>
        <log expr=quot;'***** CONNECTION ALERTING *****'quot;/>
        <if cond=quot;event$.connection.remote == '8315551234'quot;>
          <reject/>
        <else/>
          <accept/>
        </if>
      </transition>

      <transition event=quot;connection.connectedquot;>
        <log expr=quot;'***** CALL WAS ANSWERED *****'quot;/>
      </transition>

      <transition event=”connection.disconnected”>
        <log expr=”‘*** Call was disconnected ***’”/>
        <exit/>
      </transition>

    <transition event=quot;error.*quot;>
      <log expr=quot;'an error has occured (' + event$.reason + ')'quot;/>
      <exit/>
    </transition>
  </eventprocessor>
</ccxml>
 © Voxeo Corporation
Java?
© Voxeo Corporation
SIP Servlets

     - Standard Java based API for writing SIP
       applications.
     - 1.0 standardized as JSR-116.
     - 2.0 just released as JSR-289
     - Extends the HTTP Servlet model to support SIP
       and telephony applications
     - http://www.sipservlet.com/
     - Supported by a large number of application
       servers including Oracle (BEA), IBM, Sun, Voxeo.



31    © Voxeo Corporation
Converged Applications
© Voxeo Corporation
JSR-309

     - Java Media Server API
     - Based on the CCXML media model
     - Still in draft stage
     - Provides dialog resources, conferencing, media
       routing to Java applications




33    © Voxeo Corporation
Example
                      Application
© Voxeo Corporation
Sample Application Overview

- Caller dials in to the application

- Caller is bridged to the subscriber

- Results of the call attempt are posted to Twitter
  via their REST API




                           35
 © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




36     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




37     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
         <ccxml version=quot;1.0quot; is id2=quot;incomingcallquot;/>
           <join id1=quot;event$.connectionidquot;
           <var name=quot;statusquot; expr=quot;'RJ     on the phone'quot;/>
                   xmlns=quot;http://www.w3.org/2002/09/ccxmlquot;>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </ccxml>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




38     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




39     © Voxeo Corporation
Follow Me/Find Me + Twitter
   <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
   <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
     <var name=quot;statequot; expr=quot;'init'quot;/>
     <var name=quot;incomingcallquot;/>
     <var name=quot;tURLquot;
          expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
     <eventprocessor statevariable=quot;statequot;>
       <transition event=quot;connection.alertingquot; state=quot;initquot;>
         <accept/>
       </transition>
       <transition event=quot;connection.connectedquot; state=quot;initquot;>
         <assign name=quot;statequot; expr=quot;'calling'quot;/>
         <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
         <createcall dest=quot;'tel:+18312392883'quot;/>
<var name=quot;statequot; expr=quot;'init'quot;/>
       </transition>
<var name=quot;incomingcallquot;/>
       <transition event=quot;connection.connectedquot; state=quot;callingquot;>
         <assign name=quot;statequot; expr=quot;'connected'quot;/>
<var name=quot;tURLquot;
         <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
         <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
         <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
               target=quot;tURLquot; namelist=quot;statusquot;/>
       </transition>
       <transition event=quot;connection.failedquot; state=quot;callingquot;>
<eventprocessor statevariable=quot;statequot;> his phone'quot;/>
         <assign name=quot;statequot; expr=quot;'done'quot;/>
         <var name=quot;statusquot; expr=quot;'RJ is not answering
</eventprocessor>
         <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
               target=quot;tURLquot; namelist=quot;statusquot;/>
       </transition>
       <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
         <assign name=quot;statequot; expr=quot;'done'quot;/>
         <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
         <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
               target=quot;tURLquot; namelist=quot;statusquot;/>
       </transition>
       <transition event=quot;send.successfulquot; state=quot;donequot;>
         <exit/>
       </transition>
     </eventprocessor>
   </ccxml>




 40   © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




41     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
        <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <accept/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
        </transition>
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




42     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




43     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
      <transition event=quot;connection.connectedquot; state=quot;initquot;>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
         <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
         <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
      </transition>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




44     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




45     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
      <transition dest=quot;'tel:+18312392883'quot;/>
           <createcall event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>

         <assign name=quot;statequot; expr=quot;'connected'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
         <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <assign name=quot;statequot; expr=quot;'connected'quot;/> id2=quot;incomingcallquot;/>
           <join
                 id1=quot;event$.connectionidquot;
         <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
         <send target=quot;tURLquot; namelist=quot;statusquot;/> name=quot;'update'quot;
                 targettype=quot;'basichttp'quot;
         </transition>
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
      </transition>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




46     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




47     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
     <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
       <assigntargettype=quot;'basichttp'quot; name=quot;'update'quot;
           <send   name=quot;statequot; expr=quot;'done'quot;/>
                 target=quot;tURLquot; namelist=quot;statusquot;/>
       <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
       <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <sendtarget=quot;tURLquot; namelist=quot;statusquot;/>
                 targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
     </transition>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




48     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




49     © Voxeo Corporation
Follow Me/Find Me + Twitter
      <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
      <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
        <var name=quot;statequot; expr=quot;'init'quot;/>
        <var name=quot;incomingcallquot;/>
        <var name=quot;tURLquot;
             expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
        <eventprocessor statevariable=quot;statequot;>
          <transition event=quot;connection.alertingquot; state=quot;initquot;>
            <accept/>
          </transition>
          <transition event=quot;connection.connectedquot; state=quot;initquot;>
            <assign name=quot;statequot; expr=quot;'calling'quot;/>
            <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
            <createcall dest=quot;'tel:+18312392883'quot;/>
          </transition>
          <transition event=quot;connection.connectedquot; state=quot;callingquot;>
     <transition name=quot;statequot; expr=quot;'connected'quot;/>
            <assign
            <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> state=quot;connectedquot;>
                      event=quot;connection.disconnectedquot;
       <assignname=quot;statusquot; expr=quot;'RJ isname=quot;'update'quot;
            <var                             on the phone'quot;/>
                  name=quot;statequot; expr=quot;'done'quot;/>
            <send targettype=quot;'basichttp'quot;
                  target=quot;tURLquot; namelist=quot;statusquot;/>
       <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
          </transition>
          <transition event=quot;connection.failedquot; state=quot;callingquot;>
       <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
            <assign name=quot;statequot; expr=quot;'done'quot;/>
            <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
                target=quot;tURLquot; namelist=quot;statusquot;/>
            <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
     </transition>target=quot;tURLquot; namelist=quot;statusquot;/>
          </transition>
          <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
            <assign name=quot;statequot; expr=quot;'done'quot;/>
            <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
            <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                  target=quot;tURLquot; namelist=quot;statusquot;/>
          </transition>
          <transition event=quot;send.successfulquot; state=quot;donequot;>
            <exit/>
          </transition>
        </eventprocessor>
      </ccxml>




50      © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




51     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
            <transition event=quot;send.successfulquot; state=quot;donequot;>
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
               <exit/>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
            </transition>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




52     © Voxeo Corporation
Follow Me/Find Me + Twitter
     <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
     <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;>
       <var name=quot;statequot; expr=quot;'init'quot;/>
       <var name=quot;incomingcallquot;/>
       <var name=quot;tURLquot;
            expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/>
       <eventprocessor statevariable=quot;statequot;>
         <transition event=quot;connection.alertingquot; state=quot;initquot;>
           <accept/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;initquot;>
           <assign name=quot;statequot; expr=quot;'calling'quot;/>
           <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/>
           <createcall dest=quot;'tel:+18312392883'quot;/>
         </transition>
         <transition event=quot;connection.connectedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'connected'quot;/>
           <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/>
           <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.failedquot; state=quot;callingquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;>
           <assign name=quot;statequot; expr=quot;'done'quot;/>
           <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/>
           <send targettype=quot;'basichttp'quot; name=quot;'update'quot;
                 target=quot;tURLquot; namelist=quot;statusquot;/>
         </transition>
         <transition event=quot;send.successfulquot; state=quot;donequot;>
           <exit/>
         </transition>
       </eventprocessor>
     </ccxml>




53     © Voxeo Corporation
We Got Java Bean!
© Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


55    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


56    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api; com.voxeo.rj.fmdemo;
          package
    List<URI> targets;
     public void init() throws ServletException {
           import java.io.IOException;
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
           import java.util.ArrayList;
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
           import java.util.List;
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }     import javax.servlet.ServletException;
            import javax.servlet.sip.*;
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if import net.unto.twitter.Api;
            (req.isInitial()) {
             Proxy proxy = req.getProxy();
            import net.unto.twitter.TwitterException;
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


57    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


58    © Voxeo Corporation
Follow Me/Find Me + Twitter
    package com.voxeo.rj.fmdemo;
    import     java.io.IOException;
    import     java.util.ArrayList;
    import     java.util.List;
    import     javax.servlet.ServletException;
    import     javax.servlet.sip.*;
    import     net.unto.twitter.Api;
    import     net.unto.twitter.TwitterException;
  public class FMServlet extends SipServlet {
public class FMServlet extends SipServlet
      Api twitter_api;
      List<URI> targets;                                              {
         public void init() ServletException {
         public void init() throws
                  throws ServletException {
             twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
             SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         } targets = new ArrayList<URI>();
             targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
                 targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
                 targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
         protected void doInvite(SipServletRequest req)
         }
                       throws ServletException, IOException {
         protected void doInvite(SipServletRequest req) throws ServletException,        IOException {
             if (req.isInitial()) {
         }       Proxy proxy = req.getProxy();
                         proxy.setRecordRoute(true);
                         proxy.setParallel(true);
                         proxy.proxyTo(targets);
         protected void doSuccessResponse(SipServletResponse resp)
             }
         }
                       throws IOException {
         } if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))resp) throws IOException {
         protected void doSuccessResponse(SipServletResponse
                 {
}                        try {
                             twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                                       + resp.getRequest().getRequestURI());
                         } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
                 }
         }
    }


    59       © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


60    © Voxeo Corporation
Follow Me/Find Me + Twitter
    package com.voxeo.rj.fmdemo;
    import   java.io.IOException;
    import   java.util.ArrayList;
    import   java.util.List;
    import   javax.servlet.ServletException;
    import   javax.servlet.sip.*;
    import   net.unto.twitter.Api;
    import   net.unto.twitter.TwitterException;
  public class FMServlet extends SipServlet {
Api twitter_api;
      Api twitter_api;
      List<URI> targets;
List<URI> void init() throws
    public targets;          ServletException {
       twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
       SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
public void init() throws ServletException {
       targets = new ArrayList<URI>();
       targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
 twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
       targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
       targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
 SipFactory sipFactory =
    }
          (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
    protected void doInvite(SipServletRequest req) throws ServletException, IOException {
        if (req.isInitial()) {
 targets = Proxy proxy = req.getProxy();
             new ArrayList<URI>();
            proxy.setRecordRoute(true);
 targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
            proxy.setParallel(true);
            proxy.proxyTo(targets);
 targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
        }
    }
 targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
         protected void doSuccessResponse(SipServletResponse resp) throws IOException {
}            if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
             {
                 try {
                     twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                               + resp.getRequest().getRequestURI());
                 } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
             }
         }
    }


    61    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


62    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api protected void doInvite(SipServletRequest
        twitter_api;                                               req) throws
    List<URI> targets;
     public void init() throws ServletException { {
         ServletException, IOException
              if (req.isInitial()) {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
                    Proxy proxy = req.getProxy();
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
                    proxy.setRecordRoute(true);
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }              proxy.setParallel(true);
     protected void proxy.proxyTo(targets);throws ServletException, IOException {
                    doInvite(SipServletRequest req)
         if (req.isInitial()) {
              }
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
         } proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


63    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


64    © Voxeo Corporation
Follow Me/Find Me + Twitter
    package com.voxeo.rj.fmdemo;
    import   java.io.IOException;
    import   java.util.ArrayList;
    import   java.util.List;
    import   javax.servlet.ServletException;
    import   javax.servlet.sip.*;
    import   net.unto.twitter.Api;
    import   net.unto.twitter.TwitterException;
 public class FMServlet extends SipServlet {
protected void doSuccessResponse(SipServletResponse
     Api twitter_api;
     List<URI> targets;                                                     resp)
                      throws IOException {
       public void init() throws ServletException {
     if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
           twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
           SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
     {     targets = new ArrayList<URI>();
           targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
       trytargets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
            {
           targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
       } twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
               + resp.getRequest().getRequestURI());
         protected void doInvite(SipServletRequest req) throws ServletException, IOException {
             if (req.isInitial()) {
         } catch(TwitterException e){log(quot;failed to update twitterquot;,e);}
                 Proxy proxy = req.getProxy();
                 proxy.setRecordRoute(true);
     }           proxy.setParallel(true);
                 proxy.proxyTo(targets);
}            }
         }
         protected void doSuccessResponse(SipServletResponse resp) throws IOException {
             if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
             {
                 try {
                     twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                               + resp.getRequest().getRequestURI());
                 } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
             }
         }
    }


    65    © Voxeo Corporation
Follow Me/Find Me + Twitter
package com.voxeo.rj.fmdemo;
import   java.io.IOException;
import   java.util.ArrayList;
import   java.util.List;
import   javax.servlet.ServletException;
import   javax.servlet.sip.*;
import   net.unto.twitter.Api;
import   net.unto.twitter.TwitterException;
public class FMServlet extends SipServlet {
    Api twitter_api;
    List<URI> targets;
     public void init() throws ServletException {
         twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;);
         SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY);
         targets = new ArrayList<URI>();
         targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;));
         targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;));
         targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;));
     }
     protected void doInvite(SipServletRequest req) throws ServletException, IOException {
         if (req.isInitial()) {
             Proxy proxy = req.getProxy();
             proxy.setRecordRoute(true);
             proxy.setParallel(true);
             proxy.proxyTo(targets);
         }
     }
     protected void doSuccessResponse(SipServletResponse resp) throws IOException {
         if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))
         {
             try {
                 twitter_api.updateStatus(quot;RJ is taking a phone call from quot;
                                           + resp.getRequest().getRequestURI());
             } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);}
         }
     }
}


66    © Voxeo Corporation
So why is this important?
© Voxeo Corporation
Phone Developers   Web Developers



                          Web Developers
© Voxeo Corporation
Web
© Voxeo Corporation
Ideas We have
                      Never Thought Of
© Voxeo Corporation
Standards Matter
© Voxeo Corporation
Example Usage
© Voxeo Corporation
Project Green Phone

- By Mark Headd
- http://www.voiceingov.org/blog/?p=135
- VoiceXML, JavaScript, CCXML, PHP
- Application:
  - Caller dials in to app
  - App uses ANI/Caller ID and makes web service
    query to a database to determine location
  - Makes another web service query to find location of
    nearest E85/Biodiesel stations
  - Relays information to caller
  - Sends caller a SMS text msg with info

 © Voxeo Corporation
Rocketsource.org
- www.rocketsource.org


- Vox-Attendant
   - A VoiceXML-based, speech-driven auto attendant that can connect callers
     with any person or group with an enterprise, via their desk, cellular, or
     VoIP phones.


- Vox-Mail
   - A VoiceXML-based, speech-driven voicemail application that can store
     messages locally or integrate with any IMAP email server to provide basic
     unified messaging.


- Voice Conference Manager
   - A VoiceXML and CCXML-based, speech-driven conference manager that
     features both phone and web-based conference call creation, access, and
     management.
   - VoiceXML, CCXML, grXML, JavaScript, Java, and Python
 © Voxeo Corporation
Wrapping Up
© Voxeo Corporation
Look at the big picture
© Voxeo Corporation                             http://flickr.com/photos/txd/100437832
More then one way to skin a cat!
© Voxeo Corporation
Avoid the Mouse Trap
© Voxeo Corporation
Be ready to scale
© Voxeo Corporation
© Voxeo Corporation
RJ Auburn
                      rj@voxeo.com
        http://www.voxeo.com/prophecy
           http://evolution.voxeo.com


© Voxeo Corporation

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (20)

Bernardette
BernardetteBernardette
Bernardette
 
Partes De La Computadora
Partes De La ComputadoraPartes De La Computadora
Partes De La Computadora
 
Gosto De Voce
Gosto De VoceGosto De Voce
Gosto De Voce
 
Plano
PlanoPlano
Plano
 
Presentacion Ti Cs
Presentacion Ti CsPresentacion Ti Cs
Presentacion Ti Cs
 
Tópicos Literarios
Tópicos LiterariosTópicos Literarios
Tópicos Literarios
 
Investipos
InvestiposInvestipos
Investipos
 
Aula02 Farmacia
Aula02 FarmaciaAula02 Farmacia
Aula02 Farmacia
 
Shopping
ShoppingShopping
Shopping
 
Tutorial De Slideshare
Tutorial De SlideshareTutorial De Slideshare
Tutorial De Slideshare
 
Atividades Dsesenvolvidas
Atividades DsesenvolvidasAtividades Dsesenvolvidas
Atividades Dsesenvolvidas
 
PC 4.3 Notes
PC 4.3 NotesPC 4.3 Notes
PC 4.3 Notes
 
Valerie
ValerieValerie
Valerie
 
0[1].Evita
0[1].Evita0[1].Evita
0[1].Evita
 
Planta
PlantaPlanta
Planta
 
Analise Imagem Edna Pereira Ap Taboado
Analise Imagem Edna Pereira Ap TaboadoAnalise Imagem Edna Pereira Ap Taboado
Analise Imagem Edna Pereira Ap Taboado
 
Logic
LogicLogic
Logic
 
PresentacióN 1 De Salud
PresentacióN 1 De SaludPresentacióN 1 De Salud
PresentacióN 1 De Salud
 
As Palavras
As PalavrasAs Palavras
As Palavras
 
Vivek Kundra: Creating the Digital Public Square / Forum One Web Executive Se...
Vivek Kundra: Creating the Digital Public Square / Forum One Web Executive Se...Vivek Kundra: Creating the Digital Public Square / Forum One Web Executive Se...
Vivek Kundra: Creating the Digital Public Square / Forum One Web Executive Se...
 

Ähnlich wie Developing SIP Applications

Voxeo Labs presentation at Mobicents Summit 2011
Voxeo Labs presentation at Mobicents Summit 2011Voxeo Labs presentation at Mobicents Summit 2011
Voxeo Labs presentation at Mobicents Summit 2011telestax
 
Getting a live_transcript_of_your_call_using_the_ari
Getting a live_transcript_of_your_call_using_the_ariGetting a live_transcript_of_your_call_using_the_ari
Getting a live_transcript_of_your_call_using_the_ariPascal Cadotte-Michaud
 
Apidaze WebRTC Workshop barcelona 21st april 2013
Apidaze WebRTC Workshop barcelona 21st april 2013Apidaze WebRTC Workshop barcelona 21st april 2013
Apidaze WebRTC Workshop barcelona 21st april 2013Alan Quayle
 
N2Y4 Mobile Challenge May 2009 San Jose
N2Y4 Mobile Challenge May 2009   San JoseN2Y4 Mobile Challenge May 2009   San Jose
N2Y4 Mobile Challenge May 2009 San JoseAdhearsion Foundation
 
Lets dance- Dutch Architecture Conference (LAC) 2018
Lets dance- Dutch Architecture Conference (LAC) 2018Lets dance- Dutch Architecture Conference (LAC) 2018
Lets dance- Dutch Architecture Conference (LAC) 2018Yenlo
 
What's New with Windows Phone - FoxCon Talk
What's New with Windows Phone - FoxCon TalkWhat's New with Windows Phone - FoxCon Talk
What's New with Windows Phone - FoxCon TalkSam Basu
 
From MSS to TelScale - Mobicents Summit 2011
From MSS to TelScale - Mobicents Summit 2011From MSS to TelScale - Mobicents Summit 2011
From MSS to TelScale - Mobicents Summit 2011telestax
 
Victor Charpenay | Standardized Semantics for an Open Web of Things
Victor Charpenay | Standardized Semantics for an Open Web of ThingsVictor Charpenay | Standardized Semantics for an Open Web of Things
Victor Charpenay | Standardized Semantics for an Open Web of Thingssemanticsconference
 
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)David Delabassee
 
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...Alan Quayle
 
Webex APIs for Administrators - CL20B - DEVNET-2610
Webex APIs for Administrators - CL20B - DEVNET-2610Webex APIs for Administrators - CL20B - DEVNET-2610
Webex APIs for Administrators - CL20B - DEVNET-2610Cisco DevNet
 
WebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyWebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyJose de Castro
 
Past, Present and Future of WebSocket - HTML5DevConf May 2014
Past, Present and Future of WebSocket - HTML5DevConf May 2014Past, Present and Future of WebSocket - HTML5DevConf May 2014
Past, Present and Future of WebSocket - HTML5DevConf May 2014Frank Greco
 
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016Cisco DevNet
 
CCXML For Advanced Communications Applications
CCXML For Advanced Communications ApplicationsCCXML For Advanced Communications Applications
CCXML For Advanced Communications ApplicationsVoxeo Corp
 
Jax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformJax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformWSO2
 

Ähnlich wie Developing SIP Applications (20)

Voxeo Labs presentation at Mobicents Summit 2011
Voxeo Labs presentation at Mobicents Summit 2011Voxeo Labs presentation at Mobicents Summit 2011
Voxeo Labs presentation at Mobicents Summit 2011
 
Getting a live_transcript_of_your_call_using_the_ari
Getting a live_transcript_of_your_call_using_the_ariGetting a live_transcript_of_your_call_using_the_ari
Getting a live_transcript_of_your_call_using_the_ari
 
Apidaze WebRTC Workshop barcelona 21st april 2013
Apidaze WebRTC Workshop barcelona 21st april 2013Apidaze WebRTC Workshop barcelona 21st april 2013
Apidaze WebRTC Workshop barcelona 21st april 2013
 
N2Y4 Mobile Challenge May 2009 San Jose
N2Y4 Mobile Challenge May 2009   San JoseN2Y4 Mobile Challenge May 2009   San Jose
N2Y4 Mobile Challenge May 2009 San Jose
 
Lets dance- Dutch Architecture Conference (LAC) 2018
Lets dance- Dutch Architecture Conference (LAC) 2018Lets dance- Dutch Architecture Conference (LAC) 2018
Lets dance- Dutch Architecture Conference (LAC) 2018
 
What's New with Windows Phone - FoxCon Talk
What's New with Windows Phone - FoxCon TalkWhat's New with Windows Phone - FoxCon Talk
What's New with Windows Phone - FoxCon Talk
 
Kamailio World 2014 - Kamailio - The Platform for Interoperable WebRTC
Kamailio World 2014 - Kamailio - The Platform for Interoperable WebRTCKamailio World 2014 - Kamailio - The Platform for Interoperable WebRTC
Kamailio World 2014 - Kamailio - The Platform for Interoperable WebRTC
 
From MSS to TelScale - Mobicents Summit 2011
From MSS to TelScale - Mobicents Summit 2011From MSS to TelScale - Mobicents Summit 2011
From MSS to TelScale - Mobicents Summit 2011
 
Victor Charpenay | Standardized Semantics for an Open Web of Things
Victor Charpenay | Standardized Semantics for an Open Web of ThingsVictor Charpenay | Standardized Semantics for an Open Web of Things
Victor Charpenay | Standardized Semantics for an Open Web of Things
 
Soa And Web Services Security
Soa And Web Services SecuritySoa And Web Services Security
Soa And Web Services Security
 
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
 
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...
Open Source Telecom Software is the Keystone of Our Industry, Alan Quayle, fo...
 
Webex APIs for Administrators - CL20B - DEVNET-2610
Webex APIs for Administrators - CL20B - DEVNET-2610Webex APIs for Administrators - CL20B - DEVNET-2610
Webex APIs for Administrators - CL20B - DEVNET-2610
 
Gfp Launch Sailfin Enables Sreeram
Gfp Launch Sailfin Enables SreeramGfp Launch Sailfin Enables Sreeram
Gfp Launch Sailfin Enables Sreeram
 
WebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyWebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco Strategy
 
Past, Present and Future of WebSocket - HTML5DevConf May 2014
Past, Present and Future of WebSocket - HTML5DevConf May 2014Past, Present and Future of WebSocket - HTML5DevConf May 2014
Past, Present and Future of WebSocket - HTML5DevConf May 2014
 
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016
DevNet @TAG - Spark & Tropo APIs - Milan/Rome May 2016
 
CCXML For Advanced Communications Applications
CCXML For Advanced Communications ApplicationsCCXML For Advanced Communications Applications
CCXML For Advanced Communications Applications
 
Jax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformJax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 Platform
 
Web services - REST and SOAP
Web services - REST and SOAPWeb services - REST and SOAP
Web services - REST and SOAP
 

Mehr von Voxeo Corp

Voxeo Summit Day 2 -What's new in CXP 14
Voxeo Summit Day 2 -What's new in CXP 14Voxeo Summit Day 2 -What's new in CXP 14
Voxeo Summit Day 2 -What's new in CXP 14Voxeo Corp
 
Voxeo Summit Day 2 -Voxeo APIs and SDKs
Voxeo Summit Day 2 -Voxeo APIs and SDKsVoxeo Summit Day 2 -Voxeo APIs and SDKs
Voxeo Summit Day 2 -Voxeo APIs and SDKsVoxeo Corp
 
Voxeo Summit Day 2 - Voxeo CXP - IVR on Steroids
Voxeo Summit Day 2 - Voxeo CXP - IVR on SteroidsVoxeo Summit Day 2 - Voxeo CXP - IVR on Steroids
Voxeo Summit Day 2 - Voxeo CXP - IVR on SteroidsVoxeo Corp
 
Voxeo Summit Day 2 - Using CXP hotspot analytics
Voxeo Summit Day 2 - Using CXP hotspot analyticsVoxeo Summit Day 2 - Using CXP hotspot analytics
Voxeo Summit Day 2 - Using CXP hotspot analyticsVoxeo Corp
 
Voxeo Summit Day 2 - Securing customer interactions
Voxeo Summit Day 2 - Securing customer interactionsVoxeo Summit Day 2 - Securing customer interactions
Voxeo Summit Day 2 - Securing customer interactionsVoxeo Corp
 
Voxeo Summit Day 2 - Real-time communications with WebRTC
Voxeo Summit Day 2 - Real-time communications with WebRTCVoxeo Summit Day 2 - Real-time communications with WebRTC
Voxeo Summit Day 2 - Real-time communications with WebRTCVoxeo Corp
 
Voxeo Summit Day 2 - Voxeo CXP for business users
Voxeo Summit Day 2 - Voxeo CXP for business usersVoxeo Summit Day 2 - Voxeo CXP for business users
Voxeo Summit Day 2 - Voxeo CXP for business usersVoxeo Corp
 
Voxeo Summit Day 2 - Creating raving fans
Voxeo Summit Day 2 - Creating raving fansVoxeo Summit Day 2 - Creating raving fans
Voxeo Summit Day 2 - Creating raving fansVoxeo Corp
 
Voxeo Summit Day 2 - Advanced CCXML topics
Voxeo Summit Day 2 - Advanced CCXML topicsVoxeo Summit Day 2 - Advanced CCXML topics
Voxeo Summit Day 2 - Advanced CCXML topicsVoxeo Corp
 
Voxeo Summit Day 2 - The science of customer obsession
Voxeo Summit Day 2 - The science of customer obsessionVoxeo Summit Day 2 - The science of customer obsession
Voxeo Summit Day 2 - The science of customer obsessionVoxeo Corp
 
Voxeo Summit Day 1 - Extending your IVR investment to mobile
Voxeo Summit Day 1 - Extending your IVR investment to mobileVoxeo Summit Day 1 - Extending your IVR investment to mobile
Voxeo Summit Day 1 - Extending your IVR investment to mobileVoxeo Corp
 
Voxeo Summit Day 1 - The Art of The Possible
Voxeo Summit Day 1 - The Art of The PossibleVoxeo Summit Day 1 - The Art of The Possible
Voxeo Summit Day 1 - The Art of The PossibleVoxeo Corp
 
Voxeo Summit Day 1 - Prophecy log search
Voxeo Summit Day 1 - Prophecy log searchVoxeo Summit Day 1 - Prophecy log search
Voxeo Summit Day 1 - Prophecy log searchVoxeo Corp
 
Voxeo Summit Day 1 - Customer experience analytics
Voxeo Summit Day 1 - Customer experience analyticsVoxeo Summit Day 1 - Customer experience analytics
Voxeo Summit Day 1 - Customer experience analyticsVoxeo Corp
 
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)Voxeo Corp
 
Voxeo Summit Day 1 - A view into the Voxeo cloud
Voxeo Summit Day 1 - A view into the Voxeo cloudVoxeo Summit Day 1 - A view into the Voxeo cloud
Voxeo Summit Day 1 - A view into the Voxeo cloudVoxeo Corp
 
Voxeo Summit Day 1 - Lessons learned from large scale deployments
Voxeo Summit Day 1 - Lessons learned from large scale deploymentsVoxeo Summit Day 1 - Lessons learned from large scale deployments
Voxeo Summit Day 1 - Lessons learned from large scale deploymentsVoxeo Corp
 
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?Voxeo Corp
 
How Do You Hear Me Now?
How Do You Hear Me Now?How Do You Hear Me Now?
How Do You Hear Me Now?Voxeo Corp
 
IPv6 and How It Impacts Communication Applications
IPv6 and How It Impacts Communication ApplicationsIPv6 and How It Impacts Communication Applications
IPv6 and How It Impacts Communication ApplicationsVoxeo Corp
 

Mehr von Voxeo Corp (20)

Voxeo Summit Day 2 -What's new in CXP 14
Voxeo Summit Day 2 -What's new in CXP 14Voxeo Summit Day 2 -What's new in CXP 14
Voxeo Summit Day 2 -What's new in CXP 14
 
Voxeo Summit Day 2 -Voxeo APIs and SDKs
Voxeo Summit Day 2 -Voxeo APIs and SDKsVoxeo Summit Day 2 -Voxeo APIs and SDKs
Voxeo Summit Day 2 -Voxeo APIs and SDKs
 
Voxeo Summit Day 2 - Voxeo CXP - IVR on Steroids
Voxeo Summit Day 2 - Voxeo CXP - IVR on SteroidsVoxeo Summit Day 2 - Voxeo CXP - IVR on Steroids
Voxeo Summit Day 2 - Voxeo CXP - IVR on Steroids
 
Voxeo Summit Day 2 - Using CXP hotspot analytics
Voxeo Summit Day 2 - Using CXP hotspot analyticsVoxeo Summit Day 2 - Using CXP hotspot analytics
Voxeo Summit Day 2 - Using CXP hotspot analytics
 
Voxeo Summit Day 2 - Securing customer interactions
Voxeo Summit Day 2 - Securing customer interactionsVoxeo Summit Day 2 - Securing customer interactions
Voxeo Summit Day 2 - Securing customer interactions
 
Voxeo Summit Day 2 - Real-time communications with WebRTC
Voxeo Summit Day 2 - Real-time communications with WebRTCVoxeo Summit Day 2 - Real-time communications with WebRTC
Voxeo Summit Day 2 - Real-time communications with WebRTC
 
Voxeo Summit Day 2 - Voxeo CXP for business users
Voxeo Summit Day 2 - Voxeo CXP for business usersVoxeo Summit Day 2 - Voxeo CXP for business users
Voxeo Summit Day 2 - Voxeo CXP for business users
 
Voxeo Summit Day 2 - Creating raving fans
Voxeo Summit Day 2 - Creating raving fansVoxeo Summit Day 2 - Creating raving fans
Voxeo Summit Day 2 - Creating raving fans
 
Voxeo Summit Day 2 - Advanced CCXML topics
Voxeo Summit Day 2 - Advanced CCXML topicsVoxeo Summit Day 2 - Advanced CCXML topics
Voxeo Summit Day 2 - Advanced CCXML topics
 
Voxeo Summit Day 2 - The science of customer obsession
Voxeo Summit Day 2 - The science of customer obsessionVoxeo Summit Day 2 - The science of customer obsession
Voxeo Summit Day 2 - The science of customer obsession
 
Voxeo Summit Day 1 - Extending your IVR investment to mobile
Voxeo Summit Day 1 - Extending your IVR investment to mobileVoxeo Summit Day 1 - Extending your IVR investment to mobile
Voxeo Summit Day 1 - Extending your IVR investment to mobile
 
Voxeo Summit Day 1 - The Art of The Possible
Voxeo Summit Day 1 - The Art of The PossibleVoxeo Summit Day 1 - The Art of The Possible
Voxeo Summit Day 1 - The Art of The Possible
 
Voxeo Summit Day 1 - Prophecy log search
Voxeo Summit Day 1 - Prophecy log searchVoxeo Summit Day 1 - Prophecy log search
Voxeo Summit Day 1 - Prophecy log search
 
Voxeo Summit Day 1 - Customer experience analytics
Voxeo Summit Day 1 - Customer experience analyticsVoxeo Summit Day 1 - Customer experience analytics
Voxeo Summit Day 1 - Customer experience analytics
 
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)
Voxeo Summit Day 1 - Communications-enabled Business Processes (CEBP)
 
Voxeo Summit Day 1 - A view into the Voxeo cloud
Voxeo Summit Day 1 - A view into the Voxeo cloudVoxeo Summit Day 1 - A view into the Voxeo cloud
Voxeo Summit Day 1 - A view into the Voxeo cloud
 
Voxeo Summit Day 1 - Lessons learned from large scale deployments
Voxeo Summit Day 1 - Lessons learned from large scale deploymentsVoxeo Summit Day 1 - Lessons learned from large scale deployments
Voxeo Summit Day 1 - Lessons learned from large scale deployments
 
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?
Voxeo Jam Session: What's New in Prophecy 11 and VoiceObjects 11?
 
How Do You Hear Me Now?
How Do You Hear Me Now?How Do You Hear Me Now?
How Do You Hear Me Now?
 
IPv6 and How It Impacts Communication Applications
IPv6 and How It Impacts Communication ApplicationsIPv6 and How It Impacts Communication Applications
IPv6 and How It Impacts Communication Applications
 

Kürzlich hochgeladen

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Kürzlich hochgeladen (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Developing SIP Applications

  • 1. Sep 16th, 2008 TMC Communication Developer Conference Developing SIP Applications RJ Auburn CTO rj@voxeo.com © Voxeo Corporation
  • 3. Sucks © Voxeo Corporation - Confidential
  • 7. This is not how it should be... © Voxeo Corporation
  • 11. What to do? © Voxeo Corporation
  • 12. Leverage The Web Model © Voxeo Corporation
  • 15. What Does It Look Like? © Voxeo Corporation
  • 16. Application API XML Tools Platform 16 © Voxeo Corporation
  • 17. Application JSR289, CCXML REST, & Designer SOAP VoiceXML Prophecy 17 © Voxeo Corporation
  • 18. Application Application API XML Tools Platform 18 © Voxeo Corporation
  • 20. Session Initiation Protocol - Session Initiation Protocol (SIP) defines how to establish a communication session between two endpoints - Primarily used for voice, but can for IM or virtually any other protocol - Almost always used in client/server configuration with quot;SIP proxiesquot; in control of quot;SIP endpointsquot; - Work going on in P2PSIP - see www.p2psip.org - Text-based protocol, originally modeled on HTTP © Voxeo Corporation
  • 21. SIP Communication INVITE Alice 180 RINGING Bob 200 OK ACK RTP (voice) BYE 200 OK © Voxeo Corporation
  • 22. Proxy Proxy A SIP B P SIP SI Alice RTP Bob © Voxeo Corporation
  • 23. SIP Resources - Internet Engineering Task Force (IETF) - RFC 3261 - Hitchhiker’s Guide to SIP - Open Source Info - VoIP Info Wiki: www.voip-info.org - Industry Sites - SIP Forum: www.sipforum.org - SIP Foundry: www.sipfoundry.org - OpenSBC: www.opensourcesip.org © Voxeo Corporation
  • 24. Open Source SIP Software - Systems - Asterisk: www.asterisk.org - sipXecs: www.sipfoundry.org - FreeSWITCH: www.freeswitch.org - OpenSER: www.openser.org - SIP Stacks - reSIProcate: www.resiprocate.org - Phones: - Gizmo: www.gizmoproject.org - MANY, many more: www.voip-info.org © Voxeo Corporation
  • 27. CCXML - Call Control XML (CCXML) is the W3C standard for call control using XML - Sister standard to VoiceXML - Integrates with VoiceXML for dialog control - Provides a framework for issuing call control commands and handling call control events - http://www.w3.org/TR/ccxml/ © Voxeo Corporation
  • 29. CCXML Hello World <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml version=quot;1.0quot;> <eventprocessor> <transition event=quot;connection.alertingquot;> <log expr=quot;'***** CONNECTION ALERTING *****'quot;/> <if cond=quot;event$.connection.remote == '8315551234'quot;> <reject/> <else/> <accept/> </if> </transition> <transition event=quot;connection.connectedquot;> <log expr=quot;'***** CALL WAS ANSWERED *****'quot;/> </transition> <transition event=”connection.disconnected”> <log expr=”‘*** Call was disconnected ***’”/> <exit/> </transition> <transition event=quot;error.*quot;> <log expr=quot;'an error has occured (' + event$.reason + ')'quot;/> <exit/> </transition> </eventprocessor> </ccxml> © Voxeo Corporation
  • 31. SIP Servlets - Standard Java based API for writing SIP applications. - 1.0 standardized as JSR-116. - 2.0 just released as JSR-289 - Extends the HTTP Servlet model to support SIP and telephony applications - http://www.sipservlet.com/ - Supported by a large number of application servers including Oracle (BEA), IBM, Sun, Voxeo. 31 © Voxeo Corporation
  • 33. JSR-309 - Java Media Server API - Based on the CCXML media model - Still in draft stage - Provides dialog resources, conferencing, media routing to Java applications 33 © Voxeo Corporation
  • 34. Example Application © Voxeo Corporation
  • 35. Sample Application Overview - Caller dials in to the application - Caller is bridged to the subscriber - Results of the call attempt are posted to Twitter via their REST API 35 © Voxeo Corporation
  • 36. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 36 © Voxeo Corporation
  • 37. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 37 © Voxeo Corporation
  • 38. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <ccxml version=quot;1.0quot; is id2=quot;incomingcallquot;/> <join id1=quot;event$.connectionidquot; <var name=quot;statusquot; expr=quot;'RJ on the phone'quot;/> xmlns=quot;http://www.w3.org/2002/09/ccxmlquot;> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </ccxml> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 38 © Voxeo Corporation
  • 39. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 39 © Voxeo Corporation
  • 40. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> <var name=quot;statequot; expr=quot;'init'quot;/> </transition> <var name=quot;incomingcallquot;/> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <var name=quot;tURLquot; <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <eventprocessor statevariable=quot;statequot;> his phone'quot;/> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering </eventprocessor> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 40 © Voxeo Corporation
  • 41. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 41 © Voxeo Corporation
  • 42. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <accept/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; </transition> target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 42 © Voxeo Corporation
  • 43. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 43 © Voxeo Corporation
  • 44. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <assign name=quot;statequot; expr=quot;'calling'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> </transition> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 44 © Voxeo Corporation
  • 45. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 45 © Voxeo Corporation
  • 46. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <transition dest=quot;'tel:+18312392883'quot;/> <createcall event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <assign name=quot;statequot; expr=quot;'connected'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <assign name=quot;statequot; expr=quot;'connected'quot;/> id2=quot;incomingcallquot;/> <join id1=quot;event$.connectionidquot; <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; <send target=quot;tURLquot; namelist=quot;statusquot;/> name=quot;'update'quot; targettype=quot;'basichttp'quot; </transition> target=quot;tURLquot; namelist=quot;statusquot;/> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> </transition> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 46 © Voxeo Corporation
  • 47. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 47 © Voxeo Corporation
  • 48. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <transition event=quot;connection.failedquot; state=quot;callingquot;> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <assigntargettype=quot;'basichttp'quot; name=quot;'update'quot; <send name=quot;statequot; expr=quot;'done'quot;/> target=quot;tURLquot; namelist=quot;statusquot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <sendtarget=quot;tURLquot; namelist=quot;statusquot;/> targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 48 © Voxeo Corporation
  • 49. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 49 © Voxeo Corporation
  • 50. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <transition name=quot;statequot; expr=quot;'connected'quot;/> <assign <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> state=quot;connectedquot;> event=quot;connection.disconnectedquot; <assignname=quot;statusquot; expr=quot;'RJ isname=quot;'update'quot; <var on the phone'quot;/> name=quot;statequot; expr=quot;'done'quot;/> <send targettype=quot;'basichttp'quot; target=quot;tURLquot; namelist=quot;statusquot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> target=quot;tURLquot; namelist=quot;statusquot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; </transition>target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 50 © Voxeo Corporation
  • 51. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 51 © Voxeo Corporation
  • 52. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; <transition event=quot;send.successfulquot; state=quot;donequot;> target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <exit/> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> </transition> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 52 © Voxeo Corporation
  • 53. Follow Me/Find Me + Twitter <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <ccxml xmlns=quot;http://www.w3.org/2002/09/ccxmlquot; version=quot;1.0quot;> <var name=quot;statequot; expr=quot;'init'quot;/> <var name=quot;incomingcallquot;/> <var name=quot;tURLquot; expr=quot;'http://zscgeek:password@twitter.com/statuses/update.xml'quot;/> <eventprocessor statevariable=quot;statequot;> <transition event=quot;connection.alertingquot; state=quot;initquot;> <accept/> </transition> <transition event=quot;connection.connectedquot; state=quot;initquot;> <assign name=quot;statequot; expr=quot;'calling'quot;/> <assign name=quot;incomingcallquot; expr=quot;event$.connectionidquot;/> <createcall dest=quot;'tel:+18312392883'quot;/> </transition> <transition event=quot;connection.connectedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'connected'quot;/> <join id1=quot;event$.connectionidquot; id2=quot;incomingcallquot;/> <var name=quot;statusquot; expr=quot;'RJ is on the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.failedquot; state=quot;callingquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is not answering his phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;connection.disconnectedquot; state=quot;connectedquot;> <assign name=quot;statequot; expr=quot;'done'quot;/> <var name=quot;statusquot; expr=quot;'RJ is off the phone'quot;/> <send targettype=quot;'basichttp'quot; name=quot;'update'quot; target=quot;tURLquot; namelist=quot;statusquot;/> </transition> <transition event=quot;send.successfulquot; state=quot;donequot;> <exit/> </transition> </eventprocessor> </ccxml> 53 © Voxeo Corporation
  • 54. We Got Java Bean! © Voxeo Corporation
  • 55. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 55 © Voxeo Corporation
  • 56. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 56 © Voxeo Corporation
  • 57. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; com.voxeo.rj.fmdemo; package List<URI> targets; public void init() throws ServletException { import java.io.IOException; twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); import java.util.ArrayList; targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); import java.util.List; targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } import javax.servlet.ServletException; import javax.servlet.sip.*; protected void doInvite(SipServletRequest req) throws ServletException, IOException { if import net.unto.twitter.Api; (req.isInitial()) { Proxy proxy = req.getProxy(); import net.unto.twitter.TwitterException; proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 57 © Voxeo Corporation
  • 58. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 58 © Voxeo Corporation
  • 59. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { public class FMServlet extends SipServlet Api twitter_api; List<URI> targets; { public void init() ServletException { public void init() throws throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); } targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); protected void doInvite(SipServletRequest req) } throws ServletException, IOException { protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { } Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); protected void doSuccessResponse(SipServletResponse resp) } } throws IOException { } if (resp.getMethod().equalsIgnoreCase(quot;invitequot;))resp) throws IOException { protected void doSuccessResponse(SipServletResponse { } try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 59 © Voxeo Corporation
  • 60. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 60 © Voxeo Corporation
  • 61. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; Api twitter_api; List<URI> targets; List<URI> void init() throws public targets; ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); public void init() throws ServletException { targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); SipFactory sipFactory = } (SipFactory)getServletContext().getAttribute(SIP_FACTORY); protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { targets = Proxy proxy = req.getProxy(); new ArrayList<URI>(); proxy.setRecordRoute(true); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); proxy.setParallel(true); proxy.proxyTo(targets); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); } } targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); protected void doSuccessResponse(SipServletResponse resp) throws IOException { } if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 61 © Voxeo Corporation
  • 62. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 62 © Voxeo Corporation
  • 63. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api protected void doInvite(SipServletRequest twitter_api; req) throws List<URI> targets; public void init() throws ServletException { { ServletException, IOException if (req.isInitial()) { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); Proxy proxy = req.getProxy(); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); proxy.setRecordRoute(true); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } proxy.setParallel(true); protected void proxy.proxyTo(targets);throws ServletException, IOException { doInvite(SipServletRequest req) if (req.isInitial()) { } Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); } proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 63 © Voxeo Corporation
  • 64. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 64 © Voxeo Corporation
  • 65. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { protected void doSuccessResponse(SipServletResponse Api twitter_api; List<URI> targets; resp) throws IOException { public void init() throws ServletException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); { targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); trytargets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); { targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { } catch(TwitterException e){log(quot;failed to update twitterquot;,e);} Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); } proxy.setParallel(true); proxy.proxyTo(targets); } } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 65 © Voxeo Corporation
  • 66. Follow Me/Find Me + Twitter package com.voxeo.rj.fmdemo; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.sip.*; import net.unto.twitter.Api; import net.unto.twitter.TwitterException; public class FMServlet extends SipServlet { Api twitter_api; List<URI> targets; public void init() throws ServletException { twitter_api = new Api(quot;zscgeekquot;, quot;passwordquot;); SipFactory sipFactory = (SipFactory)getServletContext().getAttribute(SIP_FACTORY); targets = new ArrayList<URI>(); targets.add(sipFactory.createURI(quot;sip:rj@voxeo.comquot;)); targets.add(sipFactory.createURI(quot;sip:rj@rjauburn.comquot;)); targets.add(sipFactory.createURI(quot;sip:8312392883@provider.comquot;)); } protected void doInvite(SipServletRequest req) throws ServletException, IOException { if (req.isInitial()) { Proxy proxy = req.getProxy(); proxy.setRecordRoute(true); proxy.setParallel(true); proxy.proxyTo(targets); } } protected void doSuccessResponse(SipServletResponse resp) throws IOException { if (resp.getMethod().equalsIgnoreCase(quot;invitequot;)) { try { twitter_api.updateStatus(quot;RJ is taking a phone call from quot; + resp.getRequest().getRequestURI()); } catch (TwitterException e) {log(quot;failed to update twitterquot;,e);} } } } 66 © Voxeo Corporation
  • 67. So why is this important? © Voxeo Corporation
  • 68. Phone Developers Web Developers Web Developers © Voxeo Corporation
  • 70. Ideas We have Never Thought Of © Voxeo Corporation
  • 72. Example Usage © Voxeo Corporation
  • 73. Project Green Phone - By Mark Headd - http://www.voiceingov.org/blog/?p=135 - VoiceXML, JavaScript, CCXML, PHP - Application: - Caller dials in to app - App uses ANI/Caller ID and makes web service query to a database to determine location - Makes another web service query to find location of nearest E85/Biodiesel stations - Relays information to caller - Sends caller a SMS text msg with info © Voxeo Corporation
  • 74. Rocketsource.org - www.rocketsource.org - Vox-Attendant - A VoiceXML-based, speech-driven auto attendant that can connect callers with any person or group with an enterprise, via their desk, cellular, or VoIP phones. - Vox-Mail - A VoiceXML-based, speech-driven voicemail application that can store messages locally or integrate with any IMAP email server to provide basic unified messaging. - Voice Conference Manager - A VoiceXML and CCXML-based, speech-driven conference manager that features both phone and web-based conference call creation, access, and management. - VoiceXML, CCXML, grXML, JavaScript, Java, and Python © Voxeo Corporation
  • 75. Wrapping Up © Voxeo Corporation
  • 76. Look at the big picture © Voxeo Corporation http://flickr.com/photos/txd/100437832
  • 77. More then one way to skin a cat! © Voxeo Corporation
  • 78. Avoid the Mouse Trap © Voxeo Corporation
  • 79. Be ready to scale © Voxeo Corporation
  • 81. RJ Auburn rj@voxeo.com http://www.voxeo.com/prophecy http://evolution.voxeo.com © Voxeo Corporation