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:
Sun May 11 19:17:05 2014 +0000
Revision:
7:3de634f2d40c
Parent:
5:4a257f6ac09a
Parent:
6:e4c690c45021
Child:
8:a3e3113054a1
Merge latest changes

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 0:0cae29831d01 27 #include "mbed.h"
sam_grove 5:4a257f6ac09a 28 #include "EthernetInterfaceIPStack.h"
icraggs 2:638c854c0695 29
sam_grove 5:4a257f6ac09a 30 #include "C12832.h"
sam_grove 5:4a257f6ac09a 31 C12832 lcd(p5, p7, p6, p8, p11);
icraggs 0:0cae29831d01 32
icraggs 2:638c854c0695 33 #include "FP.cpp"
icraggs 2:638c854c0695 34 #include "MQTTClient.h"
icraggs 2:638c854c0695 35
icraggs 2:638c854c0695 36 int arrivedcount = 0;
icraggs 2:638c854c0695 37
icraggs 2:638c854c0695 38 void messageArrived(MQTT::Message* message)
icraggs 2:638c854c0695 39 {
sam_grove 5:4a257f6ac09a 40 lcd.cls();
sam_grove 5:4a257f6ac09a 41 lcd.locate(0,3);
sam_grove 5:4a257f6ac09a 42 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message->qos, message->retained, message->dup, message->id);
sam_grove 5:4a257f6ac09a 43 printf("Payload %.*s\n", message->payloadlen, (char*)message->payload);
icraggs 2:638c854c0695 44 ++arrivedcount;
sam_grove 5:4a257f6ac09a 45 lcd.puts((char*)message->payload);
icraggs 2:638c854c0695 46 }
icraggs 0:0cae29831d01 47
icraggs 2:638c854c0695 48
icraggs 2:638c854c0695 49
icraggs 2:638c854c0695 50 int main(int argc, char* argv[])
icraggs 2:638c854c0695 51 {
icraggs 2:638c854c0695 52 IPStack ipstack = IPStack();
icraggs 7:3de634f2d40c 53 float version = 0.43;
icraggs 2:638c854c0695 54 char* topic = "mbed-sample";
icraggs 2:638c854c0695 55
icraggs 2:638c854c0695 56 lcd.printf("Version is %f\n", version);
sam_grove 5:4a257f6ac09a 57 printf("Version is %f\n", version);
icraggs 2:638c854c0695 58
icraggs 3:7a6a899de7cc 59 MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
icraggs 3:7a6a899de7cc 60
icraggs 6:e4c690c45021 61 char* hostname = "m2m.eclipse.org";
icraggs 6:e4c690c45021 62 int port = 1883;
icraggs 6:e4c690c45021 63 lcd.printf("Connecting to %s:%d\n", hostname, port);
icraggs 6:e4c690c45021 64 int rc = ipstack.connect(hostname, port);
icraggs 6:e4c690c45021 65 if (rc != 0)
icraggs 6:e4c690c45021 66 lcd.printf("rc from TCP connect is %d\n", rc);
icraggs 6:e4c690c45021 67
icraggs 6:e4c690c45021 68 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
icraggs 6:e4c690c45021 69 data.MQTTVersion = 3;
icraggs 6:e4c690c45021 70 data.clientID.cstring = "mbed-icraggs";
icraggs 6:e4c690c45021 71 rc = client.connect(&data);
icraggs 6:e4c690c45021 72 if (rc != 0)
icraggs 6:e4c690c45021 73 lcd.printf("rc from MQTT connect is %d\n", rc);
icraggs 2:638c854c0695 74
icraggs 2:638c854c0695 75 rc = client.subscribe(topic, MQTT::QOS1, messageArrived);
sam_grove 5:4a257f6ac09a 76 if (rc != 0) {
sam_grove 5:4a257f6ac09a 77 printf("rc from MQTT subscribe is %d\n", rc);
sam_grove 5:4a257f6ac09a 78 }
icraggs 2:638c854c0695 79
icraggs 2:638c854c0695 80 MQTT::Message message;
icraggs 0:0cae29831d01 81
icraggs 2:638c854c0695 82 // QoS 0
icraggs 2:638c854c0695 83 char buf[100];
icraggs 2:638c854c0695 84 sprintf(buf, "Hello World! QoS 0 message from app version %f\n", version);
icraggs 2:638c854c0695 85 message.qos = MQTT::QOS0;
icraggs 2:638c854c0695 86 message.retained = false;
icraggs 2:638c854c0695 87 message.dup = false;
icraggs 2:638c854c0695 88 message.payload = (void*)buf;
icraggs 2:638c854c0695 89 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 90 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 91 while (arrivedcount == 0)
icraggs 2:638c854c0695 92 client.yield(100);
icraggs 2:638c854c0695 93
icraggs 2:638c854c0695 94 // QoS 1
icraggs 2:638c854c0695 95 sprintf(buf, "Hello World! QoS 1 message from app version %f\n", version);
icraggs 2:638c854c0695 96 message.qos = MQTT::QOS1;
icraggs 2:638c854c0695 97 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 98 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 99 while (arrivedcount == 1)
icraggs 2:638c854c0695 100 client.yield(100);
icraggs 2:638c854c0695 101
icraggs 2:638c854c0695 102 // QoS 2
icraggs 2:638c854c0695 103 sprintf(buf, "Hello World! QoS 2 message from app version %f\n", version);
icraggs 2:638c854c0695 104 message.qos = MQTT::QOS2;
icraggs 2:638c854c0695 105 message.payloadlen = strlen(buf)+1;
icraggs 2:638c854c0695 106 rc = client.publish(topic, &message);
icraggs 2:638c854c0695 107 while (arrivedcount == 2)
icraggs 2:638c854c0695 108 client.yield(100);
icraggs 2:638c854c0695 109
icraggs 2:638c854c0695 110 rc = client.unsubscribe(topic);
sam_grove 5:4a257f6ac09a 111 if (rc != 0) {
sam_grove 5:4a257f6ac09a 112 printf("rc from unsubscribe was %d\n", rc);
sam_grove 5:4a257f6ac09a 113 }
icraggs 2:638c854c0695 114
icraggs 2:638c854c0695 115 rc = client.disconnect();
sam_grove 5:4a257f6ac09a 116 if (rc != 0) {
sam_grove 5:4a257f6ac09a 117 printf("rc from disconnect was %d\n", rc);
sam_grove 5:4a257f6ac09a 118 }
icraggs 2:638c854c0695 119
icraggs 2:638c854c0695 120 ipstack.disconnect();
icraggs 2:638c854c0695 121
sam_grove 5:4a257f6ac09a 122 lcd.cls();
sam_grove 5:4a257f6ac09a 123 lcd.locate(0,3);
sam_grove 5:4a257f6ac09a 124 lcd.printf("Finish: %d msgs\n", arrivedcount);
sam_grove 5:4a257f6ac09a 125 printf("Finishing with %d messages received\n", arrivedcount);
icraggs 2:638c854c0695 126
icraggs 0:0cae29831d01 127 return 0;
icraggs 0:0cae29831d01 128 }