Click here to close now.

Welcome!

JAVA IoT Authors: Carmen Gonzalez, Liz McMillan, Elizabeth White, John Wetherill, Sematext Blog

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="mahaveerj@sow/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="mahaveerj@sow/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="mahaveerj@sow/1139352545625">
       <query xmlns="jabber:iq:roster">
          <item jid="jorge@sow" name="Jorge" subscription="both"></item>
          <item jid="bruce@sow" name="Dr. Bruce" subscription="both"></item>
       </query></iq>

    Exchange Messages
    User a1 sends message to user a2:

    <message xmlns="" id="H49LH-12" to="a1@sow" 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
    All major researchers estimate there will be tens of billions devices - computers, smartphones, tablets, and sensors - connected to the Internet by 2020. This number will continue to grow at a rapid pace for the next several decades. With major technology companies and startups seriously embracing IoT strategies, now is the perfect time to attend @ThingsExpo, June 9-11, 2015, at the Javits Center in New York City. Learn what is going on, contribute to the discussions, and ensure that your enterprise is as "IoT-Ready" as it can be
    SYS-CON Events announced today that BMC will exhibit at SYS-CON's 16th International Cloud Expo®, which will take place on June 9-11, 2015, at the Javits Center in New York City, NY. BMC delivers software solutions that help IT transform digital enterprises for the ultimate competitive business advantage. BMC has worked with thousands of leading companies to create and deliver powerful IT management services. From mainframe to cloud to mobile, BMC pairs high-speed digital innovation with robust IT industrialization – allowing customers to provide amazing user experiences with optimized IT per...
    The Internet of Things is not only adding billions of sensors and billions of terabytes to the Internet. It is also forcing a fundamental change in the way we envision Information Technology. For the first time, more data is being created by devices at the edge of the Internet rather than from centralized systems. What does this mean for today's IT professional? In this Power Panel at @ThingsExpo, moderated by Conference Chair Roger Strukhoff, panelists will addresses this very serious issue of profound change in the industry.
    WebRTC defines no default signaling protocol, causing fragmentation between WebRTC silos. SIP and XMPP provide possibilities, but come with considerable complexity and are not designed for use in a web environment. In his session at @ThingsExpo, Matthew Hodgson, technical co-founder of the Matrix.org, discussed how Matrix is a new non-profit Open Source Project that defines both a new HTTP-based standard for VoIP & IM signaling and provides reference implementations.
    Buzzword alert: Microservices and IoT at a DevOps conference? What could possibly go wrong? In this Power Panel at DevOps Summit, moderated by Jason Bloomberg, the leading expert on architecting agility for the enterprise and president of Intellyx, panelists will peel away the buzz and discuss the important architectural principles behind implementing IoT solutions for the enterprise. As remote IoT devices and sensors become increasingly intelligent, they become part of our distributed cloud environment, and we must architect and code accordingly. At the very least, you'll have no problem fil...
    "People are a lot more knowledgeable about APIs now. There are two types of people who work with APIs - IT people who want to use APIs for something internal and the product managers who want to do something outside APIs for people to connect to them," explained Roberto Medrano, Executive Vice President at SOA Software, in this SYS-CON.tv interview at Cloud Expo, held Nov 4–6, 2014, at the Santa Clara Convention Center in Santa Clara, CA.
    Almost everyone sees the potential of Internet of Things but how can businesses truly unlock that potential. The key will be in the ability to discover business insight in the midst of an ocean of Big Data generated from billions of embedded devices via Systems of Discover. Businesses will also need to ensure that they can sustain that insight by leveraging the cloud for global reach, scale and elasticity.
    The 4th International Internet of @ThingsExpo, co-located with the 17th International Cloud Expo - to be held November 3-5, 2015, at the Santa Clara Convention Center in Santa Clara, CA - announces that its Call for Papers is open. The Internet of Things (IoT) is the biggest idea since the creation of the Worldwide Web more than 20 years ago.
    In their session at @ThingsExpo, Shyam Varan Nath, Principal Architect at GE, and Ibrahim Gokcen, who leads GE's advanced IoT analytics, focused on the Internet of Things / Industrial Internet and how to make it operational for business end-users. Learn about the challenges posed by machine and sensor data and how to marry it with enterprise data. They also discussed the tips and tricks to provide the Industrial Internet as an end-user consumable service using Big Data Analytics and Industrial Cloud.
    Building low-cost wearable devices can enhance the quality of our lives. In his session at Internet of @ThingsExpo, Sai Yamanoor, Embedded Software Engineer at Altschool, provided an example of putting together a small keychain within a $50 budget that educates the user about the air quality in their surroundings. He also provided examples such as building a wearable device that provides transit or recreational information. He then reviewed the resources available to build wearable devices at home including open source hardware, the raw materials required and the options available to power s...
    How do APIs and IoT relate? The answer is not as simple as merely adding an API on top of a dumb device, but rather about understanding the architectural patterns for implementing an IoT fabric. There are typically two or three trends: Exposing the device to a management framework Exposing that management framework to a business centric logic Exposing that business layer and data to end users. This last trend is the IoT stack, which involves a new shift in the separation of what stuff happens, where data lives and where the interface lies. For instance, it's a mix of architectural styles ...
    We certainly live in interesting technological times. And no more interesting than the current competing IoT standards for connectivity. Various standards bodies, approaches, and ecosystems are vying for mindshare and positioning for a competitive edge. It is clear that when the dust settles, we will have new protocols, evolved protocols, that will change the way we interact with devices and infrastructure. We will also have evolved web protocols, like HTTP/2, that will be changing the very core of our infrastructures. At the same time, we have old approaches made new again like micro-services...
    Connected devices and the Internet of Things are getting significant momentum in 2014. In his session at Internet of @ThingsExpo, Jim Hunter, Chief Scientist & Technology Evangelist at Greenwave Systems, examined three key elements that together will drive mass adoption of the IoT before the end of 2015. The first element is the recent advent of robust open source protocols (like AllJoyn and WebRTC) that facilitate M2M communication. The second is broad availability of flexible, cost-effective storage designed to handle the massive surge in back-end data in a world where timely analytics is e...
    Collecting data in the field and configuring multitudes of unique devices is a time-consuming, labor-intensive process that can stretch IT resources. Horan & Bird [H&B], Australia’s fifth-largest Solar Panel Installer, wanted to automate sensor data collection and monitoring from its solar panels and integrate the data with its business and marketing systems. After data was collected and structured, two major areas needed to be addressed: improving developer workflows and extending access to a business application to multiple users (multi-tenancy). Docker, a container technology, was used to ...
    The true value of the Internet of Things (IoT) lies not just in the data, but through the services that protect the data, perform the analysis and present findings in a usable way. With many IoT elements rooted in traditional IT components, Big Data and IoT isn’t just a play for enterprise. In fact, the IoT presents SMBs with the prospect of launching entirely new activities and exploring innovative areas. CompTIA research identifies several areas where IoT is expected to have the greatest impact.
    The Industrial Internet revolution is now underway, enabled by connected machines and billions of devices that communicate and collaborate. The massive amounts of Big Data requiring real-time analysis is flooding legacy IT systems and giving way to cloud environments that can handle the unpredictable workloads. Yet many barriers remain until we can fully realize the opportunities and benefits from the convergence of machines and devices with Big Data and the cloud, including interoperability, data security and privacy.
    The Internet of Things is tied together with a thin strand that is known as time. Coincidentally, at the core of nearly all data analytics is a timestamp. When working with time series data there are a few core principles that everyone should consider, especially across datasets where time is the common boundary. In his session at Internet of @ThingsExpo, Jim Scott, Director of Enterprise Strategy & Architecture at MapR Technologies, discussed single-value, geo-spatial, and log time series data. By focusing on enterprise applications and the data center, he will use OpenTSDB as an example t...
    Scott Jenson leads a project called The Physical Web within the Chrome team at Google. Project members are working to take the scalability and openness of the web and use it to talk to the exponentially exploding range of smart devices. Nearly every company today working on the IoT comes up with the same basic solution: use my server and you'll be fine. But if we really believe there will be trillions of these devices, that just can't scale. We need a system that is open a scalable and by using the URL as a basic building block, we open this up and get the same resilience that the web enjoys.
    We are reaching the end of the beginning with WebRTC, and real systems using this technology have begun to appear. One challenge that faces every WebRTC deployment (in some form or another) is identity management. For example, if you have an existing service – possibly built on a variety of different PaaS/SaaS offerings – and you want to add real-time communications you are faced with a challenge relating to user management, authentication, authorization, and validation. Service providers will want to use their existing identities, but these will have credentials already that are (hopefully) i...
    Container frameworks, such as Docker, provide a variety of benefits, including density of deployment across infrastructure, convenience for application developers to push updates with low operational hand-holding, and a fairly well-defined deployment workflow that can be orchestrated. Container frameworks also enable a DevOps approach to application development by cleanly separating concerns between operations and development teams. But running multi-container, multi-server apps with containers is very hard. You have to learn five new and different technologies and best practices (libswarm, sy...