A Threaded Secure MQTT Client example. Uses MBED TLS for SSL/TLS connection. QoS0 only for now. Example has been tested with K64F connected via Ethernet.

Dependencies:   FP MQTTPacket

Fork of HelloMQTT by MQTT

Committer:
vpcola
Date:
Tue Apr 04 05:00:08 2017 +0000
Revision:
35:c46b92269df4
Parent:
33:38e2e7bf91eb
Minor updates

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
vpcola 21:a7506c90aa84 28 #include "mbed.h"
vpcola 21:a7506c90aa84 29 #include "rtos.h"
vpcola 32:16ef25cbb05c 30 #undef MBED_CONF_APP_ESP8266_DEBUG
Jan Jongboom 20:49c9daf2b0ff 31 #include "easy-connect.h"
vpcola 23:06fac173529e 32 #include "MQTTThreadedClient.h"
vpcola 23:06fac173529e 33
vpcola 30:b2aed80037db 34 using namespace MQTT;
icraggs 2:638c854c0695 35
vpcola 21:a7506c90aa84 36 Serial pc(USBTX, USBRX, 115200);
vpcola 26:4b21de8043a5 37 Thread msgSender(osPriorityNormal, DEFAULT_STACK_SIZE * 2);
vpcola 26:4b21de8043a5 38
vpcola 26:4b21de8043a5 39
vpcola 26:4b21de8043a5 40 /* List of trusted root CA certificates
vpcola 26:4b21de8043a5 41 * currently only "letsencrypt", the CA for mbedhacks.com
vpcola 26:4b21de8043a5 42 *
vpcola 26:4b21de8043a5 43 * To add more than one root, just concatenate them.
vpcola 26:4b21de8043a5 44 *
vpcola 26:4b21de8043a5 45 * TODO: Move this certificate file onto the SD card.
vpcola 26:4b21de8043a5 46 */
vpcola 26:4b21de8043a5 47 static const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n"
vpcola 26:4b21de8043a5 48 "MIIFETCCA/mgAwIBAgISA2ktlb1Y6ap4GCH7dg3wS37XMA0GCSqGSIb3DQEBCwUA\n"
vpcola 26:4b21de8043a5 49 "MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\n"
vpcola 26:4b21de8043a5 50 "ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAzMDkwMTQ4MDBaFw0x\n"
vpcola 26:4b21de8043a5 51 "NzA2MDcwMTQ4MDBaMBgxFjAUBgNVBAMTDW1iZWRoYWNrcy5jb20wggEiMA0GCSqG\n"
vpcola 26:4b21de8043a5 52 "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4ppYHlH8lfB7lkWOjMSnOJGaLtCBfz57I\n"
vpcola 26:4b21de8043a5 53 "VVOd1Rngsz7nE5fg3joa7lkazRY1ZqtuC2UloS+4LYoQZX4Z887dhdug/TPA4J1A\n"
vpcola 26:4b21de8043a5 54 "GppA4xVCb2kUFODMjZ2r4pMLp+MjFFMBaHrL4cgx/n4aJUB+N9Z+HW0p2Yr5TsOQ\n"
vpcola 26:4b21de8043a5 55 "ghIOPkNxFr2q6klm49+BMUbO98hAwFwsIISLf6IbHM93gx1ltqkvb55N87ZM1hYH\n"
vpcola 26:4b21de8043a5 56 "fkq+J+YqjleiLaqRN2MVlNMNfy9MDbqM5uCyGiWGtq8eiQLaWpZkxnA2MC5zPsO/\n"
vpcola 26:4b21de8043a5 57 "fzEWiVjn2uazlXZ5xZwiK22KMxVasqWMitvETtmPOl9mocRbLQdxAgMBAAGjggIh\n"
vpcola 26:4b21de8043a5 58 "MIICHTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF\n"
vpcola 26:4b21de8043a5 59 "BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCsgG+z1BTjrN3K+/tF0C4k818Yv\n"
vpcola 26:4b21de8043a5 60 "MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUFBwEBBGQw\n"
vpcola 26:4b21de8043a5 61 "YjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y\n"
vpcola 26:4b21de8043a5 62 "Zy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v\n"
vpcola 26:4b21de8043a5 63 "cmcvMCsGA1UdEQQkMCKCDW1iZWRoYWNrcy5jb22CEXd3dy5tYmVkaGFja3MuY29t\n"
vpcola 26:4b21de8043a5 64 "MIH+BgNVHSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggr\n"
vpcola 26:4b21de8043a5 65 "BgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwIC\n"
vpcola 26:4b21de8043a5 66 "MIGeDIGbVGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBi\n"
vpcola 26:4b21de8043a5 67 "eSBSZWx5aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRo\n"
vpcola 26:4b21de8043a5 68 "ZSBDZXJ0aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlw\n"
vpcola 26:4b21de8043a5 69 "dC5vcmcvcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBABFH6YcvHh8foHeg\n"
vpcola 26:4b21de8043a5 70 "NM7iR9HnYRqa5gSERcCtq6jm8PcTsAbsdQ/BNpIHK7AZSg2kk17kj+JFeyMuNJWq\n"
vpcola 26:4b21de8043a5 71 "lmabV0dtzdC8ejp1d7hGb/HjuQ400th/QRayvyrDVzQPfCNyJ0C82Q2DFjeUgnqv\n"
vpcola 26:4b21de8043a5 72 "oJMcV6i4ICW0boI7GUf7oeHCmrUEHKffAbeFvx3c85c39IHJEFa59UWj1linU/Tr\n"
vpcola 26:4b21de8043a5 73 "g9i5AaSKB95d706u1XRA7WLV/Hu7yunhxEjlj33bfdifBb/ZLBd0LtrXPwtXi6E8\n"
vpcola 26:4b21de8043a5 74 "r6obp+B+Ce89G7WEhdT9BX0ck1KTK+yP7uAC7tvvsiejxXOoCtVyBAumBJS7mRuv\n"
vpcola 26:4b21de8043a5 75 "I5hmKgE=\n"
vpcola 26:4b21de8043a5 76 "-----END CERTIFICATE-----\n"
vpcola 26:4b21de8043a5 77 "-----BEGIN CERTIFICATE-----\n"
vpcola 26:4b21de8043a5 78 "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n"
vpcola 26:4b21de8043a5 79 "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n"
vpcola 26:4b21de8043a5 80 "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n"
vpcola 26:4b21de8043a5 81 "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n"
vpcola 26:4b21de8043a5 82 "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
vpcola 26:4b21de8043a5 83 "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n"
vpcola 26:4b21de8043a5 84 "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n"
vpcola 26:4b21de8043a5 85 "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n"
vpcola 26:4b21de8043a5 86 "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n"
vpcola 26:4b21de8043a5 87 "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n"
vpcola 26:4b21de8043a5 88 "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n"
vpcola 26:4b21de8043a5 89 "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n"
vpcola 26:4b21de8043a5 90 "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n"
vpcola 26:4b21de8043a5 91 "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n"
vpcola 26:4b21de8043a5 92 "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n"
vpcola 26:4b21de8043a5 93 "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n"
vpcola 26:4b21de8043a5 94 "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n"
vpcola 26:4b21de8043a5 95 "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n"
vpcola 26:4b21de8043a5 96 "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n"
vpcola 26:4b21de8043a5 97 "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n"
vpcola 26:4b21de8043a5 98 "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n"
vpcola 26:4b21de8043a5 99 "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n"
vpcola 26:4b21de8043a5 100 "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n"
vpcola 26:4b21de8043a5 101 "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n"
vpcola 26:4b21de8043a5 102 "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n"
vpcola 26:4b21de8043a5 103 "-----END CERTIFICATE-----";
vpcola 33:38e2e7bf91eb 104
vpcola 23:06fac173529e 105
vpcola 23:06fac173529e 106 static const char * clientID = "mbed-sample";
vpcola 23:06fac173529e 107 static const char * userID = "mbedhacks";
vpcola 23:06fac173529e 108 static const char * password = "qwer123";
vpcola 23:06fac173529e 109 static const char * topic_1 = "mbed-sample";
vpcola 23:06fac173529e 110 static const char * topic_2 = "test";
vpcola 23:06fac173529e 111
icraggs 2:638c854c0695 112 int arrivedcount = 0;
icraggs 2:638c854c0695 113
vpcola 23:06fac173529e 114 void messageArrived(MessageData& md)
icraggs 2:638c854c0695 115 {
vpcola 23:06fac173529e 116 Message &message = md.message;
vpcola 23:06fac173529e 117 printf("Arrived Callback 1 : qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
vpcola 22:826657a00c44 118 printf("Payload [%.*s]\r\n", message.payloadlen, (char*)message.payload);
icraggs 2:638c854c0695 119 ++arrivedcount;
icraggs 2:638c854c0695 120 }
icraggs 0:0cae29831d01 121
vpcola 23:06fac173529e 122 class CallbackTest
vpcola 21:a7506c90aa84 123 {
vpcola 23:06fac173529e 124 public:
vpcola 23:06fac173529e 125
vpcola 23:06fac173529e 126 CallbackTest()
vpcola 23:06fac173529e 127 : arrivedcount(0)
vpcola 23:06fac173529e 128 {}
vpcola 23:06fac173529e 129
vpcola 23:06fac173529e 130 void messageArrived(MessageData& md)
vpcola 21:a7506c90aa84 131 {
vpcola 23:06fac173529e 132 Message &message = md.message;
vpcola 25:326f00faa092 133 printf("Arrived Callback 2 : qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
vpcola 23:06fac173529e 134 printf("Payload [%.*s]\r\n", message.payloadlen, (char*)message.payload);
vpcola 23:06fac173529e 135 ++arrivedcount;
vpcola 23:06fac173529e 136 }
vpcola 23:06fac173529e 137
vpcola 23:06fac173529e 138 private:
vpcola 23:06fac173529e 139
vpcola 23:06fac173529e 140 int arrivedcount;
vpcola 23:06fac173529e 141 };
icraggs 2:638c854c0695 142
icraggs 2:638c854c0695 143 int main(int argc, char* argv[])
Jan Jongboom 20:49c9daf2b0ff 144 {
Jan Jongboom 20:49c9daf2b0ff 145 float version = 0.6;
vpcola 23:06fac173529e 146 CallbackTest testcb;
Jan Jongboom 20:49c9daf2b0ff 147
vpcola 21:a7506c90aa84 148 printf("HelloMQTT: version is %.2f\r\n", version);
Jan Jongboom 20:49c9daf2b0ff 149
Jan Jongboom 20:49c9daf2b0ff 150 NetworkInterface* network = easy_connect(true);
Jan Jongboom 20:49c9daf2b0ff 151 if (!network) {
Jan Jongboom 20:49c9daf2b0ff 152 return -1;
Jan Jongboom 20:49c9daf2b0ff 153 }
Jan Jongboom 20:49c9daf2b0ff 154
vpcola 33:38e2e7bf91eb 155
vpcola 26:4b21de8043a5 156 MQTTThreadedClient mqtt(network, SSL_CA_PEM);
vpcola 26:4b21de8043a5 157
Jan Jongboom 20:49c9daf2b0ff 158
vpcola 23:06fac173529e 159 const char* hostname = "mqtt.mbedhacks.com";
vpcola 23:06fac173529e 160 // const char* hostname = "192.168.0.7";
vpcola 26:4b21de8043a5 161 int port = 8883;
Jan Jongboom 20:49c9daf2b0ff 162
vpcola 26:4b21de8043a5 163 MQTTPacket_connectData logindata = MQTTPacket_connectData_initializer;
vpcola 26:4b21de8043a5 164 logindata.MQTTVersion = 3;
vpcola 26:4b21de8043a5 165 logindata.clientID.cstring = (char *) clientID;
vpcola 26:4b21de8043a5 166 logindata.username.cstring = (char *) userID;
vpcola 26:4b21de8043a5 167 logindata.password.cstring = (char *) password;
vpcola 26:4b21de8043a5 168
vpcola 26:4b21de8043a5 169 mqtt.setConnectionParameters(hostname, port, logindata);
vpcola 26:4b21de8043a5 170 mqtt.addTopicHandler(topic_1, messageArrived);
vpcola 26:4b21de8043a5 171 mqtt.addTopicHandler(topic_2, &testcb, &CallbackTest::messageArrived);
Jan Jongboom 20:49c9daf2b0ff 172
vpcola 22:826657a00c44 173 // Start the data producer
vpcola 23:06fac173529e 174 msgSender.start(mbed::callback(&mqtt, &MQTTThreadedClient::startListener));
vpcola 21:a7506c90aa84 175
vpcola 23:06fac173529e 176 int i = 0;
vpcola 21:a7506c90aa84 177 while(true)
vpcola 21:a7506c90aa84 178 {
vpcola 23:06fac173529e 179 PubMessage message;
vpcola 23:06fac173529e 180 message.qos = QOS0;
vpcola 23:06fac173529e 181 message.id = 123;
vpcola 21:a7506c90aa84 182
vpcola 23:06fac173529e 183 strcpy(&message.topic[0], topic_1);
vpcola 23:06fac173529e 184 sprintf(&message.payload[0], "Testing %d", i);
vpcola 23:06fac173529e 185 message.payloadlen = strlen((const char *) &message.payload[0]);
vpcola 23:06fac173529e 186 mqtt.publish(message);
vpcola 23:06fac173529e 187
vpcola 23:06fac173529e 188 i++;
vpcola 23:06fac173529e 189 //TODO: Nothing here yet ...
vpcola 25:326f00faa092 190 Thread::wait(6000);
vpcola 21:a7506c90aa84 191 }
Jan Jongboom 20:49c9daf2b0ff 192
icraggs 0:0cae29831d01 193 }