Archive for the ‘PRISM’ Category

Announcing Voxeo PRISM Studio

Thursday, May 26th, 2011

Voxeo PRISM Studio is a set of free Eclipse plug-ins to help developers to develop real-time communication applications on top of Voxeo PRISM platform.

Currently it has following plug-ins.

  • Prism Development Tools
  • This plug-in has a set of wizards and editors to help developers quickly write SIP/XMPP/HTTP Servlet and Java Media Control applications. Seamlessly integrated with PRISM Server Adaptor and Log Viewer, this plug-in greatly simplifies the development, testing, debugging, and deployment of communication applications on top of Voxeo PRISM platform.

  • Moho Development Tools
  • This plug-in has a set of wizards and editors to help developers quickly write Moho based applications. Moho is an easy-to-use open-source framework for building real-time applications on top of the standard Servlet APIs. With Moho framework and the Moho Development Tools, it greatly reduces the complexity of the communication application development.

  • Prism Server Adaptor.
  • This is the Eclipse Web Tools Platform (WTP) server adaptor for Voxeo PRISM server. This allows developers to deploy PRISM or Moho projects in a similar way as they deploy a Web project to a Web server like Tomcat. It also redeploys the changes automatically.

  • Prism Log Viewer.
  • This plug-in provides a real-time structured view of log streams from all components of  Voxeo PRISM. It allows developers to test and debug PRISM or Moho applications without leaving Eclipse.

This version of Voxeo PRISM Studio requires Voxeo PRISM 10.x and Eclipse IDE for Java EE developer (Helios and above). Once you have both installed, you can follow the standard plug-in installation procedure in Eclipse to install Voxeo PRISM Studio from http://www.voxeo.com/prism/studio.

The follow video shows the steps to install and use Voxeo PRISM Studio.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Voxeo PRISM supports wideband VoIP now

Monday, May 9th, 2011

Voxeo PRISM 10.1 is available at www.voxeo.com/prism for download now.

One of the biggest changes in Voxeo PRISM 10.1 is to support some of wideband VoIP codecs. These wideband, sometimes referred as HD, codecs offer much better sound quality than the traditional codecs.

Here are the codecs Voxeo PRISM 10.1 can set up with the phones.

CODEC NAME SAMPLING RATE DESCRIPTION LICENSE
PCMA 8KHz G.711 alaw INCLUDED
PCMU 8KHz G.711 ulaw INCLUDED
G722 16KHz G.722 INCLUDED
G726-32 8KHz G.726 at 32Kbit/s INCLUDED
GSM 8KHz GSM 6.10 INCLUDED
L16 8/16KHz 16-bit Linear PCM INCLUDED
G729 8KHz G.729 ADDITIONAL
G729 8KHz G.729 Annex B ADDITIONAL
SPEEX 8/16/32KHz Speex INCLUDED
AMR 8KHz AMR-NB ADDITIONAL
AMR-WB 16KHz AMR-WB ADDITIONAL
telephone-event RFC 2833 INCLUDED

Voxeo PRISM 10.1 also supports the following file formats and codecs in playback and recording.

FILE NAME EXTENSION MIME TYPE SUPPORTED CODEC
.wav audio/wav G.711 alaw/ulaw
8/16-bit Linear PCM
Microsoft GSM
.ulaw audio/ulaw G.711 ulaw
.alaw audio/alaw G.711 alaw
.pcm audio/pcm 16 bit Linear PCM
.gsm audio/gsm GSM 6.10
.au audio/au G.711 alaw/ulaw
8/16-bit Linear PCM
.mp3 audio/mpeg MP3
.ogg audio/ogg Vorbis
Speex
.spx audio/ogg Speex
.amr audio/amr AMR
.awb audio/amr-wb AMR-WB


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


How to make Voxeo Prism to talk to PSTN?

Thursday, March 24th, 2011

If you have tried Click-To-Dial example, you might wonder if it is possible to call your home phone or cellular phone, besides the SIP phones. It is definitely possible with Voxeo Prism.

In SIP Servlet, a PSTN phone number is represented by a TelURL object based on RFC 3966. For example, here is the code snippet to generate a TelURL object for 407-555-1212.

  URI target = sipFactory.createURI("tel:+1-407-555-1212");

Once you have a TelURL, you can use it the same way as a SipURI, both of which are URI. When Voxeo Prism tries to send a SIP message to a TelURL, it will try to map the telephone number (in E.164 format) to a SIP address based on ENUM.

According to ENUM, a telephone number in E.164 format should be converted to a unique key based the following steps.

1. Remove all characters with the exception of the digits.  For
      example, given the E.164 number "+1-407-555-1212" (which would
      then have been converted into an AUS of "+14075551212"), this
      step would simply remove the leading '+', producing
      "14075551212".
2. Reverse the order of the digits.  Example: "21215557041"
3. Put dots ('.') between each digit.  Example:
      "2.1.2.1.5.5.5.7.0.4.1"
4. Append the string ".e164.arpa." to the end and interpret as a
      domain name.  Example: 2.1.2.1.5.5.5.7.0.4.1.e164.arpa.

Then the key is used to look up the corresponding SIP address in the DNS NAPTR records. E.g. the following record maps “+1-407-555-1212” to “sip:14075551212@example.com“.

$ORIGIN 2.1.2.1.5.5.5.7.0.4.1.e164.arpa.
       NAPTR 100 50 "u" "E2U+sip"             "!^(\\+14075551212)$!sip:\\1@example.com!"    .
       NAPTR 100 51 "u" "E2U+h323"            "!^\\+14075551000$!h323:operator@example.com!"    .
       NAPTR 100 52 "u" "E2U+email:mailto"    "!^.*$!mailto:info@example.com!"

By default, Voxeo Prism uses the default DNS server configured on the system to perform the ENUM lookup. However, it is possible to specify a specific DNS server for the ENUM lookup. You can even specify a different domain suffix instead of the default “e164.arpa“. Please see Voxeo Prism User Guide for more information on how to configure that.

While ENUM gives you complete control on how to map individual telephone number to different SIP address, another popular way to connect Voxeo Prism to PSTN is through a VoIP (SIP trunking) provider.

Voxeo Prism always looks up ENUM first. If no mapping is found in ENUM and a VoIP provider is configured, the SIP messages will sent to the VoIP provider. The following picture shows where you can configure the VoIP provider’s gateway information.

Obviously, Gateway’s Host, Port, and Protocol specify where the gateway is. If the gateway requires SIP registration, you further configure the Registration section. The registrar’s Host and Port is the same as gateway’s, unless specified differently. The User and Domain allows you to specify the Address-of-Record (AOR) for registration. The Auth User and Password allows you to specify credentials in case the registrar requires authentication.  For more information on specific fields, please refer to Voxeo Prism User Guide.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Click To Dial: a converged application on Voxeo Prism

Saturday, March 19th, 2011

Voxeo Prism is a converged application platform where you can mingle Web (HTTP) functionality with real-time communication (SIP or XMPP) functionality in a single programming model and application.

A classic example of converged application is Click-To-Dial, where the user can enter two telephone numbers in a web page and the web application calls each phone and connect them together.

In this blog, I will show how to build a simple Click-To-Dial application on Voxeo Prism that can connect two SIP softphones together.

Voxeo Prism supports both Java Servlet 2.5 API and JSP 2.1. It also supports SIP Servlet 1.1 API. So I built this application using JSP and SIP Servlet. Here is how the application, a.k.a. WAR, looks like.

Tutorial.4
   |-- WEB-INF
   |         |-- sip.xml
   |         |-- web.xml
   |         |-- xmpp.xml
   |         |-- sipmethod-application.xml
   |         |-- classes
   |                  |-- com/voxeo/prism/tutorial/four/Call.class
   |                  |-- com/voxeo/prism/tutorial/four/ClickToDialServlet.class
   |-- call.jsp
   |-- index.jsp
   |-- status.jsp
   |-- terminate.jsp
   |-- phone.jpg

Once the application is deployed on Voxeo Prism, go to http://localhost:8080/Tutorial.4 to open home page (index.jsp). It will look like the following.

Once you enter two reachable SIP addresses, e.g. sip:john@somedomain.com and sip:doe@otherdomain.com, and click the Call button. The call.jsp will be invoked to make the call to sip:john@somedomain.com and sip:doe@otherdomain.com respectively and join them together when both have answered.

The following diagram shows how the JSPs, Java objects, and SIP servlet interact with each other.

The logic of making outbound calls  are in the Call.call() method, as shown below. “_factory” is the SipFactory object. “_left” and “_right” are the URIs submitted from the index.jsp. “_servlet” is the name of the ClickToDialServlet defined in its annotation or deployment descriptor. By setting the servlet as  the handler of the session, the servlet will receive all messages for that session.

      _inviteL = _factory.createRequest(_session, "INVITE", _left, _right);
      _inviteR = _factory.createRequest(_session, "INVITE", _right, _left);
      _inviteL.setRequestURI(_right);
      _inviteR.setRequestURI(_left);
      _inviteL.getSession().setHandler(_servlet);
      _inviteL.getSession().setAttribute(Call.class.getName(), this);
      _inviteR.getSession().setHandler(_servlet);
      _inviteR.getSession().setAttribute(Call.class.getName(), this);
      _inviteL.send();
      _inviteR.send();

Once both phones have responded with 2xx answers, Call.connect() will generate ACK for each phone with the SDP from the other phone. If one of the phones returns an error response, the call is terminated. Here is the logic in Call.connect() method.

  synchronized void connect(SipServletResponse response) {
    SipServletResponse otherResponse = null;
    int code = response.getStatus();

    if (code < 200) {
      return;
    }

    if (_inviteL.getSession().equals(response.getSession())) {
      _responseL = response;
      otherResponse = _responseR;
    }
    else if (_inviteR.getSession().equals(response.getSession())) {
      _responseR = response;
      otherResponse = _responseL;
    }

    //TODO: handle 3xx for redirection
    if(code >= 300) {
      terminate();
      return;
    }

    if (otherResponse != null) {
      try {
        if (response.getStatus() >= 200 && response.getStatus() < 300 && otherResponse.getStatus() >= 200 && otherResponse.getStatus() < 300) {
          SipServletRequest ack = response.createAck();
          ack.setContent(otherResponse.getRawContent(), otherResponse.getContentType());
          SipServletRequest otherAck = otherResponse.createAck();
          otherAck.setContent(response.getRawContent(), response.getContentType());
          ack.send();
          otherAck.send();
          _state = State.CONNECTED;
        }
        // container automatically sends ACK in other cases.
      }
      catch (Exception e) {
        terminate();
      }
    }
  }

When the call is terminated, we have to send either CANCEL or BYE to each telephone. Based on RFC 3261, CANCEL should be sent before receiving the final response. The follow is the code to terminate the call to one telephone.

  private void terminate(SipServletRequest invite, SipServletResponse response) {
    try {
      if (invite != null) {
        if (invite.isCommitted()) {
          if (response == null) {
            invite.createCancel().send();
          }
          else {
            invite.getSession().createRequest("BYE").send();
          }
        }
      }
    }
    catch (Exception e) {
      // nothing we can do at this point
    }
  }

To try it out, download and deploy the application to <prism>/apps. Open the home page at http://localhost:8080/Tutorial.4. Make sure you type in valid and reachable SIP addresses. By default, PSTN telephone number won’t work unless VoIP gateway or ENUM are configured, which I will show you in the future blog.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


The Simplest Application on Voxeo Prism

Wednesday, January 26th, 2011

This is the simplest application on Voxeo Prism.

The content of the application is like the following

myapp
  |-- WEB-INF

That’s it!

Simply copying the myapp.war to <prism>/apps directory. The container will automatically detect that and load it up. When it loads myapp up, it will unpack the WAR into <prism>/apps/myapp directory.

Of course, this simplest application doesn’t do anything. Since Voxeo Prism is a converged SIP application server, it can handle both SIP and HTTP. The easiest way to make this application do something is to add an index.html page, as the following.

myapp
  |-- WEB-INF
  |-- index.html

You can simply create an index.html with your favorite text editor and copy it under <prism>/apps/myapp directory.

Here is what I put in my index.html

Hello, welcome to My Application!

And here is what I will see when I open http://localhost:8080/myapp

Try it out.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


How to Find Me or Follow Me?

Friday, January 7th, 2011

Virtual number with Find-Me and Follow-Me service is getting popular. The idea is you can give your friends and family a virtual number. Then you can register multiple phones, such as your cellphone, home phone, and work phone, to that virtual number. When people call your virtual number, the virtual number can ring your registered phones either one by one — Follow Me — or all at the same time — Find Me — until you pick up one of them.

In SIP world, your SIP address, e.g. sip:wchen@voxeo.com, essentially is the virtual number. You can register multiple SIP phones to your SIP address. To Find Me, simply proxy the call to all the registered addresses in parallel. To Follow Me, simply proxy the call to all the registered addresses sequentially.

In the Using SIP Servlet to implement SIP Registrar and Proxy Server blog, I described how registration and proxy works. With SIP Servlet, adding Find-Me and Follow-Me is trivial.

The following code was shown in that blog to demonstrate how SIP proxy works.

  @Override
  protected void doInvite(SipServletRequest req) throws ServletException, IOException {
    // application only has to worry about forwarding the initial request.
    // the rest is taken care by the container.
    if (req.isInitial()) {
      URI callee = req.getTo().getURI();
      Proxy proxy = req.getProxy();

      //let's see if the Location Service has bindings for this callee.
      List<URI> targets = _locator.getContacts(callee);
      if (targets.size() > 0) {
        // The Proxy Server should stay on the signaling path
        proxy.setRecordRoute(true);

        // Let the container handles all the 3xx redirect automatically
        proxy.setRecurse(true);

        // Try all the registered phones for this callee sequentially
        proxy.setParallel(false);

        //Yes, let's proxy the call to the registered phones.
        proxy.proxyTo(targets);
      }
      else {
        // Oops, no phone is registered right now. Let's do our best.
        proxy.proxyTo(callee);
      }
    }

When you have multiple phones registered, the above code essentially provides Follow-Me.

You can change one line — #19 –  to make this become Find-Me.

        proxy.setParallel(true);

What if you want to provide a PSTN virtual number and register PSTN numbers? SIP Servlet can work with either SIP URI and Telephone URL. So there is no difference as far as proxy code concerns. What you need is to connect the platform to a VoIP provider that can provide SIP-PSTN connectivity. In the future blog, I will show you how to configure Voxeo Prism to provide PSTN connectivity.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Using SIP Servlet to implement SIP Registrar and Proxy Server

Monday, November 29th, 2010

In “SIP Servlet Programming: Basic“, I showed you how to write a simple SIP Servlet application. In this blog, I will show you a more realistic application –a simple SIP Registrar and Proxy server .

SIP Registration and Proxy

SIP Registrar and Proxy servers play a central role in routing SIP calls among SIP phones.

As illustrated in the above diagram, a SIP phone registers to Registrar with its current address. Registration essentially establishes a binding between SIP phone’s logical address (e.g. sip:wchen@voxeo.com) to its physical address (e.g. sip:wchen@192.168.1.105).  The bindings are stored in a Location Service. When john@voxeo.com calls wchen@voxeo.com, Proxy looks up the Location Service to find the physical address of wchen@voxeo.com, where Proxy forwards the call. Please note Location Service here is a logical concept and is not necessarily a separated software entity.

Application Overview

The application includes two SIP servlets, one for SIP Registrar and one for SIP Proxy. Here is the application package layout.

  |-- WEB-INF
  |     |-- classes  (where all the java classes are)
  |     |   |-- com
  |     |       |-- voxeo
  |     |           |-- prism
  |     |               |-- tutorial
  |     |                   |-- two
  |     |                       |-- ProxyServer.class
  |     |                       |-- Registrar.class
  |     |                       |-- Binding.class
  |     |                       |-- LocationService.class
  |     |                       |-- IllegalRegistrationException.class
  |     |-- lib (where all the library JARs are, if any)
  |     |-- sip.xml (SIP deployment descriptor XML)
  |     |-- web.xml (HTTP deployment descriptor XML)
  |     |-- xmpp.xml (optional XMPP deployment descriptor XML)
  |     |-- sipmethod-application.xml (optional Prism deployment descriptor XML)
  |-- index.jsp (document files)

Implement a SIP Registrar

The overall SIP registration behavior is well defined in RFC 3261, section 10. Two of the key designs in implementing a SIP Registrar are the data model for the binding and processing logic for REGISTER message.

Data Model for Binding

A binding is created when a SIP phone registers itself to Registrar by sending a SIP REGISTER request. A binding essentially is entity with the following attributes.

Address of Record Contact URI Call ID CSeq Expiration
  • Address of Record (AOR): the logical address of the SIP phone.
  • Contact URI (Contact): the physical address of the SIP phone.
  • Call ID: the Call-ID associated with the SIP REGISTER request that creates this binding.
  • CSeq: the CSeq number associated with the SIP REGISTER request that creates this binding.
  • Expiration: the expiration time for this binding.

AOR and Contact are the composite key for a binding entity.

In this blog, I used a two-level Map to store all the bindings in memory for simplicity. In real world, you might persist the bindings to a relational data store.

Map<URI, Map<URI, Binding>>
     |        |       |
    AOR    Contact Binding

The first level Map allows look-up of all bindings given an AOR. The second level Map allows look-up a binding given a specific Contact. The Binding class encapsulates the binding entity. The AOR is not encapsulated inside the Binding class since it is already the key in the map.

Registration Processing

RFC 3261, section 10.3 describes 8 steps for processing a SIP REGISTER request.  In this blog, I implemented most of the requirements in a Registrar Servlet, as illustrated in the following flow chart.

Here is the corresponding Java code in Registrar servlet.

  @Override
  protected synchronized void doRegister(SipServletRequest req) throws ServletException, IOException {
    // TODO 1: request URI format validation
    // TODO 2: domain validation
    // TODO 3: Require validation
    // TODO 4: Multiple contact headers support

    // get the Address-of-Record (AOR) for this REGISTER request.
    URI aor = req.getTo().getURI();

    // get the Contact for this REGISTER request, assuming there is at most one.
    Address contact = req.getAddressHeader("Contact");

    // get the bindings map for the AOR, if no bindings map, initialize an empty one.
    Map<URI, Binding> bindings = _registrations.get(aor);
    if (bindings == null) {
      bindings = new HashMap<URI, Binding>();
      _registrations.put(aor, bindings);
    }

    try {
      // is there a Contact in this Request? If not, this is a fetch per RFC 3261 10.2.3
      if (contact != null) {
        // calculating the Expires for this Contact
        int expires = contact.getExpires();
        if (expires < 0) {
          expires = req.getExpires();
        }
        if (expires < 0) {
          expires = DEFAULT_EXPIRES;
        }

        // is this Contact a wildcard Contact? i.e."*".
        if (!contact.isWildcard()) {
          String callID = req.getCallId();
          int seq = Integer.parseInt(new StringTokenizer(req.getHeader("CSeq").trim()).nextToken());
          URI key = contact.getURI();

          // is there a binding existed for this URI already?
          Binding current = bindings.get(key);
          if (current != null) {
            // Now we have to compare the Call ID and CSeq of the new Contact and the existed Contact
            // per RFC 3261 10.3, step 7
            if (!current.getCallID().equals(callID) || current.getSeq() < seq) {
              if (expires != 0) {
                current.update(callID, seq, expires);
              }
              else {
                bindings.remove(key);
              }
            }
            else {
              throw new IllegalRegistrationException("Registration is out of order.");
            }
          }
          else if (expires > 0) {
            // since no existing binding, let's add the new binding
            bindings.put(key, new Binding(contact, callID, seq, expires));
          }
        }
        else if (expires == 0) {
          // Wildcard Contact can only removes the bindings for an AOR, per RFC 3261 10.3, step 6
          bindings.clear();
        }
        else {
          throw new IllegalRegistrationException("In violation of RFC 3261 10.2.2.");
        }
      }

      // valid response must enumerate all the current bindings, per RFC 3261 10.3, step 8
      SipServletResponse resp = req.createResponse(SipServletResponse.SC_OK);
      for (Binding b : bindings.values()) {
        Address addr = _factory.createAddress(b.getContact());
        addr.setExpires(b.getExpires());
        resp.addAddressHeader("Contact", addr, false);
      }
      resp.send();
    }
    catch (IllegalRegistrationException e) {
      req.createResponse(SipServletResponse.SC_SERVER_INTERNAL_ERROR, e.getMessage()).send();
    }
    finally {
      // REGISTER session should be invalidated since REGISTER request doesn't establish a SIP dialog.
      req.getApplicationSession().invalidate();
    }
  }

Please note, at the end of doRegister() method, the session is invalidated right away. This is because a REGISTER request does not establish a SIP dialog, per RFC 3261, section 10.2.

Implement a SIP Proxy

The overall SIP proxy behavior is well defined in RFC 3261, section 16. In SIP Servlet, only stateful Proxy is supported, which is most often used. Most of the proxy logic is already built within a SIP Servlet container. So writing a SIP proxy is really simple.

The following is how the ProxyServer servlet handles SIP INVITE messages.

  @Override
  protected void doInvite(SipServletRequest req) throws ServletException, IOException {
    // application only has to worry about forwarding the initial request.
    // the rest is taken care by the container.
    if (req.isInitial()) {
      URI callee = req.getTo().getURI();
      Proxy proxy = req.getProxy();

      //let's see if the Location Service has bindings for this callee.
      List<URI> targets = _locator.getContacts(callee);
      if (targets.size() > 0) {
        // The Proxy Server should stay on the signaling path
        proxy.setRecordRoute(true);

        // Let the container handles all the 3xx redirect automatically
        proxy.setRecurse(true);

        // Try all the registered phones for this callee sequentially
        proxy.setParallel(false);

        //Yes, let's proxy the call to the registered phones.
        proxy.proxyTo(targets);
      }
      else {
        // Oops, no phone is registered right now. Let's do our best.
        proxy.proxyTo(callee);
      }
    }

Servlet Selection

Since there are two servlets in this application, how does Voxeo Prism know Registar servlet will handle SIP REGISTER messages and Proxy servlet will handle SIP INVITE messages?

The trick is to specify the matching rules in the SIP deployment descriptor.

	<servlet-selection>
		<servlet-mapping>
			<servlet-name>Registrar</servlet-name>
			<pattern>
				<equal ignore-case="false">
					<var>request.method</var>
					<value>REGISTER</value>
				</equal>
			</pattern>
		</servlet-mapping>
		<servlet-mapping>
			<servlet-name>Proxy</servlet-name>
			<pattern>
				<and>
					<not>
						<equal ignore-case="false">
							<var>request.to.uri.user</var>
							<value>prism</value>
						</equal>
					</not>
					<equal ignore-case="false">
						<var>request.method</var>
						<value>INVITE</value>
					</equal>
				</and>
			</pattern>
		</servlet-mapping>
	</servlet-selection>

The above rules basically tell Voxe Prism that Registar servlet will take any SIP REGISTER requests, and Proxy servlet will take any SIP INVITE requests if the request URI’s user portion is not “prism”. The last condition is to avoid conflicts with the pre-installed Voxeo Prism demo application.

Please note that the rules are associated with servlet names, instead of servlet class name. The association between servlet names and servlet class names are defined via @SipServlet annotations in Registar servlet and Proxy servlet respectively.

Running the Application

First step is to download and install Voxeo Prism. Then download the application and copy the WAR file to your <where_prism_is_installed>/apps directory.

Now you can configure two phones to register Voxeo Prism. Here I show you how to configure two X-Lite softphones to test the application.

Please note that Proxy address is pointing to the where Voxeo Prsim is, e.g. 192.168.1.111.

Once both phones are registered, you can view the current bindings by going to http://192.168.1.111:8080/Tutorial.2/, as shown below.

Now the two phones can call each other by entering the name. E.g. calling john from my phone will look like the following.

Summary

In this blog and the tutorial application, I showed you how to implement a SIP Registrar and Proxy using SIP Servlet APIs.

Please note that the code is written mainly for simplicity and readability, instead of performance and scalability.

As an exercise, you can try to enhance it by completing the TODO items I listed in Registrar Servlet.

Enjoy!


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Test Drive Voxeo Prism

Tuesday, November 23rd, 2010

If you have followed my last blog, you should have Voxeo Prism installed and running by now.

In this blog, I want to show you how to use a SIP phone to test drive Voxeo Prism. Voxeo Prism comes with a demo application that demonstrates the following functions:

  • SIP voice call
  • DTMF input recognition
  • SIP instant messaging (using SIMPLE)
  • Text-to-Speech
  • Recording
  • Media playback

The following video shows how you can use XLite, a free softphone with both voice and instant messaging capabilities, to test drive Voxeo Prism.

In the future blog, I will show you how this demo application looks like.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


How to install Voxeo Prism?

Thursday, November 18th, 2010

Last blog introduced the basic concepts of Voxeo Prism communication platform. Here I will walk you through step by step on how to install Voxeo Prism.

System Requirements

Voxeo Prism requires a modern Intel based PC with at least 2G of RAM and 1G of free disk space. Voxeo Prism supports Windows (both 32 and 64 bit), Linux (CentOS, both 32 and 64 bit), and Mac.

Please note you must have root privilege on Linux and Mac in order to install Voxeo Prism.

Download Voxeo Prism

Voxeo Prism installers are available at http://www.voxeo.com/prism. Download one suitable for your system.

Install Voxeo Prism

The following are step-by-step instruction on installation. Note that the following screenshots are taken on Mac.

Step 1. Introduction.

Step 2. License Agreement. You must accept the License Agreement in order to install Voxeo Prism.

Step 3. Choose the installation directory. By default, Voxeo Prism is installed in /opt/voxeo/prism on both Linux and Mac, and \Program Files\Voxeo\Prism on Windows.

Step 4. Choose what services to install. By default, Voxeo Prism installs both Application Server service and Media Server service. By checking “Start services automatically”, Voxeo Prism services will be started after installation and when the system is booted up.

Step 5. Choose what modules to install. Modules are pre-built applications on top of Prism. Each module itself deserves another blog to talk about. Unless you are interested in specific modules, for the sake of simplicity, I would recommend not to install these modules.

Step 6. After review the “Pre-Installation Summary”, please click Install button.

Step 7. Installation is completed.

Start/Stop Voxeo Prism

Once the installation is completed, on Windows or Mac, you will also see a systray application being installed. This allows you to start/stop Voxeo Prism from a graphical user interface.

You may also start/stop Voxeo Prism via command line.

  • <prism>/bin/prism start
  • <prism>/bin/prism stop

You may also start/stop individual Voxeo Prism service — Application Server and Media Server — respectively. Please refer to the User Guide for more details.

Prism Home Page

Once Voxeo Prism is started, clicking the “Prism Home” menu item on the systray application will open up the Prism Home page in your web browser. Or simply go to http://localhost:8080 from your web browser.

From the Prism Home page, you can access Read Me, User Guide, Prism Management Console, and Samples. You can also register your Voxeo Prism installation with Voxeo from the Prism Home page.

Prism Management Console

Clicking “Prism Management Console” link in the Prism Home page will open up the Prism Management Console. The default login name and password are admin and admin respectively.

Prism Management Console allows you configure, manage, and monitor the Voxeo Prism and the applications.

For more details about Prism Management Console, please refer to the User Guide.

By now, Voxeo Prism should be installed and running on your system. In the next blog, I will show you how to use the Prism Demo Application to test drive Voxeo Prism.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Introduction to Voxeo Prism

Thursday, November 18th, 2010

Voxeo Prism is carrier-grade converged communication platform. It supports both Web technologies and communication technologies such as SIP and XMPP.  It comes with full media capabilities such as media playback and recording, as well as multi-party conferencing. It also supports advanced speech technologies such as text-to-speech and speech recognition.

Voxeo Prism can be used for various applications, from traditional softswitch and call center to real-time social networking applications. Voxeo Prism is built from the ground up with performance and scalability in mind.  It can support up to 40,000 concurrent calls at 1,000 call attempts per second (CAPS) on a single high performance Intel server.

You may wonder how Voxeo Prism compares with Voxeo Prophecy and Voice Object products. In short, Voxeo Prism provides a flexible and powerful general-purpose API-driven development platform for communication applications. Voxeo Prophecy, on the other hand, is an XML driven development platform for IVR-centric applications. Voice Object provides a drag-n-drop GUI development platform for IVR applications. Currently only Voxeo Prophecy and Voice Object application hosting is provided in Voxeo cloud.

From a technology stack point of view, Voxeo Prism is the cornerstone for Voxeo Prophecy and other Voxeo offerings such as Tropo and Phono. For example, a Voice Object application generates VoiceXML documents to be executed by Voxeo Prophecy, which, in turn, translates all the VoiceXML semantics into API calls on Voxeo Prism, as illustrated by the following diagram.

Voxeo Prism supports the following standard Java APIs. You can use any or all of these APIs in a single application to support multimodal use cases.

  • Java Servlet/JSP is the standard Java API for building web applications.
  • SIP Servlet is the standard Java API for building communication applications using SIP, such VoIP call centers.
  • XMPP Servlet is an API developed by Voxeo based on the Java Servlet framework for building XMPP based application such as instant messaging.
  • Java Media Control is the standard Java API for controlling media operations on a media server.

Voxeo Prism includes a HMP media server on Windows, Linux, and Mac. The media server supports the following media capabilities. All these capabilities can be manipulated through Java Media Control APIs.

  • media playback and text-to-speech.
  • DTMF detection and voice recognition.
  • media mixing and multiparty conferencing.
  • media recording or multi-track call recording.

In summary, Voxeo Prism is a powerful platform for innovative IP communication applications.  If you are a Java programmer and want to develop communication applications, Voxeo Prism is the right platform for you. To try out, simply go to www.voxeo.com/prism to download one of the installers for your desired platform. As always, Voxeo provides free 24×7 technical support for developers.

In the next blog, I will show you how to install Voxeo Prism on your system.


Want to learn how Voxeo can help unlock your communications and deliver a better customer experience? Please contact us!

If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.