MQTT and CoAP
MQTT and CoAP
MQTT
http://coap.technology/
https://tools.ietf.org/html/rfc7252
http://www.slideshare.net/zdshelby/coap-tutorial
CoAP URI
coap://[aaaa::c30c:0:0:1234]:5683/actuators/leds?color=b
Host Port Path Query
http://www.slideshare.net/paolopat/mqtt-iot-protocols-comparison
apps/er-coap
apps/rest-engine
apps/er-coap
apps/rest-engine
apps/er-coap
apps/rest-engine
Resource declaration
URI Query
examples/zolertia/tutorial/03-coap/resources/res-adxl345.c
Importing the Resource
Resource activation
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
Search resources to include
in the “resources” directory
examples/zolertia/tutorial/03-coap/resources/Makefile
https://addons.mozilla.org/en-US/firefox/addon/copper-270430/
http://people.inf.ethz.ch/mkovatsc/copper.php
Border Router
IPv6/6LoWPAN
er-example-server
CoAP server in Contiki OS
examples/zolertia/tutorial/02-ipv6/03-client-and-server
TIP: enable the DEBUG to 1 to print more information about the processes
taking place inside the CoAP and REST libraries (all .c files inside!)
apps/er-coap
apps/rest-engine
Pong! – check the CoAP server is online
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
Discover – learn the Resources the CoAP server has
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
Hover over the resources to learn its attributes
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
POST/PUT – change the LEDs state (on or off)
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
GET – read the ADXL345 with JSON format (application/json)
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
OBSERVE – get notifications about an event (press the user button)
examples/zolertia/tutorial/03-coap/resources/er-example-server.c
04-mqtt
• On top of TCP/IP
• Publish/Subscribe messaging pattern
• Message Broker distributes topics to clients
• Topics are UTF-8 string-based with hierarchical structure
• No direct connection between clients
• Quality of Service
• Retain-Flag: new subscribed clients will received last value
• Last Will: notify other clients when disconnected ungracefully
• KeepAlive: ping request messages to the bróker
• Clients have to know beforehand the structure of the data published to a
topic
• MQTT is data-agnostic
http://mqtt.org
CONNECT
Waits for a connection to be established with the server
DISCONNECT
Waits for the MQTT client to finish any pending task and closes the TCP session
SUBSCRIBE
Request the server to subscribe the client to one or more topics
UNSUBSCRIBE
Request the server to subscribe the client to one or more topics
PUBLISH
Updates a topic with data
http://www.hivemq.com/blog/how-to-get-started-with-mqtt
http://www.slideshare.net/paolopat/mqtt-iot-protocols-comparison
Topics starting with $ are special
These are reserved for the broker
statistics
http://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices
Required to be included in the process using MQTT
apps/mqtt
To start the MQTT client this function should be called first
The max_segment_size is the TCP chunk of data to be sent (default is 32 bytes)
The client_id is a string identifying the client
apps/mqtt
The keep_alive value is used by a timer waiting a PINGRES from the broken,
if expired and no response is obtained, it triggers a disconnection
apps/mqtt
Message ID (mid) is zero for QoS=0
apps/mqtt
apps/mqtt
apps/mqtt
Border Router
IPv6/6LoWPAN
mqtt-demo
The MQTT client publishing to the MQTT bróker
topic “zolertia/evt/status” and test.mosquitto.org
subscribed to “zolertia/cmd/leds”
mqtt_client.py
Paho MQTT client
Subscribed to the “zolertia/evt/status”
topic, used to check the example
examples/zolertia/tutorial/04-mqtt
examples/zolertia/tutorial/04-mqtt
static void
mqtt_event(struct mqtt_connection *m, mqtt_event_t event, void *data)
{
switch(event) {
case MQTT_EVENT_CONNECTED: {
printf("APP - Application has a MQTT connection\n");
state = STATE_CONNECTED;
break;
}
case MQTT_EVENT_DISCONNECTED: {
printf("APP - MQTT Disconnect. Reason %u\n", *((mqtt_event_t *)data));
state = STATE_DISCONNECTED;
process_poll(&mqtt_demo_process);case MQTT_EVENT_SUBACK: {
break; printf("APP - Application is subscribed to topic successfully\n");
} break;
case MQTT_EVENT_PUBLISH: { }
case MQTT_EVENT_UNSUBACK:
pub_handler(msg_ptr->topic, strlen(msg_ptr->topic), {
msg_ptr->payload_chunk,
msg_ptr->payload_length); printf("APP - Application is unsubscribed to topic successfully\n");
break; break;
} }
case MQTT_EVENT_PUBACK: {
printf("APP - Publishing complete.\n");
break;
}
}
examples/zolertia/tutorial/04-mqtt
DISCONNECTED: mqtt_disconnect(…)
STATE_INIT: mqtt_register(…)
STATE_REGISTERED: mqtt_connect(…)
STATE_CONNECTED: mqtt_subscribe(…)
examples/zolertia/tutorial/04-mqtt
Set default configuration values
examples/zolertia/tutorial/04-mqtt
TIP: enable the DEBUG to 1 to print more information about the processes
taking place inside the MQTT library
apps/mqtt/mqtt.c
MQTT demo client running on the Z1 mote
examples/zolertia/tutorial/04-mqtt
Antonio Liñán Colina
[email protected]
[email protected]
Twitter: @4Li6NaN
LinkedIn: Antonio Liñan Colina
github.com/alignan
hackster.io/alinan