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@35:c46b92269df4, 2017-04-04 (annotated)
- 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?
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 | |
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 | } |