MQTT with Java - a protocol for IoT and M2M communication ! Christian Götz, dc-square
IoT?
M2M IoT IoE WoT Web of Things Internet of Things Internet of Everything Machine to Machine communication Ubicomp Ubiquitous computing CPS Cyper Physical Systems Pervasive Computing
Technology that connects Devices over wired or wireless communication
GPSGPS GPS GPS GPS GPS GPS Detected: Traffic Jam!
Hi, I’m Christian Götz author & speaker building solutions CEO & co-founder developer @goetzchr
IoT is happening now WHY?
6,5 per person DEVICES outnumber people 0,0 15,0 30,0 45,0 60,0 2003 2010 2015 2020 50,0 25,0 12,5 0,5 6,0 19,5 33,0 46,5 60,0 2003 2010 2015 2020 7,67,36,86,3 250 new every sec http://blogs.cisco.com/news/cisco-connections-counter/ http://www.cisco.com/web/about/ac79/docs/innov/IoT_IBSG_0411FINAL.pdf 2020 in billions people devices
Open Hardware is everywhere Raspberry Pi is a trademark of the Raspberry Pi Foundation
Screenshot from JavaOne 2013 Java back to the roots
Screenshot from JavaOne 2013 Java back to the roots
HTTP is not suitable WHY?
Request/Response Point-2-Point widely known HTTP is too verbose
Challenges
Constrained devices Bi-directional Scalability Unreliable Networks Push Messaging Security … there are more ;) IoT HTTP IoT challenges
MQTT is a good fit WHY?
Subscribe
Publish
Temperaturfühler MQTT-Broker Laptop Mobiles Endgerät publish: “21°C“ publish: “21°C“ publish: “21°C“ subscribe subscribe
munich schwabing isarvorstadt people temp people temp / / MQTT topics 101
munich schwabing isarvorstadt people temp people temp / / munich/schwabing/temp MQTT topics 101
munich schwabing isarvorstadt people temp people temp / / munich/+/temp MQTT topics 101
munich schwabing isarvorstadt people temp people temp / / munich/schwabing/# MQTT topics 101
munich schwabing isarvorstadt people temp people temp / / # MQTT topics 101
On top of TCP Simple Publish/Subscribe Architecture BinaryMinimal Overhead Designed for unreliable networks Data agnostic MQTT facts
- Establishing 1st Connection
 (compensated after 5,5 min) + Reconnect + Maintaining Connection + Receiving Messages + Sending Messages less battery better throughput MQTT (with SSL) vs HTTPS + Less Overhead + Persistent Sessions + Pub/Sub Architecture Source: http://stephendnicholas.com/archives/1217
1999 2010 2013 2014 Arlen Nipper & Andy Stanford-Clark invent MQTT royalty free OASIS TC formed MQTT becomes Standard MQTT history
Push instead of Poll Minimal Bandwidth is important Mobile meets Enterprise Unreliable networks Constrained devices Low Latency MQTT use cases
MQTT real world usage https://www.facebook.com/notes/facebook- engineering/building-facebook-messenger/ 10150259350998920
Quality of Service Retained Messages Last Will and Testament Persistent Sessions Heartbeats Topic Wildcards MQTT features
MQTT features Quality of Services QoS 1 QoS 2 QoS 0 B B B
MQTT features Last Will and Testament B Connect LWT device123/status: „offline“ B dropped device123/status: „offline“
MQTT features w/o Retained Messages B device1/temp: „23,0“ device1 every 5 min device2 device1/temp: „23,0“ Delay <= 5min
MQTT features Retained Messages B device1/temp: „23,0“ R device1 every 5 min device2 device1/temp: „23,0“ R No Delay!
MQTT features Persistent Sessions B Connect Subscribe device/+/status device/12/status: „1“ 1st B Re-Connect device/12/status: „1“ 2nd
MQTT-SN Overview Gateway MQTT-Broker MQTT-SN MQTT / -SN • UDP instead of TCP • Topic is just an ID (Preregister/Register) • Sleeping Clients • Different types of Gateways • Discovery Mechanisms Devices B
MQTT over Websockets
MQTT Security Protocol Username/Password Transport TLS, client certificate authentification Broker fine-grained authentication, 3rd party integration
Broker implementations What ?
MQTT Broker Mosquitto Open Source Ideal for constraint devices Supports Bridging Written in C
MQTT Broker HiveMQ High performance broker Open Plugin System for Java Clustering Bridging Scalable to > 100.000 connections Native Websocket support
MQTT Broker + others http://mqtt.org/wiki/doku.php/brokers
MQTT Broker Public Broker www.mqttdashboard.com
Getting Started How ?
MQTT Implementation
Open Source “Reference Implementation” Many languages: Java, Javascript, Lua, C, C++, Go, Python Active Community JS Library uses MQTT over Websockets Paho facts
MqttClient client = new MqttClient( "tcp://localhost:1883", //URI "publisher", //Client ID new MemoryPersistence()); //Persistence Paho Init Connection
MqttClient client = new MqttClient(...); ! MqttConnectOptions connOptions = new MqttConnectOptions(); ! connOptions.setKeepAliveInterval(120); connOptions.setWill("my/status", "offline".getBytes(), 2, true); connOptions.setCleanSession(false); connOptions.setUserName("user"); connOptions.setPassword(„pass".toCharArray( )); ! client.connect(connOptions); Paho Init Connection
! ! client.publish("my/topic/123",//topic "Hello!".getBytes(), //message 1, //QoS false); //retained ! ! client.disconnect(); Paho Synchronous API
final MqttClient client = new MqttClient(...); client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) {} ! @Override public void messageArrived(String topic, MqttMessage message)throws Exception { System.out.println(new String(message.getPayload())); } ! @Override public void deliveryComplete(IMqttDeliveryToken token) {} }); ! client.connect(); client.subscribe("#"); Paho Synchronous API
MqttAsyncClient client = new MqttAsyncClient(...); client.connect(null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { try { client.publish(...); } catch (MqttException e) {} } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) {} }); ! client.disconnect(); Paho Asynchronous API
MQTT Implementation FuseSource MQTT Client
Open Source 3 API Styles Automatic Reconnect Maven Central Less active Community FuseSource facts
MQTT mqtt = new MQTT(); mqtt.setHost("localhost", 1883); mqtt.setClientId("publisher"); mqtt.setCleanSession(true); mqtt.setWillTopic("publisher/status"); mqtt.setWillMessage("offline"); mqtt.setKeepAlive((short) 60); mqtt.setUserName("mqtt-client"); mqtt.setPassword("mqtt"); FuseSource Init Connection
BlockingConnection connection = mqtt.blockingConnection(); ! connection.connect(); ! connection.publish( "publisher/status", // topic "online".getBytes(StandardCharsets.UTF_8), QoS.AT_MOST_ONCE, false); FuseSource Blocking API
FutureConnection connection = mqtt.futureConnection(); ! Future<Void> f1 = connection.connect(); f1.await(); ! Future<Void> f2 = connection.publish( "publisher/status", "online".getBytes(), QoS.AT_LEAST_ONCE, true); ! f2.await(); ! Future<Void> f3 = connection.disconnect(); f3.await(); FuseSource Future API
CallbackConnection connection = mqtt.callbackConnection(); connection.connect(new Callback<Void>() { public void onSuccess(Void v) { connection.publish( "publisher/status", "online".getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() { public void onSuccess(Void v) {} public void onFailure(Throwable value){} }); } ! public void onFailure(Throwable value) {} }); FuseSource Callback API
It’s Showtime Demo
Demo from device to the web with MQTT https://github.com/dc-square/mqtt-with-paho-eclipsecon2013 available on
Demo Under the hood
Danke! Thanks! @goetzchr

MQTT with Java - a protocol for IoT and M2M communication