Fork of Hello MQTT, using mbed TLS for secure mqtt transport

Dependencies:   MQTT

Fork of HelloMQTT by MQTT

Committer:
vpcola
Date:
Fri Mar 17 08:42:29 2017 +0000
Revision:
21:4534812bb94f
Parent:
20:49c9daf2b0ff
Child:
22:4d0628d13870
First seed ...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
icraggs 1:a1d5c7a6acbc 1 /*******************************************************************************
icraggs 17:0811bdbdd78a 2 * Copyright (c) 2014, 2015 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 17:0811bdbdd78a 15 * Ian Craggs - make sure QoS2 processing works, and add device headers
icraggs 1:a1d5c7a6acbc 16 *******************************************************************************/
Jan Jongboom 20:49c9daf2b0ff 17
icraggs 2:638c854c0695 18 /**
icraggs 2:638c854c0695 19 This is a sample program to illustrate the use of the MQTT Client library
icraggs 2:638c854c0695 20 on the mbed platform. The Client class requires two classes which mediate
icraggs 2:638c854c0695 21 access to system interfaces for networking and timing. As long as these two
icraggs 2:638c854c0695 22 classes provide the required public programming interfaces, it does not matter
icraggs 2:638c854c0695 23 what facilities they use underneath. In this program, they use the mbed
icraggs 2:638c854c0695 24 system libraries.
Jan Jongboom 20:49c9daf2b0ff 25
icraggs 2:638c854c0695 26 */
Jan Jongboom 20:49c9daf2b0ff 27
icraggs 18:07a79d8f01c3 28 // change this to 0 to output messages to serial instead of LCD
icraggs 1:a1d5c7a6acbc 29
icraggs 18:07a79d8f01c3 30
icraggs 17:0811bdbdd78a 31 #define MQTTCLIENT_QOS2 1
icraggs 0:0cae29831d01 32
vpcola 21:4534812bb94f 33 #include "mbed.h"
vpcola 21:4534812bb94f 34 #include "rtos.h"
Jan Jongboom 20:49c9daf2b0ff 35 #include "easy-connect.h"
vpcola 21:4534812bb94f 36 #include "MQTTSNetwork.h"
Jan Jongboom 20:49c9daf2b0ff 37 #include "MQTTmbed.h"
icraggs 2:638c854c0695 38 #include "MQTTClient.h"
icraggs 2:638c854c0695 39
icraggs 2:638c854c0695 40
vpcola 21:4534812bb94f 41 /* List of trusted root CA certificates
vpcola 21:4534812bb94f 42 * currently only "letsencrypt", the CA for mbedhacks.com
vpcola 21:4534812bb94f 43 *
vpcola 21:4534812bb94f 44 * To add more than one root, just concatenate them.
vpcola 21:4534812bb94f 45 *
vpcola 21:4534812bb94f 46 * TODO: Move this certificate file onto the SD card.
vpcola 21:4534812bb94f 47 */
vpcola 21:4534812bb94f 48 static const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n"
vpcola 21:4534812bb94f 49 "MIIFETCCA/mgAwIBAgISA2ktlb1Y6ap4GCH7dg3wS37XMA0GCSqGSIb3DQEBCwUA\n"
vpcola 21:4534812bb94f 50 "MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\n"
vpcola 21:4534812bb94f 51 "ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAzMDkwMTQ4MDBaFw0x\n"
vpcola 21:4534812bb94f 52 "NzA2MDcwMTQ4MDBaMBgxFjAUBgNVBAMTDW1iZWRoYWNrcy5jb20wggEiMA0GCSqG\n"
vpcola 21:4534812bb94f 53 "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4ppYHlH8lfB7lkWOjMSnOJGaLtCBfz57I\n"
vpcola 21:4534812bb94f 54 "VVOd1Rngsz7nE5fg3joa7lkazRY1ZqtuC2UloS+4LYoQZX4Z887dhdug/TPA4J1A\n"
vpcola 21:4534812bb94f 55 "GppA4xVCb2kUFODMjZ2r4pMLp+MjFFMBaHrL4cgx/n4aJUB+N9Z+HW0p2Yr5TsOQ\n"
vpcola 21:4534812bb94f 56 "ghIOPkNxFr2q6klm49+BMUbO98hAwFwsIISLf6IbHM93gx1ltqkvb55N87ZM1hYH\n"
vpcola 21:4534812bb94f 57 "fkq+J+YqjleiLaqRN2MVlNMNfy9MDbqM5uCyGiWGtq8eiQLaWpZkxnA2MC5zPsO/\n"
vpcola 21:4534812bb94f 58 "fzEWiVjn2uazlXZ5xZwiK22KMxVasqWMitvETtmPOl9mocRbLQdxAgMBAAGjggIh\n"
vpcola 21:4534812bb94f 59 "MIICHTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF\n"
vpcola 21:4534812bb94f 60 "BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCsgG+z1BTjrN3K+/tF0C4k818Yv\n"
vpcola 21:4534812bb94f 61 "MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUFBwEBBGQw\n"
vpcola 21:4534812bb94f 62 "YjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y\n"
vpcola 21:4534812bb94f 63 "Zy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v\n"
vpcola 21:4534812bb94f 64 "cmcvMCsGA1UdEQQkMCKCDW1iZWRoYWNrcy5jb22CEXd3dy5tYmVkaGFja3MuY29t\n"
vpcola 21:4534812bb94f 65 "MIH+BgNVHSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggr\n"
vpcola 21:4534812bb94f 66 "BgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwIC\n"
vpcola 21:4534812bb94f 67 "MIGeDIGbVGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBi\n"
vpcola 21:4534812bb94f 68 "eSBSZWx5aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRo\n"
vpcola 21:4534812bb94f 69 "ZSBDZXJ0aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlw\n"
vpcola 21:4534812bb94f 70 "dC5vcmcvcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBABFH6YcvHh8foHeg\n"
vpcola 21:4534812bb94f 71 "NM7iR9HnYRqa5gSERcCtq6jm8PcTsAbsdQ/BNpIHK7AZSg2kk17kj+JFeyMuNJWq\n"
vpcola 21:4534812bb94f 72 "lmabV0dtzdC8ejp1d7hGb/HjuQ400th/QRayvyrDVzQPfCNyJ0C82Q2DFjeUgnqv\n"
vpcola 21:4534812bb94f 73 "oJMcV6i4ICW0boI7GUf7oeHCmrUEHKffAbeFvx3c85c39IHJEFa59UWj1linU/Tr\n"
vpcola 21:4534812bb94f 74 "g9i5AaSKB95d706u1XRA7WLV/Hu7yunhxEjlj33bfdifBb/ZLBd0LtrXPwtXi6E8\n"
vpcola 21:4534812bb94f 75 "r6obp+B+Ce89G7WEhdT9BX0ck1KTK+yP7uAC7tvvsiejxXOoCtVyBAumBJS7mRuv\n"
vpcola 21:4534812bb94f 76 "I5hmKgE=\n"
vpcola 21:4534812bb94f 77 "-----END CERTIFICATE-----\n"
vpcola 21:4534812bb94f 78 "-----BEGIN CERTIFICATE-----\n"
vpcola 21:4534812bb94f 79 "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n"
vpcola 21:4534812bb94f 80 "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n"
vpcola 21:4534812bb94f 81 "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n"
vpcola 21:4534812bb94f 82 "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n"
vpcola 21:4534812bb94f 83 "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
vpcola 21:4534812bb94f 84 "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n"
vpcola 21:4534812bb94f 85 "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n"
vpcola 21:4534812bb94f 86 "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n"
vpcola 21:4534812bb94f 87 "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n"
vpcola 21:4534812bb94f 88 "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n"
vpcola 21:4534812bb94f 89 "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n"
vpcola 21:4534812bb94f 90 "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n"
vpcola 21:4534812bb94f 91 "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n"
vpcola 21:4534812bb94f 92 "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n"
vpcola 21:4534812bb94f 93 "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n"
vpcola 21:4534812bb94f 94 "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n"
vpcola 21:4534812bb94f 95 "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n"
vpcola 21:4534812bb94f 96 "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n"
vpcola 21:4534812bb94f 97 "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n"
vpcola 21:4534812bb94f 98 "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n"
vpcola 21:4534812bb94f 99 "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n"
vpcola 21:4534812bb94f 100 "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n"
vpcola 21:4534812bb94f 101 "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n"
vpcola 21:4534812bb94f 102 "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n"
vpcola 21:4534812bb94f 103 "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n"
vpcola 21:4534812bb94f 104 "-----END CERTIFICATE-----";
icraggs 8:a3e3113054a1 105
vpcola 21:4534812bb94f 106 int arrivedcount = 0;
vpcola 21:4534812bb94f 107 Thread thdMQTT;
vpcola 21:4534812bb94f 108
vpcola 21:4534812bb94f 109 MQTTSNetwork mqttNetwork;
vpcola 21:4534812bb94f 110 MQTT::Client<MQTTSNetwork, Countdown> client = MQTT::Client<MQTTSNetwork, Countdown>(mqttNetwork);
vpcola 21:4534812bb94f 111
vpcola 21:4534812bb94f 112 static MemoryPool<MQTT::Message, 16> pool;
vpcola 21:4534812bb94f 113 static Queue<MQTT::Message, 16> queue;
vpcola 21:4534812bb94f 114
vpcola 21:4534812bb94f 115 static const char* topic = "mbed-sample";
vpcola 21:4534812bb94f 116
vpcola 21:4534812bb94f 117 typedef void (*messageHandler)(MQTT::MessageData&);
icraggs 9:5beb8609e9f7 118 void messageArrived(MQTT::MessageData& md)
icraggs 2:638c854c0695 119 {
icraggs 9:5beb8609e9f7 120 MQTT::Message &message = md.message;
vpcola 21:4534812bb94f 121 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
vpcola 21:4534812bb94f 122 printf("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
icraggs 2:638c854c0695 123 ++arrivedcount;
icraggs 2:638c854c0695 124 }
icraggs 0:0cae29831d01 125
vpcola 21:4534812bb94f 126 int mqttsConnect(const char * hostname, uint16_t port,
vpcola 21:4534812bb94f 127 const char * clientID,
vpcola 21:4534812bb94f 128 const char * username,
vpcola 21:4534812bb94f 129 const char * password)
vpcola 21:4534812bb94f 130 {
vpcola 21:4534812bb94f 131 int rc;
vpcola 21:4534812bb94f 132
vpcola 21:4534812bb94f 133 printf("Connecting to %s:%d\r\n", hostname, port);
vpcola 21:4534812bb94f 134 rc = mqttNetwork.connect(hostname, port);
vpcola 21:4534812bb94f 135 if (rc != 0)
vpcola 21:4534812bb94f 136 {
vpcola 21:4534812bb94f 137 printf("rc from TCP connect is %d\r\n", rc);
vpcola 21:4534812bb94f 138 return -1;
vpcola 21:4534812bb94f 139 }
vpcola 21:4534812bb94f 140 else
vpcola 21:4534812bb94f 141 printf("RC passed!\r\n");
vpcola 21:4534812bb94f 142
vpcola 21:4534812bb94f 143 printf("Creating data connection ...\r\n");
vpcola 21:4534812bb94f 144 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
vpcola 21:4534812bb94f 145 data.MQTTVersion = 3;
vpcola 21:4534812bb94f 146 data.clientID.cstring = (char *) clientID;
vpcola 21:4534812bb94f 147 data.username.cstring = (char *) username;
vpcola 21:4534812bb94f 148 data.password.cstring = (char *) password;
vpcola 21:4534812bb94f 149 printf("Connecting client ...\r\n");
vpcola 21:4534812bb94f 150 if ((rc = client.connect(data)) != 0)
vpcola 21:4534812bb94f 151 {
vpcola 21:4534812bb94f 152 printf("rc from MQTT connect is %d\r\n", rc);
vpcola 21:4534812bb94f 153 return -1;
vpcola 21:4534812bb94f 154 }
vpcola 21:4534812bb94f 155
vpcola 21:4534812bb94f 156 printf("Subscribing to topic ...\r\n");
vpcola 21:4534812bb94f 157 if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
vpcola 21:4534812bb94f 158 {
vpcola 21:4534812bb94f 159 printf("rc from MQTT subscribe is %d\r\n", rc);
vpcola 21:4534812bb94f 160 return -1;
vpcola 21:4534812bb94f 161 }
vpcola 21:4534812bb94f 162
vpcola 21:4534812bb94f 163 return rc;
vpcola 21:4534812bb94f 164 }
vpcola 21:4534812bb94f 165
vpcola 21:4534812bb94f 166 int mqttsSubscribe(const char * topic, MQTT::QoS os, messageHandler handler)
vpcola 21:4534812bb94f 167 {
vpcola 21:4534812bb94f 168 int rc;
vpcola 21:4534812bb94f 169
vpcola 21:4534812bb94f 170 printf("Subscribing to topic ...\r\n");
vpcola 21:4534812bb94f 171 if ((rc = client.subscribe(topic, os, handler)) != 0)
vpcola 21:4534812bb94f 172 printf("rc from MQTT subscribe is %d\r\n", rc);
vpcola 21:4534812bb94f 173
vpcola 21:4534812bb94f 174 return rc;
vpcola 21:4534812bb94f 175 }
vpcola 21:4534812bb94f 176
vpcola 21:4534812bb94f 177 // This function is used to pass data from
vpcola 21:4534812bb94f 178 // the main thread to the MQTT listener thread
vpcola 21:4534812bb94f 179 void postMQTTUpdate(MQTT::Message msg)
vpcola 21:4534812bb94f 180 {
vpcola 21:4534812bb94f 181 MQTT::Message * message = pool.alloc();
vpcola 21:4534812bb94f 182 // Simple copy, I think this is via (memcpy)
vpcola 21:4534812bb94f 183 *message = msg;
vpcola 21:4534812bb94f 184
vpcola 21:4534812bb94f 185 // Push the data to the consumer thread
vpcola 21:4534812bb94f 186 printf("Pushing data to MQTTS Listener thread ...\r\n");
vpcola 21:4534812bb94f 187 queue.put(message);
vpcola 21:4534812bb94f 188 }
vpcola 21:4534812bb94f 189
vpcola 21:4534812bb94f 190 void mqttListener(void)
vpcola 21:4534812bb94f 191 {
vpcola 21:4534812bb94f 192 printf("MQTT listener thread started ...\r\n");
vpcola 21:4534812bb94f 193 while(true)
vpcola 21:4534812bb94f 194 {
vpcola 21:4534812bb94f 195 // Wait for data in the queue, timeout at 10ms
vpcola 21:4534812bb94f 196 osEvent evt = queue.get(10);
vpcola 21:4534812bb94f 197 if (evt.status == osEventMessage) {
vpcola 21:4534812bb94f 198 printf("Message arrived from main thread ...\r\n");
vpcola 21:4534812bb94f 199 // Unpack the message
vpcola 21:4534812bb94f 200 MQTT::Message * message = (MQTT::Message *)evt.value.p;
vpcola 21:4534812bb94f 201
vpcola 21:4534812bb94f 202 printf("Publishing message to MQTT ...\r\n");
vpcola 21:4534812bb94f 203 // Push to mqtt
vpcola 21:4534812bb94f 204 int rc = client.publish(topic, *message);
vpcola 21:4534812bb94f 205 if (rc < 0)
vpcola 21:4534812bb94f 206 printf("Error sending mqtt message \r\n");
vpcola 21:4534812bb94f 207 else
vpcola 21:4534812bb94f 208 printf("Message published ...\r\n");
vpcola 21:4534812bb94f 209
vpcola 21:4534812bb94f 210 // Don't forget this!
vpcola 21:4534812bb94f 211 pool.free(message);
vpcola 21:4534812bb94f 212 }
vpcola 21:4534812bb94f 213
vpcola 21:4534812bb94f 214 printf("MQTT client yeild ...\r\n");
vpcola 21:4534812bb94f 215 if (client.yield(100) != 0)
vpcola 21:4534812bb94f 216 {
vpcola 21:4534812bb94f 217 client.disconnect();
vpcola 21:4534812bb94f 218 // TODO: reconnect TLS session.
vpcola 21:4534812bb94f 219 return;
vpcola 21:4534812bb94f 220 }
vpcola 21:4534812bb94f 221 printf("MQTT client yeild successful ...\r\n");
vpcola 21:4534812bb94f 222 }
vpcola 21:4534812bb94f 223 }
icraggs 2:638c854c0695 224
icraggs 2:638c854c0695 225 int main(int argc, char* argv[])
Jan Jongboom 20:49c9daf2b0ff 226 {
Jan Jongboom 20:49c9daf2b0ff 227 float version = 0.6;
Jan Jongboom 20:49c9daf2b0ff 228
vpcola 21:4534812bb94f 229 int i = 0;
vpcola 21:4534812bb94f 230
vpcola 21:4534812bb94f 231 printf("HelloMQTT: version is %.2f\r\n", version);
Jan Jongboom 20:49c9daf2b0ff 232
Jan Jongboom 20:49c9daf2b0ff 233 NetworkInterface* network = easy_connect(true);
Jan Jongboom 20:49c9daf2b0ff 234 if (!network) {
Jan Jongboom 20:49c9daf2b0ff 235 return -1;
Jan Jongboom 20:49c9daf2b0ff 236 }
Jan Jongboom 20:49c9daf2b0ff 237
vpcola 21:4534812bb94f 238 if ( mqttNetwork.setupTLS(network, SSL_CA_PEM) != 0 )
vpcola 21:4534812bb94f 239 {
vpcola 21:4534812bb94f 240 printf("Failed initializing sercure MQTTS...\r\n");
vpcola 21:4534812bb94f 241 return -1;
vpcola 21:4534812bb94f 242 }
vpcola 21:4534812bb94f 243
vpcola 21:4534812bb94f 244 if ( mqttsConnect("mqtt.mbedhacks.com",
vpcola 21:4534812bb94f 245 8883,"mbedtest_01","tinong","tatay") != 0 )
vpcola 21:4534812bb94f 246 {
vpcola 21:4534812bb94f 247 printf("Failed connecting to mqtt.mbedhacks.com:8883 \r\n");
vpcola 21:4534812bb94f 248 return -1;
vpcola 21:4534812bb94f 249 }
vpcola 21:4534812bb94f 250
vpcola 21:4534812bb94f 251 if ( mqttsSubscribe(topic, MQTT::QOS2, messageArrived) != 0 )
vpcola 21:4534812bb94f 252 {
vpcola 21:4534812bb94f 253 printf("Failed to subscribe to a topic!\r\n");
vpcola 21:4534812bb94f 254 return -1;
vpcola 21:4534812bb94f 255 }
vpcola 21:4534812bb94f 256
vpcola 21:4534812bb94f 257 // Run an MQTT listener on its own thread.
vpcola 21:4534812bb94f 258 thdMQTT.start(mqttListener);
vpcola 21:4534812bb94f 259
vpcola 21:4534812bb94f 260 // The main loops just sends messages to MQTT server
vpcola 21:4534812bb94f 261 while(true)
vpcola 21:4534812bb94f 262 {
vpcola 21:4534812bb94f 263 MQTT::Message mqtt_msg;
vpcola 21:4534812bb94f 264 char buff[100];
vpcola 21:4534812bb94f 265
vpcola 21:4534812bb94f 266 sprintf(buff, "message test %d", i);
vpcola 21:4534812bb94f 267 mqtt_msg.qos = MQTT::QOS0;
vpcola 21:4534812bb94f 268 mqtt_msg.retained = false;
vpcola 21:4534812bb94f 269 mqtt_msg.dup = false;
vpcola 21:4534812bb94f 270 mqtt_msg.payload = (void*)buff;
vpcola 21:4534812bb94f 271 mqtt_msg.payloadlen = strlen(buff)+1;
vpcola 21:4534812bb94f 272
vpcola 21:4534812bb94f 273 // publish the message to mqtt
vpcola 21:4534812bb94f 274 postMQTTUpdate(mqtt_msg);
vpcola 21:4534812bb94f 275 i++;
vpcola 21:4534812bb94f 276
vpcola 21:4534812bb94f 277 Thread::wait(2000);
vpcola 21:4534812bb94f 278 }
icraggs 0:0cae29831d01 279
vpcola 21:4534812bb94f 280 //mqttNetwork.disconnect();
Jan Jongboom 20:49c9daf2b0ff 281
vpcola 21:4534812bb94f 282 //printf("Version %.2f: finish %d msgs\r\n", version, arrivedcount);
Jan Jongboom 20:49c9daf2b0ff 283
icraggs 0:0cae29831d01 284 return 0;
icraggs 0:0cae29831d01 285 }