Welcome!

Java IoT Authors: Elizabeth White, Pat Romanski, Liz McMillan, Jamie Maidson, Yakov Fain

Related Topics: Java IoT

Java IoT: Article

Building an Instant Messaging Application Using Jabber/XMPP

An adventure with Smack and Wildfire

This article will describe our experiences with developing a Java-based instant messenger application using Jabber/XMPP (Extensible Messaging and Presence Protocol) - a free, open and public protocol and technology for instant messaging. According to the Jabber Software Foundation, "Under the hood, Jabber is a set of streaming XML protocols and technologies that enable any two entities on the Internet to exchange messages, presence, and other structured information in close to real-time."

Google Talk uses the standard Jabber/XMPP protocol for authenticating, presence, and messaging. But using Jabber goes beyond instant messaging to almost real-time server-to-server communication.

This article will describe the Jabber/XMPP protocol for messaging, the Jabber/XMPP client program based on JFace and Eclipse, and the Jabber/XMPP Java server. These will be illustrated through Open Source Smack and the Wildfire Server 2.4.4. It will offer examples of a login-class plug-in for custom authentication, a plug-in and server extension for custom messages, and a server-side extension for database interactions. Each example will contain the XML messages, client-side code, and server-side code.

What's Different About Jabber?
Compared to traditional IM programs, Jabber:

  1. Is an XML-based messaging protocol that is open and extensible
  2. It lets you build custom client IM applications. We'll talk about Smack, a project based on JFace and Eclipse that provides tools for building custom client applications
  3. It lets you extend the functionality of the server to process custom messages by writing server-side plug-ins. We'll describe the plug-in architecture of the Wildfire Server
What Are the Basic Features of Instant Messaging?
Any instant messaging system will have these basic features: It connects to server, registers new users, logs in, gets presence information, exchanges messages, and does custom interactions (VoIP, Web conferencing, etc.). Below each of these IM features are described using XMPP:

  • Connect to Server - This is done through a XML stream header exchange. The client sends:

    <stream to='192.168.0.12:5222' xmlns='jabber:client'/>

    The client receives:

    <stream id='xxxx' from:'192.168.0.12:5222' xmlns='jabber:
    client'/>

  • Register - The client sends a message to discover the server's requirements for registration:

    <iq type='get' id='reg1' to='192.168.0.12:5222'><query xmlns='jabber:iq:register'/></iq>

    The server responds with a message that lists the fields required for registration:

    <iq type='result' id='reg1'> <query xmlns='jabber:iq:register'>
          <instructions>

    Choose a username and password for use with this service.
    Please also provide your email address.        </instructions>
         <username/>
         <password/>
         <email/>
       </query></iq>

    The client responds by sending the requested information:

    <iq type='set' id='reg2'>
       <query xmlns='jabber:iq:register'>
         <username>a3</username>
         <password>password</password>
         <email>[email protected]</email>
       </query>
    </iq>

    On successful registration, the server responds:

    <iq type='result' id='reg2'/>

    Declare Presence and Get Presence Information
    To declare presence information, the client sends:

    <presence xmlns="" id="d6vNV-3" from="[email protected]/1139352545625"/>

    Note the "to" attribute isn't required in the above message because the client knows which server it's talking to.

    To get presence information, client sends:

    <iq xmlns="" id="d6vNV-2" type="get" from="[email protected]/1139352545625">
    <query xmlns="jabber:iq:roster"/>
    </iq>

    The server responds with presence data about two people in the roster:

    <iq xmlns="" type="result" id="d6vNV-2" to="[email protected]/1139352545625">
       <query xmlns="jabber:iq:roster">
          <item jid="[email protected]" name="Jorge" subscription="both"></item>
          <item jid="[email protected]" name="Dr. Bruce" subscription="both"></item>
       </query></iq>

    Exchange Messages
    User a1 sends message to user a2:

    <message xmlns="" id="H49LH-12" to="[email protected]" type="chat" from="a2 @sow/1139385809707">
         <body>Good Morning, I am testing chat in Jabber Client.</body>
    </message>

    The elements above form the core of XMPP (Extensible Messaging and Presence Protocol) XML syntax. It also gives you a sense of the flow of XML messages between the client and server to accomplish a task.

    Jabber/XMPP Client and Server
    Since Jabber/XMPP is an open protocol scores of implementations have been created for the client and server, some Open Source and others commercial. There are literally hundreds of Jabber clients available. (See References.)

    In this article we'll use the Smack library (www.jivesoftware.org/smack/) to illustrate client-side functionality. Smack provides an API for implementing the GUI and managing XML data. Managing XML data involves creating XML messages, sending the messages, receiving messages from the server, and processing the incoming messages.

    We'll use the Wildfire Server (www.jivesoftware.org/wildfire/) for illustrating creating server-side plug-ins. For basic IM needs, no server-side programming is required. For other needs Wildfire provides a plug-in architecture for extending the server's functionality. We'll look next at a use case to illustrate how custom messages can be created and processed at both the client and server.

    Use Case 1: Custom Authentication and Custom Queries
    Consider a case in which an IM client and a Web portal are part of a suite of collaboration applications. The Web portal has database-driven MD5-based authentication and the requirement is that IM client use the portal's authentication service. This will allow users to log in to IM and then launch applications on the portal from the IM client without logging into the portal.

    Part A: Custom Authentication
    The Wildfire Server uses the DefaultAuthProvider class to authenticate users and DefaultUserProvider to get user information. These use the database tables Wildfire provides.

    If you want to use a custom authentication method you'll have to change the user and authentication provider in wildfire.xml.

    <provider>
    <user> <className>org.indent.wildfire.user.SOWUserProvider</className> </user>
    <auth><className>org.indent.wildfire.auth.SOWAuthProvider</className> </auth>
    </provider>

    The simple extension defined in Listing 1 uses custom tables and custom encryption methods. The SOWUserProvider class is for user info and SOWAuthProvider is for authentication.

    The two static variables shown define the database authentication strings. And if custom encryption is used then the encryptPassword() method provides the encryption logic.

    Part B: Retrieving a Token from the Database
    In this use case, after authenticating, the client is going to ask the database for an encrypted token that uniquely identifies the client. This token is later used to launch applications in the Web portal without explicitly logging into the portal. The steps are:
    a)  The client generates a custom message to request a token
    b)  The server gets the message and processes the request by getting a token from the database. The server generates a reply message that contains the token and sends it to the requesting client
    c)  The client gets the message and extracts the token

    This process is illustrated in Figure 1.

    Client to Server
    The client generates a <iq> packet that looks like:

    <iq to="serverName" type="get"><query xmlns="jabber:iq:token"/></iq>

    jabber:iq:token is a namespace for our custom query. This message is generated at the client using the following code:

           XMPPConnection connection = session.getConnection();
           ClientID packet = new ClientID();
           connection.sendPacket(packet);

    The Class ClientID is defined in the section "Client-side Processing of Reply Packets" below.

    The Server-Side Plug-In
    The first step is to create a plug-in that will process the custom message with xmlns="jabber:iq:token." The plug-in is called ClientTokenPlugin. It first creates an IQTokenHandler; the handler is then added to the iq router that routes all the incoming iq messages:

    public class ClientTokenPlugin implements Plugin {
        public ClientTokenPlugin() {
           IQHandler iqRDHandler = new IQTokenHandler();
           IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
           iqRouter.addHandler(iqRDHandler);
        }
        public void initializePlugin(PluginManager manager, File pluginDirectory) { }
        public void destroyPlugin() { }
    }

    For more on how to create a plug-in, see www.jivesoftware.org/builds/wildfire/docs/ latest/documentation/plugin-dev-guide.html.

    IQTokenHandler has two key methods:

    a)  getInfo() which returns the type of queries in the iq messages that the token handler is going to process
    b)  handleIQ() which processes the incoming message/packet and creates a reply message/packet

    public class IQTokenHandler extends IQHandler {
       public IQTokenHandler() { super("Client Token Handler"); }
       public IQHandlerInfo getInfo() {
         return new IQHandlerInfo("query","jabber:iq:token"); }

       public IQ handleIQ(IQ packet) {
       IQ replyPacket = IQ.createResultIQ(packet);
       Element m = replyPacket.setChildElement("query", "jabber:iq:token");
    // 2 lines below are specific to our needs; change them to get data according to your needs
       ClientSession session = sessionManager.getSession(packet.getFrom());
       String token = (String)UserTokenList.get(JID.unescapeNode(session.getAddress().getNode().toLowerCase()));
       m.addElement("tokenNum").addText(token);
       return replyPacket;
       }
    }

    The reply message will look like:

    <iq to="clientName">
       <query xmlns="jabber:iq:token">
         <tokenNum>abcdefgh</tokenNum>
       </query></iq>


  • More Stories By Pramod Jain

    Pramod Jain is president of Innovative Decision Technologies, Inc. (INDENT, www.indent.org), in Jacksonville, FL. Their clients include Recruitmax, NASA, and NIH. Pramod has a PhD from the University of California, Berkeley.

    More Stories By Mahaveer Jain

    Mahaveer Jain is a lead programmer at INDENT. His expertise is in developing collaboration applications with Java technologies.

    Comments (2) View Comments

    Share your thoughts on this story.

    Add your comment
    You must be signed in to add a comment. Sign-in | Register

    In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


    Most Recent Comments
    SYS-CON Australia News Desk 06/23/06 09:05:30 AM EDT

    This article will describe our experiences with developing a Java-based instant messenger application using Jabber/XMPP (Extensible Messaging and Presence Protocol) - a free, open and public protocol and technology for instant messaging. According to the Jabber Software Foundation, 'Under the hood, Jabber is a set of streaming XML protocols and technologies that enable any two entities on the Internet to exchange messages, presence, and other structured information in close to real-time.'

    SYS-CON Australia News Desk 06/22/06 03:52:45 PM EDT

    This article will describe our experiences with developing a Java-based instant messenger application using Jabber/XMPP (Extensible Messaging and Presence Protocol) - a free, open and public protocol and technology for instant messaging. According to the Jabber Software Foundation, 'Under the hood, Jabber is a set of streaming XML protocols and technologies that enable any two entities on the Internet to exchange messages, presence, and other structured information in close to real-time.'

    @ThingsExpo Stories
    The essence of data analysis involves setting up data pipelines that consist of several operations that are chained together – starting from data collection, data quality checks, data integration, data analysis and data visualization (including the setting up of interaction paths in that visualization). In our opinion, the challenges stem from the technology diversity at each stage of the data pipeline as well as the lack of process around the analysis.
    The IoT is changing the way enterprises conduct business. In his session at @ThingsExpo, Eric Hoffman, Vice President at EastBanc Technologies, discuss how businesses can gain an edge over competitors by empowering consumers to take control through IoT. We'll cite examples such as a Washington, D.C.-based sports club that leveraged IoT and the cloud to develop a comprehensive booking system. He'll also highlight how IoT can revitalize and restore outdated business models, making them profitable...
    A strange thing is happening along the way to the Internet of Things, namely far too many devices to work with and manage. It has become clear that we'll need much higher efficiency user experiences that can allow us to more easily and scalably work with the thousands of devices that will soon be in each of our lives. Enter the conversational interface revolution, combining bots we can literally talk with, gesture to, and even direct with our thoughts, with embedded artificial intelligence, wh...
    The 19th International Cloud Expo has announced that its Call for Papers is open. Cloud Expo, to be held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, brings together Cloud Computing, Big Data, Internet of Things, DevOps, Containers, Microservices and WebRTC to one location. With cloud computing driving a higher percentage of enterprise IT budgets every year, it becomes increasingly important to plant your flag in this fast-expanding business opportunity. Submit y...
    SYS-CON Events announced today that MangoApps will exhibit at SYS-CON's 18th International Cloud Expo®, which will take place on June 7-9, 2016, at the Javits Center in New York City, NY. MangoApps provides modern company intranets and team collaboration software, allowing workers to stay connected and productive from anywhere in the world and from any device. For more information, please visit https://www.mangoapps.com/.
    Internet of @ThingsExpo, taking place November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with the 19th International Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world and ThingsExpo New York Call for Papers is now open.
    SYS-CON Events announced today that ContentMX, the marketing technology and services company with a singular mission to increase engagement and drive more conversations for enterprise, channel and SMB technology marketers, has been named “Sponsor & Exhibitor Lounge Sponsor” of SYS-CON's 18th Cloud Expo, which will take place on June 7-9, 2016, at the Javits Center in New York City, New York. “CloudExpo is a great opportunity to start a conversation with new prospects, but what happens after the...
    Designing IoT applications is complex, but deploying them in a scalable fashion is even more complex. A scalable, API first IaaS cloud is a good start, but in order to understand the various components specific to deploying IoT applications, one needs to understand the architecture of these applications and figure out how to scale these components independently. In his session at @ThingsExpo, Nara Rajagopalan is CEO of Accelerite, will discuss the fundamental architecture of IoT applications, ...
    In his session at 18th Cloud Expo, Bruce Swann, Senior Product Marketing Manager at Adobe, will discuss how the Adobe Marketing Cloud can help marketers embrace opportunities for personalized, relevant and real-time customer engagement across offline (direct mail, point of sale, call center) and digital (email, website, SMS, mobile apps, social networks, connected objects). Bruce Swann has more than 15 years of experience working with digital marketing disciplines like web analytics, social med...
    SYS-CON Events announced today that Enzu, a leading provider of cloud hosting solutions, will exhibit at SYS-CON's 18th International Cloud Expo®, which will take place on June 7-9, 2016, at the Javits Center in New York City, NY. Enzu’s mission is to be the leading provider of enterprise cloud solutions worldwide. Enzu enables online businesses to use its IT infrastructure to their competitive advantage. By offering a suite of proven hosting and management services, Enzu wants companies to foc...
    Customer experience has become a competitive differentiator for companies, and it’s imperative that brands seamlessly connect the customer journey across all platforms. With the continued explosion of IoT, join us for a look at how to build a winning digital foundation in the connected era – today and in the future. In his session at @ThingsExpo, Chris Nguyen, Group Product Marketing Manager at Adobe, will discuss how to successfully leverage mobile, rapidly deploy content, capture real-time d...
    IoT generates lots of temporal data. But how do you unlock its value? How do you coordinate the diverse moving parts that must come together when developing your IoT product? What are the key challenges addressed by Data as a Service? How does cloud computing underlie and connect the notions of Digital and DevOps What is the impact of the API economy? What is the business imperative for Cognitive Computing? Get all these questions and hundreds more like them answered at the 18th Cloud Expo...
    As cloud and storage projections continue to rise, the number of organizations moving to the cloud is escalating and it is clear cloud storage is here to stay. However, is it secure? Data is the lifeblood for government entities, countries, cloud service providers and enterprises alike and losing or exposing that data can have disastrous results. There are new concepts for data storage on the horizon that will deliver secure solutions for storing and moving sensitive data around the world. ...
    What a difference a year makes. Organizations aren’t just talking about IoT possibilities, it is now baked into their core business strategy. With IoT, billions of devices generating data from different companies on different networks around the globe need to interact. From efficiency to better customer insights to completely new business models, IoT will turn traditional business models upside down. In the new customer-centric age, the key to success is delivering critical services and apps wit...
    SYS-CON Events announced today that 24Notion has been named “Bronze Sponsor” of SYS-CON's 18th Cloud Expo, which will take place on June 7-9, 2016, at the Javits Center in New York, New York. 24Notion is full-service global creative digital marketing, technology and lifestyle agency that combines strategic ideas with customized tactical execution. With a broad understand of the art of traditional marketing, new media, communications and social influence, 24Notion uniquely understands how to con...
    WebRTC is bringing significant change to the communications landscape that will bridge the worlds of web and telephony, making the Internet the new standard for communications. Cloud9 took the road less traveled and used WebRTC to create a downloadable enterprise-grade communications platform that is changing the communication dynamic in the financial sector. In his session at @ThingsExpo, Leo Papadopoulos, CTO of Cloud9, will discuss the importance of WebRTC and how it enables companies to fo...
    SYS-CON Events announced today TechTarget has been named “Media Sponsor” of SYS-CON's 18th International Cloud Expo, which will take place on June 7–9, 2016, at the Javits Center in New York City, NY, and the 19th International Cloud Expo, which will take place on November 1–3, 2016, at the Santa Clara Convention Center in Santa Clara, CA. TechTarget is the Web’s leading destination for serious technology buyers researching and making enterprise technology decisions. Its extensive global networ...
    Korean Broadcasting System (KBS) will feature the upcoming 18th Cloud Expo | @ThingsExpo in a New York news documentary about the "New IT for the Future." The documentary will cover how big companies are transmitting or adopting the new IT for the future and will be filmed on the expo floor between June 7-June 9, 2016, at the Javits Center in New York City, New York. KBS has long been a leader in the development of the broadcasting culture of Korea. As the key public service broadcaster of Korea...
    With major technology companies and startups seriously embracing IoT strategies, now is the perfect time to attend @ThingsExpo 2016 in New York and Silicon Valley. Learn what is going on, contribute to the discussions, and ensure that your enterprise is as "IoT-Ready" as it can be! Internet of @ThingsExpo, taking place Nov 3-5, 2015, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 17th Cloud Expo and will feature technical sessions from a rock star conference faculty ...
    There are several IoTs: the Industrial Internet, Consumer Wearables, Wearables and Healthcare, Supply Chains, and the movement toward Smart Grids, Cities, Regions, and Nations. There are competing communications standards every step of the way, a bewildering array of sensors and devices, and an entire world of competing data analytics platforms. To some this appears to be chaos. In this power panel at @ThingsExpo, moderated by Conference Chair Roger Strukhoff, panelists will discuss the vast to...