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