Sample MQTT program - simple send and receive

Dependencies:   C12832 MQTT

Dependents:   MQTT_G_SENSOR

This program and the MQTT libraries it uses are part of the EclipseTM Paho project; specifically the embedded client.

This example and API are working, but are still in progress. Please give us your feedback.

HelloMQTT is an example of using the MQTT API. The MQTT API is portable across network interface stacks. MQTT is designed to be used with TCP/IP, but any transport with similar characteristics should be suitable.

HelloMQTT uses the NetworkInterface APIs in mbed OS 5 to show how this works. The MQTT library contains an MQTTNetwork.h header, which is a wrapper around the mbed networking interface. To switch between connectivity methods (the default is Ethernet) the easy-connect library is provided in this example application. You can change the connectivity method in mbed_app.json.

Adding new connectivity methods to the program is trivial, as long as they implement the mbed OS 5 NetworkStack API.

Committer:
icraggs
Date:
Thu May 22 23:58:34 2014 +0000
Revision:
9:5beb8609e9f7
Parent:
8:a3e3113054a1
Child:
12:086a9314e8a5
Latest version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
icraggs 1:a1d5c7a6acbc 1 /*******************************************************************************
icraggs 1:a1d5c7a6acbc 2 * Copyright (c) 2014 IBM Corp.
icraggs 1:a1d5c7a6acbc 3 *
icraggs 1:a1d5c7a6acbc 4 * All rights reserved. This program and the accompanying materials
icraggs 1:a1d5c7a6acbc 5 * are made available under the terms of the Eclipse Public License v1.0
icraggs 1:a1d5c7a6acbc 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
icraggs 1:a1d5c7a6acbc 7 *
icraggs 1:a1d5c7a6acbc 8 * The Eclipse Public License is available at
icraggs 1:a1d5c7a6acbc 9 * http://www.eclipse.org/legal/epl-v10.html
icraggs 1:a1d5c7a6acbc 10 * and the Eclipse Distribution License is available at
icraggs 1:a1d5c7a6acbc 11 * http://www.eclipse.org/org/documents/edl-v10.php.
icraggs 1:a1d5c7a6acbc 12 *
icraggs 1:a1d5c7a6acbc 13 * Contributors:
icraggs 1:a1d5c7a6acbc 14 * Ian Craggs - initial API and implementation and/or initial documentation
icraggs 1:a1d5c7a6acbc 15 *******************************************************************************/
icraggs 2:638c854c0695 16
icraggs 2:638c854c0695 17 /**
icraggs 2:638c854c0695 18 This is a sample program to illustrate the use of the MQTT Client library
icraggs 2:638c854c0695 19 on the mbed platform. The Client class requires two classes which mediate
icraggs 2:638c854c0695 20 access to system interfaces for networking and timing. As long as these two
icraggs 2:638c854c0695 21 classes provide the required public programming interfaces, it does not matter
icraggs 2:638c854c0695 22 what facilities they use underneath. In this program, they use the mbed
icraggs 2:638c854c0695 23 system libraries.
icraggs 2:638c854c0695 24
icraggs 2:638c854c0695 25 */
icraggs 1:a1d5c7a6acbc 26
icraggs 2:638c854c0695 27
sam_grove 5:4a257f6ac09a 28 #include "C12832.h"
sam_grove 5:4a257f6ac09a 29 C12832 lcd(p5, p7, p6, p8, p11);
icraggs 0:0cae29831d01 30
icraggs 8:a3e3113054a1 31 #include "MQTTEthernet.h"
icraggs 2:638c854c0695 32 #include "MQTTClient.h"
icraggs 2:638c854c0695 33
icraggs 2:638c854c0695 34 int arrivedcount = 0;
icraggs 2:638c854c0695 35
icraggs 8:a3e3113054a1 36
icraggs 9:5beb8609e9f7 37 void messageArrived(MQTT::MessageData& md)
icraggs 2:638c854c0695 38 {
icraggs 9:5beb8609e9f7 39 MQTT::Message &message = md.message;
sam_grove 5:4a257f6ac09a 40 lcd.cls();
sam_grove 5:4a257f6ac09a 41 lcd.locate(0,3);
icraggs 9:5beb8609e9f7 42 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id);
icraggs 9:5beb8609e9f7 43 printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
icraggs 2:638c854c0695 44 ++arrivedcount;
icraggs 9:5beb8609e9f7 45 lcd.puts((char*)message.payload);
icraggs 2:638c854c0695 46 }
icraggs 0:0cae29831d01 47
icraggs 2:638c854c0695 48
icraggs 2:638c854c0695 49 int main(int argc, char* argv[])
icraggs 2:638c854c0695 50 {
icraggs 8:a3e3113054a1 51 MQTTEthernet ipstack = MQTTEthernet();
icraggs 9:5beb8609e9f7 52 float version = 0.47;
icraggs 2:638c854c0695 53 char* topic = "mbed-sample";
icraggs 2:638c854c0695 54
icraggs 2:638c854c0695 55 lcd.printf("Version is %f\n", version);
sam_grove 5:4a257f6ac09a 56 printf("Version is %f\n", version);
icraggs 2:638c854c0695 57
icraggs 8:a3e3113054a1 58 MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
icraggs 3:7a6a899de7cc 59
icraggs 6:e4c690c45021 60 char* hostname = "m2m.eclipse.org";
icraggs 6:e4c690c45021 61 int port = 1883;
icraggs 6:e4c690c45021 62 lcd.printf("Connecting to %s:%d\n", hostname, port);
icraggs 6:e4c690c45021 63 int rc = ipstack.connect(hostname, port);
icraggs 6:e4c690c45021 64 if (rc != 0)
icraggs 6:e4c690c45021 65 lcd.printf("rc from TCP connect is %d\n", rc);
icraggs 6:e4c690c45021 66
icraggs 6:e4c690c45021 67 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
icraggs 6:e4c690c45021 68 data.MQTTVersion = 3;
icraggs 8:a3e3113054a1 69 data.clientID.cstring = "mbed-sample";
icraggs 8:a3e3113054a1 70 if ((rc = client.connect(&data)) != 0)
icraggs 6:e4c690c45021 71 lcd.printf("rc from MQTT connect is %d\n", rc);
icraggs 2:638c854c0695 72
icraggs 8:a3e3113054a1 73 if ((rc = client.subscribe(topic, MQTT::QOS1, messageArrived)) != 0)
icraggs 8:a3e3113054a1 74 lcd.printf("rc from MQTT subscribe is %d\n", rc);
icraggs 2:638c854c0695 75
icraggs 2:638c854c0695 76 MQTT::Message message;
icraggs 0:0cae29831d01 77
icraggs 2:638c854c0695 78 // QoS 0
icraggs 2:638c854c0695 79 char buf[100];
icraggs 2:638c854c0695 80 sprintf(buf, "Hello World! QoS 0 message from app version %f\n", version);
icraggs 2:638c854c0695 81 message.qos = MQTT::QOS0;
icraggs 2:638c854c0695 82 message.retained = false;
icraggs 2:638c854c0695 83 message.dup = false;
icraggs 2:638c854c0695 84 message.payload = (void*)buf;
icraggs 2:638c854c0695 85 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 86 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 87 while (arrivedcount == 0)
icraggs 2:638c854c0695 88 client.yield(100);
icraggs 2:638c854c0695 89
icraggs 2:638c854c0695 90 // QoS 1
icraggs 2:638c854c0695 91 sprintf(buf, "Hello World! QoS 1 message from app version %f\n", version);
icraggs 2:638c854c0695 92 message.qos = MQTT::QOS1;
icraggs 2:638c854c0695 93 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 94 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 95 while (arrivedcount == 1)
icraggs 2:638c854c0695 96 client.yield(100);
icraggs 2:638c854c0695 97
icraggs 2:638c854c0695 98 // QoS 2
icraggs 2:638c854c0695 99 sprintf(buf, "Hello World! QoS 2 message from app version %f\n", version);
icraggs 2:638c854c0695 100 message.qos = MQTT::QOS2;
icraggs 2:638c854c0695 101 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 102 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 103 while (arrivedcount == 2)
icraggs 2:638c854c0695 104 client.yield(100);
icraggs 2:638c854c0695 105
icraggs 8:a3e3113054a1 106 if ((rc = client.unsubscribe(topic)) != 0)
sam_grove 5:4a257f6ac09a 107 printf("rc from unsubscribe was %d\n", rc);
icraggs 2:638c854c0695 108
icraggs 8:a3e3113054a1 109 if ((rc = client.disconnect()) != 0)
sam_grove 5:4a257f6ac09a 110 printf("rc from disconnect was %d\n", rc);
icraggs 2:638c854c0695 111
icraggs 2:638c854c0695 112 ipstack.disconnect();
icraggs 2:638c854c0695 113
sam_grove 5:4a257f6ac09a 114 lcd.cls();
sam_grove 5:4a257f6ac09a 115 lcd.locate(0,3);
icraggs 8:a3e3113054a1 116 lcd.printf("Version %.2f: finish %d msgs\n", version, arrivedcount);
sam_grove 5:4a257f6ac09a 117 printf("Finishing with %d messages received\n", arrivedcount);
icraggs 2:638c854c0695 118
icraggs 0:0cae29831d01 119 return 0;
icraggs 0:0cae29831d01 120 }