test

Dependencies:   MQTT

Committer:
kernel2418
Date:
Wed Mar 14 03:03:16 2018 +0000
Revision:
0:9d5f28595388
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kernel2418 0:9d5f28595388 1 /* This example demonstrates connection with AWS IoT through MQTT/HTTPS protocol.
kernel2418 0:9d5f28595388 2 *
kernel2418 0:9d5f28595388 3 * AWS IoT: Thing Shadow MQTT Topics
kernel2418 0:9d5f28595388 4 * http://docs.aws.amazon.com/iot/latest/developerguide/thing-shadow-mqtt.html
kernel2418 0:9d5f28595388 5 *
kernel2418 0:9d5f28595388 6 * AWS IoT: Publish to a topic through HTTPS/POST method:
kernel2418 0:9d5f28595388 7 * http://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
kernel2418 0:9d5f28595388 8 *
kernel2418 0:9d5f28595388 9 * AWS IoT: Thing Shadow RESTful API:
kernel2418 0:9d5f28595388 10 * http://docs.aws.amazon.com/iot/latest/developerguide/thing-shadow-rest-api.html
kernel2418 0:9d5f28595388 11 */
kernel2418 0:9d5f28595388 12
kernel2418 0:9d5f28595388 13 #define AWS_IOT_MQTT_TEST 1
kernel2418 0:9d5f28595388 14 #define AWS_IOT_HTTPS_TEST 0
kernel2418 0:9d5f28595388 15
kernel2418 0:9d5f28595388 16 #include "mbed.h"
kernel2418 0:9d5f28595388 17 #include "easy-connect.h"
kernel2418 0:9d5f28595388 18
kernel2418 0:9d5f28595388 19 /* TLSSocket = Mbed TLS over TCPSocket */
kernel2418 0:9d5f28595388 20 #include "TLSSocket.h"
kernel2418 0:9d5f28595388 21
kernel2418 0:9d5f28595388 22 /* Measure memory footprint */
kernel2418 0:9d5f28595388 23 #include "mbed_stats.h"
kernel2418 0:9d5f28595388 24
kernel2418 0:9d5f28595388 25 #if AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 26 /* MQTT-specific header files */
kernel2418 0:9d5f28595388 27 #include "MQTTmbed.h"
kernel2418 0:9d5f28595388 28 #include "MQTTClient.h"
kernel2418 0:9d5f28595388 29 #endif // End of AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 30
kernel2418 0:9d5f28595388 31
kernel2418 0:9d5f28595388 32 namespace {
kernel2418 0:9d5f28595388 33
kernel2418 0:9d5f28595388 34 /* List of trusted root CA certificates
kernel2418 0:9d5f28595388 35 * currently only GlobalSign, the CA for os.mbed.com
kernel2418 0:9d5f28595388 36 *
kernel2418 0:9d5f28595388 37 * To add more than one root, just concatenate them.
kernel2418 0:9d5f28595388 38 */
kernel2418 0:9d5f28595388 39 const char SSL_CA_CERT_PEM[] = "-----BEGIN CERTIFICATE-----\n"
kernel2418 0:9d5f28595388 40 "MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n"
kernel2418 0:9d5f28595388 41 "yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"
kernel2418 0:9d5f28595388 42 "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n"
kernel2418 0:9d5f28595388 43 "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n"
kernel2418 0:9d5f28595388 44 "ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n"
kernel2418 0:9d5f28595388 45 "aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\n"
kernel2418 0:9d5f28595388 46 "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n"
kernel2418 0:9d5f28595388 47 "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\n"
kernel2418 0:9d5f28595388 48 "biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\n"
kernel2418 0:9d5f28595388 49 "U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\n"
kernel2418 0:9d5f28595388 50 "aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\n"
kernel2418 0:9d5f28595388 51 "nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\n"
kernel2418 0:9d5f28595388 52 "t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\n"
kernel2418 0:9d5f28595388 53 "SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\n"
kernel2418 0:9d5f28595388 54 "BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\n"
kernel2418 0:9d5f28595388 55 "rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\n"
kernel2418 0:9d5f28595388 56 "NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\n"
kernel2418 0:9d5f28595388 57 "BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\n"
kernel2418 0:9d5f28595388 58 "BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\n"
kernel2418 0:9d5f28595388 59 "aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\n"
kernel2418 0:9d5f28595388 60 "MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\n"
kernel2418 0:9d5f28595388 61 "p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n"
kernel2418 0:9d5f28595388 62 "5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\n"
kernel2418 0:9d5f28595388 63 "WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n"
kernel2418 0:9d5f28595388 64 "4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\n"
kernel2418 0:9d5f28595388 65 "hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n"
kernel2418 0:9d5f28595388 66 "-----END CERTIFICATE-----\n";
kernel2418 0:9d5f28595388 67
kernel2418 0:9d5f28595388 68 /* User certificate which has been activated and attached with specific thing and policy */
kernel2418 0:9d5f28595388 69 const char SSL_USER_CERT_PEM[] = "-----BEGIN CERTIFICATE-----\n"
kernel2418 0:9d5f28595388 70 "MIIDWjCCAkKgAwIBAgIVALN/H7tr8cgpl2zwg0JjEE106XilMA0GCSqGSIb3DQEB\n"
kernel2418 0:9d5f28595388 71 "CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\n"
kernel2418 0:9d5f28595388 72 "IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0xNzEyMTQwOTE3\n"
kernel2418 0:9d5f28595388 73 "MjdaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\n"
kernel2418 0:9d5f28595388 74 "dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM/Ebg1vx305GeuQk8\n"
kernel2418 0:9d5f28595388 75 "UeYr+5IGBEoF6QwY9wjjliQMZKoIQk8eLYZxyjq/i0WRoXy+4l2IOZC0621bahHS\n"
kernel2418 0:9d5f28595388 76 "2iPC07Uxj1BXBW+f+V0pBnUnnGK0tT3uGOFVOoPUBoiYU9mB/Anv4wXRdqrUNAMW\n"
kernel2418 0:9d5f28595388 77 "Mq/lAzOvgfyFXnTu0AtvWwISNiAk3ly2E+3PC/Ma9RyMOAjsRUbQo66f2ERmd8yZ\n"
kernel2418 0:9d5f28595388 78 "PgCXlb/x2kCnjnkau6MS0tg83Ro+QvyQGqBRf3fbYIS8Hz6mIKGffguuelEEoMqP\n"
kernel2418 0:9d5f28595388 79 "H0beG0GO/T73uUAscbrOWzoVlNmFVt6Ly53s1tm9j/Spldl4EKmMD3vNetkInYDo\n"
kernel2418 0:9d5f28595388 80 "O55zAgMBAAGjYDBeMB8GA1UdIwQYMBaAFE17U+bgCNXEKf4sP134dtHLiNtcMB0G\n"
kernel2418 0:9d5f28595388 81 "A1UdDgQWBBSP7arfS0NaGmkNFBTg7SakJy0qEDAMBgNVHRMBAf8EAjAAMA4GA1Ud\n"
kernel2418 0:9d5f28595388 82 "DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAW5RDTsZjhlkThMOrrP2XH1Cr\n"
kernel2418 0:9d5f28595388 83 "9rcoXGqo+jOq5a/yX/LVIM2W/9bIIaOEDScP2haJWceq0C1O6t2JGL0UtNGFyjYS\n"
kernel2418 0:9d5f28595388 84 "0Z3bCv77MNLhWc8GeIRHWAd65dlEspKO8P7UHNppHhh4/oKYpP2Nu/pvguofgIw6\n"
kernel2418 0:9d5f28595388 85 "XbKk9PYz4n/ebdhWi6nTBi6Yc3d9aczMh227HcUz7RFoBEhKhOi7IDWzS9X+sqfD\n"
kernel2418 0:9d5f28595388 86 "fg5NV+A4w6GMTAmLVU8ryodohSTaz34+bElnCdrAnMeSpR8BElTmojSdrA5eY5qZ\n"
kernel2418 0:9d5f28595388 87 "ib7kkPRPyM3QuqTiMPMyxdVDxkoNtRrJ8zw+l443oKvVsUvDZJbHURUt2d4htA==\n"
kernel2418 0:9d5f28595388 88 "-----END CERTIFICATE-----\n";
kernel2418 0:9d5f28595388 89
kernel2418 0:9d5f28595388 90 /* User private key paired with above */
kernel2418 0:9d5f28595388 91 const char SSL_USER_PRIV_KEY_PEM[] = "-----BEGIN RSA PRIVATE KEY-----\n"
kernel2418 0:9d5f28595388 92 "MIIEowIBAAKCAQEAzPxG4Nb8d9ORnrkJPFHmK/uSBgRKBekMGPcI45YkDGSqCEJP\n"
kernel2418 0:9d5f28595388 93 "Hi2Gcco6v4tFkaF8vuJdiDmQtOttW2oR0tojwtO1MY9QVwVvn/ldKQZ1J5xitLU9\n"
kernel2418 0:9d5f28595388 94 "7hjhVTqD1AaImFPZgfwJ7+MF0Xaq1DQDFjKv5QMzr4H8hV507tALb1sCEjYgJN5c\n"
kernel2418 0:9d5f28595388 95 "thPtzwvzGvUcjDgI7EVG0KOun9hEZnfMmT4Al5W/8dpAp455GrujEtLYPN0aPkL8\n"
kernel2418 0:9d5f28595388 96 "kBqgUX9322CEvB8+piChn34LrnpRBKDKjx9G3htBjv0+97lALHG6zls6FZTZhVbe\n"
kernel2418 0:9d5f28595388 97 "i8ud7NbZvY/0qZXZeBCpjA97zXrZCJ2A6DuecwIDAQABAoIBAEbY7rppM6tKoWrl\n"
kernel2418 0:9d5f28595388 98 "cy6487/B3E9eDiOKz5aVUyoty1nJNQdTu7qna29KwRFQ1oOl99KVtFQP6VbOg+Zz\n"
kernel2418 0:9d5f28595388 99 "e6OPp4p/14FAkjjxdQoqiqtSQw2kvGzOs4/mY4MsjUGr3GwhluyZKuoRYgJqbFKZ\n"
kernel2418 0:9d5f28595388 100 "g3OZozeY6rU/TQLfibS8jSc4ojeehQx3cesJmnYA16iFjN8K/D2Tw+aJiKx+0D8k\n"
kernel2418 0:9d5f28595388 101 "nbpy19/2MzBW+UhunMpCtfDNx/HLQAYtzxbxczw7yUiQnmyf+0t0/+xm0m04eic1\n"
kernel2418 0:9d5f28595388 102 "GRHHInZSKzMfGtzyJXliFP5o92dspCm5vsiyXMcPzqcX192IZSixbG8etrJk8jXy\n"
kernel2418 0:9d5f28595388 103 "bTi85VkCgYEA6hOkrSZjbZvsgtjJCIbjMmn9rpBrG0Bv+V1gJ/dH3hZjo2qUnVB0\n"
kernel2418 0:9d5f28595388 104 "8PfBZ+oOoNjEWJlS38zf4pwHSBR6WzvH/o35EHvXNCcdKA82jmv0lbbdH2a4y19n\n"
kernel2418 0:9d5f28595388 105 "lnlyEocsFmPtyuSp+TwIxKI1d+mk9q9D6FgWyLHSddn/qY56txOx7M8CgYEA4C8f\n"
kernel2418 0:9d5f28595388 106 "6bz4a64KBnIZ7yWwwNkZ3Jn8wI62NiZpPpY5PfKtdYCdBHyuCWApE0e8pZy6fTTN\n"
kernel2418 0:9d5f28595388 107 "VVH9RJEq3UHxvEPzNOOhlAoRKT3BakmQ+Yw9Dg+xk6XiiCQuJcEnWG+IUFIjsxEK\n"
kernel2418 0:9d5f28595388 108 "SgSfzrVHtF3udlbP58b3gOSZvxBt8a3qBFPARR0CgYEA08hIAz0rUn1zxIMdiHB6\n"
kernel2418 0:9d5f28595388 109 "WR+anXke3v4zEVwRZreNt3tsVOtWYOrtkyOmQj17VL4rD7pRSBmWKvJeiDG27pqs\n"
kernel2418 0:9d5f28595388 110 "/Tw4r1hMwmvtLlRtWPiFx3s2n3WSFrdQAs4IjojsM6nf+OVggBZ4HGhilga38VVr\n"
kernel2418 0:9d5f28595388 111 "zGj+3EA/Gc/OR/uYPdI89fMCgYAHOz3qSkAxKQIFxzRy9GJJNjeRWB5BD9ls0bxf\n"
kernel2418 0:9d5f28595388 112 "WnUqPGPAAJAQDv2GK+XnS08YgH+7fjKJaAWlapFZZcEoc4Cq2hTiM5juHaHZjdnx\n"
kernel2418 0:9d5f28595388 113 "Usa9Z2AxBQ7TmWcrrJlaTu60uJGSOyB71r5Y6pwPg2AnzRETxuVA8R7MfPku7I85\n"
kernel2418 0:9d5f28595388 114 "6IGxOQKBgHyvFe38EHJndwgTZYK0fWWghRb6XmdH4MxZip2W6yO2Kzav6JuWamV6\n"
kernel2418 0:9d5f28595388 115 "0x80T4RWTpWFXVb288EkSEambrKX8Y0ihn7bFK/cAxD4j7oAGJCgW85mbMAZsj4b\n"
kernel2418 0:9d5f28595388 116 "OAvPvajSMJKyKrgIX/wMfTQlTqAvcsEA2FbrgX67BEBw9HUP2Mm6\n"
kernel2418 0:9d5f28595388 117 "-----END RSA PRIVATE KEY-----\n";
kernel2418 0:9d5f28595388 118
kernel2418 0:9d5f28595388 119 #if AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 120
kernel2418 0:9d5f28595388 121 #define AWS_IOT_MQTT_SERVER_NAME "a1fbcwaqfqeozo.iot.us-east-1.amazonaws.com"
kernel2418 0:9d5f28595388 122 #define AWS_IOT_MQTT_SERVER_PORT 8883
kernel2418 0:9d5f28595388 123
kernel2418 0:9d5f28595388 124 #define AWS_IOT_MQTT_THINGNAME "Nuvoton-Mbed-D001"
kernel2418 0:9d5f28595388 125 #define AWS_IOT_MQTT_CLIENTNAME "Nuvoton Client"
kernel2418 0:9d5f28595388 126
kernel2418 0:9d5f28595388 127 /* User self-test topic */
kernel2418 0:9d5f28595388 128 const char USER_MQTT_TOPIC[] = "Nuvoton/Mbed/D001";
kernel2418 0:9d5f28595388 129 const char *USER_MQTT_TOPIC_FILTERS[] = {
kernel2418 0:9d5f28595388 130 "Nuvoton/Mbed/+"
kernel2418 0:9d5f28595388 131 };
kernel2418 0:9d5f28595388 132 const char USER_MQTT_TOPIC_PUBLISH_MESSAGE[] = "{ \"message\": \"Hello from Nuvoton Mbed device\" }";
kernel2418 0:9d5f28595388 133
kernel2418 0:9d5f28595388 134 /* Update thing shadow */
kernel2418 0:9d5f28595388 135 const char UPDATETHINGSHADOW_MQTT_TOPIC[] = "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/update";
kernel2418 0:9d5f28595388 136 const char *UPDATETHINGSHADOW_MQTT_TOPIC_FILTERS[] = {
kernel2418 0:9d5f28595388 137 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/update/accepted",
kernel2418 0:9d5f28595388 138 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/update/rejected"
kernel2418 0:9d5f28595388 139 };
kernel2418 0:9d5f28595388 140 const char UPDATETHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE[] = "{ \"state\": { \"reported\": { \"attribute1\": 3, \"attribute2\": \"1\" } } }";
kernel2418 0:9d5f28595388 141
kernel2418 0:9d5f28595388 142 /* Get thing shadow */
kernel2418 0:9d5f28595388 143 const char GETTHINGSHADOW_MQTT_TOPIC[] = "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/get";
kernel2418 0:9d5f28595388 144 const char *GETTHINGSHADOW_MQTT_TOPIC_FILTERS[] = {
kernel2418 0:9d5f28595388 145 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/get/accepted",
kernel2418 0:9d5f28595388 146 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/get/rejected"
kernel2418 0:9d5f28595388 147 };
kernel2418 0:9d5f28595388 148 const char GETTHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE[] = "";
kernel2418 0:9d5f28595388 149
kernel2418 0:9d5f28595388 150 /* Delete thing shadow */
kernel2418 0:9d5f28595388 151 const char DELETETHINGSHADOW_MQTT_TOPIC[] = "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/delete";
kernel2418 0:9d5f28595388 152 const char *DELETETHINGSHADOW_MQTT_TOPIC_FILTERS[] = {
kernel2418 0:9d5f28595388 153 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/delete/accepted",
kernel2418 0:9d5f28595388 154 "$aws/things/" AWS_IOT_MQTT_THINGNAME "/shadow/delete/rejected"
kernel2418 0:9d5f28595388 155 };
kernel2418 0:9d5f28595388 156 const char DELETETHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE[] = "";
kernel2418 0:9d5f28595388 157
kernel2418 0:9d5f28595388 158 /* MQTT user buffer size */
kernel2418 0:9d5f28595388 159 const int MQTT_USER_BUFFER_SIZE = 600;
kernel2418 0:9d5f28595388 160
kernel2418 0:9d5f28595388 161 /* Configure MAX_MQTT_PACKET_SIZE to meet your application.
kernel2418 0:9d5f28595388 162 * We may meet unknown MQTT error with MAX_MQTT_PACKET_SIZE too small, but
kernel2418 0:9d5f28595388 163 * MQTT lib doesn't tell enough error message. Try to enlarge it. */
kernel2418 0:9d5f28595388 164 const int MAX_MQTT_PACKET_SIZE = 1000;
kernel2418 0:9d5f28595388 165
kernel2418 0:9d5f28595388 166 #endif // End of AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 167
kernel2418 0:9d5f28595388 168 #if AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 169
kernel2418 0:9d5f28595388 170 #define AWS_IOT_HTTPS_SERVER_NAME "a1fbcwaqfqeozo.iot.us-east-1.amazonaws.com"
kernel2418 0:9d5f28595388 171 #define AWS_IOT_HTTPS_SERVER_PORT 8443
kernel2418 0:9d5f28595388 172
kernel2418 0:9d5f28595388 173 #define AWS_IOT_HTTPS_THINGNAME "Nuvoton-Mbed-D001"
kernel2418 0:9d5f28595388 174
kernel2418 0:9d5f28595388 175 /* Publish to user topic through HTTPS/POST
kernel2418 0:9d5f28595388 176 * HTTP POST https://"endpoint"/topics/"yourTopicHierarchy" */
kernel2418 0:9d5f28595388 177 const char USER_TOPIC_HTTPS_PATH[] = "/topics/Nuvoton/Mbed/D001?qos=1";
kernel2418 0:9d5f28595388 178 const char USER_TOPIC_HTTPS_REQUEST_METHOD[] = "POST";
kernel2418 0:9d5f28595388 179 const char USER_TOPIC_HTTPS_REQUEST_MESSAGE_BODY[] = "{ \"message\": \"Hello from Nuvoton Mbed device\" }";
kernel2418 0:9d5f28595388 180
kernel2418 0:9d5f28595388 181 /* Update thing shadow by publishing to UpdateThingShadow topic through HTTPS/POST
kernel2418 0:9d5f28595388 182 * HTTP POST https://"endpoint"/topics/$aws/things/"thingName"/shadow/update */
kernel2418 0:9d5f28595388 183 const char UPDATETHINGSHADOW_TOPIC_HTTPS_PATH[] = "/topics/$aws/things/" AWS_IOT_HTTPS_THINGNAME "/shadow/update?qos=1";
kernel2418 0:9d5f28595388 184 const char UPDATETHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD[] = "POST";
kernel2418 0:9d5f28595388 185 const char UPDATETHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY[] = "{ \"state\": { \"reported\": { \"attribute1\": 3, \"attribute2\": \"1\" } } }";
kernel2418 0:9d5f28595388 186
kernel2418 0:9d5f28595388 187 /* Get thing shadow by publishing to GetThingShadow topic through HTTPS/POST
kernel2418 0:9d5f28595388 188 * HTTP POST https://"endpoint"/topics/$aws/things/"thingName"/shadow/get */
kernel2418 0:9d5f28595388 189 const char GETTHINGSHADOW_TOPIC_HTTPS_PATH[] = "/topics/$aws/things/" AWS_IOT_HTTPS_THINGNAME "/shadow/get?qos=1";
kernel2418 0:9d5f28595388 190 const char GETTHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD[] = "POST";
kernel2418 0:9d5f28595388 191 const char GETTHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY[] = "";
kernel2418 0:9d5f28595388 192
kernel2418 0:9d5f28595388 193 /* Delete thing shadow by publishing to DeleteThingShadow topic through HTTPS/POST
kernel2418 0:9d5f28595388 194 * HTTP POST https://"endpoint"/topics/$aws/things/"thingName"/shadow/delete */
kernel2418 0:9d5f28595388 195 const char DELETETHINGSHADOW_TOPIC_HTTPS_PATH[] = "/topics/$aws/things/" AWS_IOT_HTTPS_THINGNAME "/shadow/delete?qos=1";
kernel2418 0:9d5f28595388 196 const char DELETETHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD[] = "POST";
kernel2418 0:9d5f28595388 197 const char DELETETHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY[] = "";
kernel2418 0:9d5f28595388 198
kernel2418 0:9d5f28595388 199 /* Update thing shadow RESTfully through HTTPS/POST
kernel2418 0:9d5f28595388 200 * HTTP POST https://endpoint/things/thingName/shadow */
kernel2418 0:9d5f28595388 201 const char UPDATETHINGSHADOW_THING_HTTPS_PATH[] = "/things/" AWS_IOT_HTTPS_THINGNAME "/shadow";
kernel2418 0:9d5f28595388 202 const char UPDATETHINGSHADOW_THING_HTTPS_REQUEST_METHOD[] = "POST";
kernel2418 0:9d5f28595388 203 const char UPDATETHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY[] = "{ \"state\": { \"desired\": { \"attribute1\": 1, \"attribute2\": \"2\" }, \"reported\": { \"attribute1\": 2, \"attribute2\": \"1\" } } }";
kernel2418 0:9d5f28595388 204
kernel2418 0:9d5f28595388 205 /* Get thing shadow RESTfully through HTTPS/GET
kernel2418 0:9d5f28595388 206 * HTTP GET https://"endpoint"/things/"thingName"/shadow */
kernel2418 0:9d5f28595388 207 const char GETTHINGSHADOW_THING_HTTPS_PATH[] = "/things/" AWS_IOT_HTTPS_THINGNAME "/shadow";
kernel2418 0:9d5f28595388 208 const char GETTHINGSHADOW_THING_HTTPS_REQUEST_METHOD[] = "GET";
kernel2418 0:9d5f28595388 209 const char GETTHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY[] = "";
kernel2418 0:9d5f28595388 210
kernel2418 0:9d5f28595388 211 /* Delete thing shadow RESTfully through HTTPS/DELETE
kernel2418 0:9d5f28595388 212 * HTTP DELETE https://endpoint/things/thingName/shadow */
kernel2418 0:9d5f28595388 213 const char DELETETHINGSHADOW_THING_HTTPS_PATH[] = "/things/" AWS_IOT_HTTPS_THINGNAME "/shadow";
kernel2418 0:9d5f28595388 214 const char DELETETHINGSHADOW_THING_HTTPS_REQUEST_METHOD[] = "DELETE";
kernel2418 0:9d5f28595388 215 const char DELETETHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY[] = "";
kernel2418 0:9d5f28595388 216
kernel2418 0:9d5f28595388 217 /* HTTPS user buffer size */
kernel2418 0:9d5f28595388 218 const int HTTPS_USER_BUFFER_SIZE = 600;
kernel2418 0:9d5f28595388 219
kernel2418 0:9d5f28595388 220 const char *HTTPS_OK_STR = "200 OK";
kernel2418 0:9d5f28595388 221
kernel2418 0:9d5f28595388 222 #endif // End of AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 223
kernel2418 0:9d5f28595388 224 }
kernel2418 0:9d5f28595388 225
kernel2418 0:9d5f28595388 226 #if AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 227
kernel2418 0:9d5f28595388 228 /**
kernel2418 0:9d5f28595388 229 * /brief AWS_IoT_MQTT_Test implements the logic with AWS IoT User/Thing Shadow topics through MQTT.
kernel2418 0:9d5f28595388 230 */
kernel2418 0:9d5f28595388 231 class AWS_IoT_MQTT_Test {
kernel2418 0:9d5f28595388 232
kernel2418 0:9d5f28595388 233 public:
kernel2418 0:9d5f28595388 234 /**
kernel2418 0:9d5f28595388 235 * @brief AWS_IoT_MQTT_Test Constructor
kernel2418 0:9d5f28595388 236 *
kernel2418 0:9d5f28595388 237 * @param[in] domain Domain name of the MQTT server
kernel2418 0:9d5f28595388 238 * @param[in] port Port number of the MQTT server
kernel2418 0:9d5f28595388 239 * @param[in] net_iface Network interface
kernel2418 0:9d5f28595388 240 */
kernel2418 0:9d5f28595388 241 AWS_IoT_MQTT_Test(const char * domain, const uint16_t port, NetworkInterface *net_iface) :
kernel2418 0:9d5f28595388 242 _domain(domain), _port(port) {
kernel2418 0:9d5f28595388 243 _tlssocket = new TLSSocket(net_iface, SSL_CA_CERT_PEM, SSL_USER_CERT_PEM, SSL_USER_PRIV_KEY_PEM);
kernel2418 0:9d5f28595388 244 /* Blocking mode */
kernel2418 0:9d5f28595388 245 _tlssocket->set_blocking(true);
kernel2418 0:9d5f28595388 246 /* Print Mbed TLS handshake log */
kernel2418 0:9d5f28595388 247 _tlssocket->set_debug(true);
kernel2418 0:9d5f28595388 248
kernel2418 0:9d5f28595388 249 _mqtt_client = new MQTT::Client<TLSSocket, Countdown, MAX_MQTT_PACKET_SIZE>(*_tlssocket);
kernel2418 0:9d5f28595388 250 }
kernel2418 0:9d5f28595388 251
kernel2418 0:9d5f28595388 252 /**
kernel2418 0:9d5f28595388 253 * @brief AWS_IoT_MQTT_Test Destructor
kernel2418 0:9d5f28595388 254 */
kernel2418 0:9d5f28595388 255 ~AWS_IoT_MQTT_Test() {
kernel2418 0:9d5f28595388 256 delete _mqtt_client;
kernel2418 0:9d5f28595388 257 _mqtt_client = NULL;
kernel2418 0:9d5f28595388 258
kernel2418 0:9d5f28595388 259 _tlssocket->close();
kernel2418 0:9d5f28595388 260 delete _tlssocket;
kernel2418 0:9d5f28595388 261 _tlssocket = NULL;
kernel2418 0:9d5f28595388 262 }
kernel2418 0:9d5f28595388 263 /**
kernel2418 0:9d5f28595388 264 * @brief Start AWS IoT test through MQTT
kernel2418 0:9d5f28595388 265 */
kernel2418 0:9d5f28595388 266 void start_test() {
kernel2418 0:9d5f28595388 267
kernel2418 0:9d5f28595388 268 int tls_rc;
kernel2418 0:9d5f28595388 269 int mqtt_rc;
kernel2418 0:9d5f28595388 270
kernel2418 0:9d5f28595388 271 do {
kernel2418 0:9d5f28595388 272 /* Connect to the server */
kernel2418 0:9d5f28595388 273 /* Initialize TLS-related stuff */
kernel2418 0:9d5f28595388 274 printf("Connecting with %s:%d\n", _domain, _port);
kernel2418 0:9d5f28595388 275 tls_rc = _tlssocket->connect(_domain, _port);
kernel2418 0:9d5f28595388 276 if (tls_rc != NSAPI_ERROR_OK) {
kernel2418 0:9d5f28595388 277 printf("Connects with %s:%d failed: %d\n", _domain, _port, tls_rc);
kernel2418 0:9d5f28595388 278 break;
kernel2418 0:9d5f28595388 279 }
kernel2418 0:9d5f28595388 280 printf("Connects with %s:%d OK\n", _domain, _port);
kernel2418 0:9d5f28595388 281
kernel2418 0:9d5f28595388 282 /* See the link below for AWS IoT support for MQTT:
kernel2418 0:9d5f28595388 283 * http://docs.aws.amazon.com/iot/latest/developerguide/protocols.html */
kernel2418 0:9d5f28595388 284
kernel2418 0:9d5f28595388 285 /* MQTT connect */
kernel2418 0:9d5f28595388 286 /* The message broker does not support persistent sessions (connections made with
kernel2418 0:9d5f28595388 287 * the cleanSession flag set to false. */
kernel2418 0:9d5f28595388 288 MQTTPacket_connectData conn_data = MQTTPacket_connectData_initializer;
kernel2418 0:9d5f28595388 289 /* AWS IoT message broker implementation is based on MQTT version 3.1.1
kernel2418 0:9d5f28595388 290 * 3 = 3.1
kernel2418 0:9d5f28595388 291 * 4 = 3.1.1 */
kernel2418 0:9d5f28595388 292 conn_data.MQTTVersion = 4;
kernel2418 0:9d5f28595388 293 /* Version number of this structure. Must be 0 */
kernel2418 0:9d5f28595388 294 conn_data.struct_version = 0;
kernel2418 0:9d5f28595388 295 /* The message broker uses the client ID to identify each client. The client ID is passed
kernel2418 0:9d5f28595388 296 * in from the client to the message broker as part of the MQTT payload. Two clients with
kernel2418 0:9d5f28595388 297 * the same client ID are not allowed to be connected concurrently to the message broker.
kernel2418 0:9d5f28595388 298 * When a client connects to the message broker using a client ID that another client is using,
kernel2418 0:9d5f28595388 299 * a CONNACK message will be sent to both clients and the currently connected client will be
kernel2418 0:9d5f28595388 300 * disconnected. */
kernel2418 0:9d5f28595388 301 conn_data.clientID.cstring = AWS_IOT_MQTT_CLIENTNAME;
kernel2418 0:9d5f28595388 302 /* The message broker does not support persistent sessions (connections made with
kernel2418 0:9d5f28595388 303 * the cleanSession flag set to false. The AWS IoT message broker assumes all sessions
kernel2418 0:9d5f28595388 304 * are clean sessions and messages are not stored across sessions. If an MQTT client
kernel2418 0:9d5f28595388 305 * attempts to connect to the AWS IoT message broker with the cleanSession set to false,
kernel2418 0:9d5f28595388 306 * the client will be disconnected. */
kernel2418 0:9d5f28595388 307 conn_data.cleansession = 1;
kernel2418 0:9d5f28595388 308 //conn_data.username.cstring = "USERNAME";
kernel2418 0:9d5f28595388 309 //conn_data.password.cstring = "PASSWORD";
kernel2418 0:9d5f28595388 310
kernel2418 0:9d5f28595388 311 MQTT::connackData connack_data;
kernel2418 0:9d5f28595388 312
kernel2418 0:9d5f28595388 313 /* _tlssocket must connect to the network endpoint before calling this. */
kernel2418 0:9d5f28595388 314 printf("MQTT connecting");
kernel2418 0:9d5f28595388 315 if ((mqtt_rc = _mqtt_client->connect(conn_data, connack_data)) != 0) {
kernel2418 0:9d5f28595388 316 printf("\rMQTT connects failed: %d\n", mqtt_rc);
kernel2418 0:9d5f28595388 317 break;
kernel2418 0:9d5f28595388 318 }
kernel2418 0:9d5f28595388 319 printf("\rMQTT connects OK\n\n");
kernel2418 0:9d5f28595388 320
kernel2418 0:9d5f28595388 321 /* Subscribe/publish user topic */
kernel2418 0:9d5f28595388 322 printf("Subscribing/publishing user topic\n");
kernel2418 0:9d5f28595388 323 if (! sub_pub_topic(USER_MQTT_TOPIC, USER_MQTT_TOPIC_FILTERS, sizeof (USER_MQTT_TOPIC_FILTERS) / sizeof (USER_MQTT_TOPIC_FILTERS[0]), USER_MQTT_TOPIC_PUBLISH_MESSAGE)) {
kernel2418 0:9d5f28595388 324 break;
kernel2418 0:9d5f28595388 325 }
kernel2418 0:9d5f28595388 326 printf("Subscribes/publishes user topic OK\n\n");
kernel2418 0:9d5f28595388 327
kernel2418 0:9d5f28595388 328 /* Subscribe/publish UpdateThingShadow topic */
kernel2418 0:9d5f28595388 329 printf("Subscribing/publishing UpdateThingShadow topic\n");
kernel2418 0:9d5f28595388 330 if (! sub_pub_topic(UPDATETHINGSHADOW_MQTT_TOPIC, UPDATETHINGSHADOW_MQTT_TOPIC_FILTERS, sizeof (UPDATETHINGSHADOW_MQTT_TOPIC_FILTERS) / sizeof (UPDATETHINGSHADOW_MQTT_TOPIC_FILTERS[0]), UPDATETHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE)) {
kernel2418 0:9d5f28595388 331 break;
kernel2418 0:9d5f28595388 332 }
kernel2418 0:9d5f28595388 333 printf("Subscribes/publishes UpdateThingShadow topic OK\n\n");
kernel2418 0:9d5f28595388 334
kernel2418 0:9d5f28595388 335 /* Subscribe/publish GetThingShadow topic */
kernel2418 0:9d5f28595388 336 printf("Subscribing/publishing GetThingShadow topic\n");
kernel2418 0:9d5f28595388 337 if (! sub_pub_topic(GETTHINGSHADOW_MQTT_TOPIC, GETTHINGSHADOW_MQTT_TOPIC_FILTERS, sizeof (GETTHINGSHADOW_MQTT_TOPIC_FILTERS) / sizeof (GETTHINGSHADOW_MQTT_TOPIC_FILTERS[0]), GETTHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE)) {
kernel2418 0:9d5f28595388 338 break;
kernel2418 0:9d5f28595388 339 }
kernel2418 0:9d5f28595388 340 printf("Subscribes/publishes GetThingShadow topic OK\n\n");
kernel2418 0:9d5f28595388 341
kernel2418 0:9d5f28595388 342 /* Subscribe/publish DeleteThingShadow topic */
kernel2418 0:9d5f28595388 343 printf("Subscribing/publishing DeleteThingShadow topic\n");
kernel2418 0:9d5f28595388 344 if (! sub_pub_topic(DELETETHINGSHADOW_MQTT_TOPIC, DELETETHINGSHADOW_MQTT_TOPIC_FILTERS, sizeof (DELETETHINGSHADOW_MQTT_TOPIC_FILTERS) / sizeof (DELETETHINGSHADOW_MQTT_TOPIC_FILTERS[0]), DELETETHINGSHADOW_MQTT_TOPIC_PUBLISH_MESSAGE)) {
kernel2418 0:9d5f28595388 345 break;
kernel2418 0:9d5f28595388 346 }
kernel2418 0:9d5f28595388 347 printf("Subscribes/publishes DeleteThingShadow topic OK\n\n");
kernel2418 0:9d5f28595388 348
kernel2418 0:9d5f28595388 349 } while (0);
kernel2418 0:9d5f28595388 350
kernel2418 0:9d5f28595388 351 printf("MQTT disconnecting");
kernel2418 0:9d5f28595388 352 if ((mqtt_rc = _mqtt_client->disconnect()) != 0) {
kernel2418 0:9d5f28595388 353 printf("\rMQTT disconnects failed %d\n", mqtt_rc);
kernel2418 0:9d5f28595388 354 }
kernel2418 0:9d5f28595388 355 printf("\rMQTT disconnects OK\n");
kernel2418 0:9d5f28595388 356
kernel2418 0:9d5f28595388 357 _tlssocket->close();
kernel2418 0:9d5f28595388 358 }
kernel2418 0:9d5f28595388 359
kernel2418 0:9d5f28595388 360
kernel2418 0:9d5f28595388 361 protected:
kernel2418 0:9d5f28595388 362
kernel2418 0:9d5f28595388 363 /**
kernel2418 0:9d5f28595388 364 * @brief Subscribe/publish specific topic
kernel2418 0:9d5f28595388 365 */
kernel2418 0:9d5f28595388 366 bool sub_pub_topic(const char *topic, const char **topic_filters, size_t topic_filters_size, const char *publish_message_body) {
kernel2418 0:9d5f28595388 367
kernel2418 0:9d5f28595388 368 bool ret = false;
kernel2418 0:9d5f28595388 369 int mqtt_rc;
kernel2418 0:9d5f28595388 370
kernel2418 0:9d5f28595388 371 do {
kernel2418 0:9d5f28595388 372 const char **topic_filter;
kernel2418 0:9d5f28595388 373 const char **topic_filter_end = topic_filters + topic_filters_size;
kernel2418 0:9d5f28595388 374
kernel2418 0:9d5f28595388 375 for (topic_filter = topic_filters; topic_filter != topic_filter_end; topic_filter ++) {
kernel2418 0:9d5f28595388 376 /* AWS IoT does not support publishing and subscribing with QoS 2.
kernel2418 0:9d5f28595388 377 * The AWS IoT message broker does not send a PUBACK or SUBACK when QoS 2 is requested. */
kernel2418 0:9d5f28595388 378 printf("MQTT subscribing to %s", *topic_filter);
kernel2418 0:9d5f28595388 379 if ((mqtt_rc = _mqtt_client->subscribe(*topic_filter, MQTT::QOS1, message_arrived)) != 0) {
kernel2418 0:9d5f28595388 380 printf("\rMQTT subscribes to %s failed: %d\n", *topic_filter, mqtt_rc);
kernel2418 0:9d5f28595388 381 continue;
kernel2418 0:9d5f28595388 382 }
kernel2418 0:9d5f28595388 383 printf("\rMQTT subscribes to %s OK\n", *topic_filter);
kernel2418 0:9d5f28595388 384 }
kernel2418 0:9d5f28595388 385
kernel2418 0:9d5f28595388 386 MQTT::Message message;
kernel2418 0:9d5f28595388 387
kernel2418 0:9d5f28595388 388 int _bpos;
kernel2418 0:9d5f28595388 389
kernel2418 0:9d5f28595388 390 _bpos = snprintf(_buffer, sizeof (_buffer) - 1, publish_message_body);
kernel2418 0:9d5f28595388 391 if (_bpos < 0 || ((size_t) _bpos) > (sizeof (_buffer) - 1)) {
kernel2418 0:9d5f28595388 392 printf("snprintf failed: %d\n", _bpos);
kernel2418 0:9d5f28595388 393 break;
kernel2418 0:9d5f28595388 394 }
kernel2418 0:9d5f28595388 395 _buffer[_bpos] = 0;
kernel2418 0:9d5f28595388 396 /* AWS IoT does not support publishing and subscribing with QoS 2.
kernel2418 0:9d5f28595388 397 * The AWS IoT message broker does not send a PUBACK or SUBACK when QoS 2 is requested. */
kernel2418 0:9d5f28595388 398 message.qos = MQTT::QOS1;
kernel2418 0:9d5f28595388 399 message.retained = false;
kernel2418 0:9d5f28595388 400 message.dup = false;
kernel2418 0:9d5f28595388 401 message.payload = _buffer;
kernel2418 0:9d5f28595388 402 message.payloadlen = strlen(_buffer);
kernel2418 0:9d5f28595388 403 /* Print publish message */
kernel2418 0:9d5f28595388 404 printf("Message to publish:\n");
kernel2418 0:9d5f28595388 405 printf("%s\n", _buffer);
kernel2418 0:9d5f28595388 406 printf("MQTT publishing message to %s", topic);
kernel2418 0:9d5f28595388 407 if ((mqtt_rc = _mqtt_client->publish(topic, message)) != 0) {
kernel2418 0:9d5f28595388 408 printf("\rMQTT publishes message to %s failed: %d\n", topic, mqtt_rc);
kernel2418 0:9d5f28595388 409 break;
kernel2418 0:9d5f28595388 410 }
kernel2418 0:9d5f28595388 411 printf("\rMQTT publishes message to %s OK\n", topic);
kernel2418 0:9d5f28595388 412
kernel2418 0:9d5f28595388 413 /* Receive message with subscribed topic */
kernel2418 0:9d5f28595388 414 while (! _message_arrive_count) {
kernel2418 0:9d5f28595388 415 _mqtt_client->yield(100);
kernel2418 0:9d5f28595388 416 }
kernel2418 0:9d5f28595388 417 clear_message_arrive_count();
kernel2418 0:9d5f28595388 418 printf("\n");
kernel2418 0:9d5f28595388 419
kernel2418 0:9d5f28595388 420 /* Unsubscribe
kernel2418 0:9d5f28595388 421 * We meet second unsubscribe failed. This is caused by MQTT lib bug. */
kernel2418 0:9d5f28595388 422 for (topic_filter = topic_filters; topic_filter != topic_filter_end; topic_filter ++) {
kernel2418 0:9d5f28595388 423 printf("MQTT unsubscribing from %s", *topic_filter);
kernel2418 0:9d5f28595388 424 if ((mqtt_rc = _mqtt_client->unsubscribe(*topic_filter)) != 0) {
kernel2418 0:9d5f28595388 425 printf("\rMQTT unsubscribes from %s failed: %d\n", *topic_filter, mqtt_rc);
kernel2418 0:9d5f28595388 426 continue;
kernel2418 0:9d5f28595388 427 }
kernel2418 0:9d5f28595388 428 printf("\rMQTT unsubscribes from %s OK\n", *topic_filter);
kernel2418 0:9d5f28595388 429 }
kernel2418 0:9d5f28595388 430
kernel2418 0:9d5f28595388 431 ret = true;
kernel2418 0:9d5f28595388 432
kernel2418 0:9d5f28595388 433 } while (0);
kernel2418 0:9d5f28595388 434
kernel2418 0:9d5f28595388 435 return ret;
kernel2418 0:9d5f28595388 436 }
kernel2418 0:9d5f28595388 437
kernel2418 0:9d5f28595388 438 protected:
kernel2418 0:9d5f28595388 439 TLSSocket * _tlssocket;
kernel2418 0:9d5f28595388 440 MQTT::Client<TLSSocket, Countdown, MAX_MQTT_PACKET_SIZE> * _mqtt_client;
kernel2418 0:9d5f28595388 441
kernel2418 0:9d5f28595388 442 const char *_domain; /**< Domain name of the MQTT server */
kernel2418 0:9d5f28595388 443 const uint16_t _port; /**< Port number of the MQTT server */
kernel2418 0:9d5f28595388 444 char _buffer[MQTT_USER_BUFFER_SIZE]; /**< User buffer */
kernel2418 0:9d5f28595388 445
kernel2418 0:9d5f28595388 446 private:
kernel2418 0:9d5f28595388 447 static volatile uint16_t _message_arrive_count;
kernel2418 0:9d5f28595388 448
kernel2418 0:9d5f28595388 449 static void message_arrived(MQTT::MessageData& md) {
kernel2418 0:9d5f28595388 450 MQTT::Message &message = md.message;
kernel2418 0:9d5f28595388 451 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
kernel2418 0:9d5f28595388 452 printf("Payload:\n");
kernel2418 0:9d5f28595388 453 printf("%.*s\n", message.payloadlen, (char*)message.payload);
kernel2418 0:9d5f28595388 454 ++ _message_arrive_count;
kernel2418 0:9d5f28595388 455 }
kernel2418 0:9d5f28595388 456
kernel2418 0:9d5f28595388 457 static void clear_message_arrive_count() {
kernel2418 0:9d5f28595388 458 _message_arrive_count = 0;
kernel2418 0:9d5f28595388 459 }
kernel2418 0:9d5f28595388 460 };
kernel2418 0:9d5f28595388 461
kernel2418 0:9d5f28595388 462 volatile uint16_t AWS_IoT_MQTT_Test::_message_arrive_count = 0;
kernel2418 0:9d5f28595388 463
kernel2418 0:9d5f28595388 464 #endif // End of AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 465
kernel2418 0:9d5f28595388 466
kernel2418 0:9d5f28595388 467 #if AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 468
kernel2418 0:9d5f28595388 469 /**
kernel2418 0:9d5f28595388 470 * /brief AWS_IoT_HTTPS_Test implements the logic with AWS IoT User/Thing Shadow topics (publish-only)
kernel2418 0:9d5f28595388 471 * and Thing Shadow RESTful API through HTTPS.
kernel2418 0:9d5f28595388 472 */
kernel2418 0:9d5f28595388 473 class AWS_IoT_HTTPS_Test {
kernel2418 0:9d5f28595388 474
kernel2418 0:9d5f28595388 475 public:
kernel2418 0:9d5f28595388 476 /**
kernel2418 0:9d5f28595388 477 * @brief AWS_IoT_HTTPS_Test Constructor
kernel2418 0:9d5f28595388 478 *
kernel2418 0:9d5f28595388 479 * @param[in] domain Domain name of the HTTPS server
kernel2418 0:9d5f28595388 480 * @param[in] port Port number of the HTTPS server
kernel2418 0:9d5f28595388 481 * @param[in] net_iface Network interface
kernel2418 0:9d5f28595388 482 */
kernel2418 0:9d5f28595388 483 AWS_IoT_HTTPS_Test(const char * domain, const uint16_t port, NetworkInterface *net_iface) :
kernel2418 0:9d5f28595388 484 _domain(domain), _port(port) {
kernel2418 0:9d5f28595388 485
kernel2418 0:9d5f28595388 486 _tlssocket = new TLSSocket(net_iface, SSL_CA_CERT_PEM, SSL_USER_CERT_PEM, SSL_USER_PRIV_KEY_PEM);
kernel2418 0:9d5f28595388 487 /* Non-blocking mode */
kernel2418 0:9d5f28595388 488 _tlssocket->set_blocking(false);
kernel2418 0:9d5f28595388 489 /* Print Mbed TLS handshake log */
kernel2418 0:9d5f28595388 490 _tlssocket->set_debug(true);
kernel2418 0:9d5f28595388 491 }
kernel2418 0:9d5f28595388 492 /**
kernel2418 0:9d5f28595388 493 * @brief AWS_IoT_HTTPS_Test Destructor
kernel2418 0:9d5f28595388 494 */
kernel2418 0:9d5f28595388 495 ~AWS_IoT_HTTPS_Test() {
kernel2418 0:9d5f28595388 496 _tlssocket->close();
kernel2418 0:9d5f28595388 497 delete _tlssocket;
kernel2418 0:9d5f28595388 498 _tlssocket = NULL;
kernel2418 0:9d5f28595388 499 }
kernel2418 0:9d5f28595388 500 /**
kernel2418 0:9d5f28595388 501 * @brief Start AWS IoT test through HTTPS
kernel2418 0:9d5f28595388 502 *
kernel2418 0:9d5f28595388 503 * @param[in] path The path of the file to fetch from the HTTPS server
kernel2418 0:9d5f28595388 504 */
kernel2418 0:9d5f28595388 505 void start_test() {
kernel2418 0:9d5f28595388 506
kernel2418 0:9d5f28595388 507 int tls_rc;
kernel2418 0:9d5f28595388 508
kernel2418 0:9d5f28595388 509 do {
kernel2418 0:9d5f28595388 510 /* Connect to the server */
kernel2418 0:9d5f28595388 511 /* Initialize TLS-related stuff */
kernel2418 0:9d5f28595388 512 printf("Connecting with %s:%d\n", _domain, _port);
kernel2418 0:9d5f28595388 513 tls_rc = _tlssocket->connect(_domain, _port);
kernel2418 0:9d5f28595388 514 if (tls_rc != NSAPI_ERROR_OK) {
kernel2418 0:9d5f28595388 515 printf("Connects with %s:%d failed: %d\n", _domain, _port, tls_rc);
kernel2418 0:9d5f28595388 516 break;
kernel2418 0:9d5f28595388 517 }
kernel2418 0:9d5f28595388 518 printf("Connects with %s:%d OK\n\n", _domain, _port);
kernel2418 0:9d5f28595388 519
kernel2418 0:9d5f28595388 520 /* Publish to user topic through HTTPS/POST */
kernel2418 0:9d5f28595388 521 printf("Publishing to user topic through HTTPS/POST\n");
kernel2418 0:9d5f28595388 522 if (! run_req_resp(USER_TOPIC_HTTPS_PATH, USER_TOPIC_HTTPS_REQUEST_METHOD, USER_TOPIC_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 523 break;
kernel2418 0:9d5f28595388 524 }
kernel2418 0:9d5f28595388 525 printf("Publishes to user topic through HTTPS/POST OK\n\n");
kernel2418 0:9d5f28595388 526
kernel2418 0:9d5f28595388 527 /* Update thing shadow by publishing to UpdateThingShadow topic through HTTPS/POST */
kernel2418 0:9d5f28595388 528 printf("Updating thing shadow by publishing to Update Thing Shadow topic through HTTPS/POST\n");
kernel2418 0:9d5f28595388 529 if (! run_req_resp(UPDATETHINGSHADOW_TOPIC_HTTPS_PATH, UPDATETHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD, UPDATETHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 530 break;
kernel2418 0:9d5f28595388 531 }
kernel2418 0:9d5f28595388 532 printf("Update thing shadow by publishing to Update Thing Shadow topic through HTTPS/POST OK\n\n");
kernel2418 0:9d5f28595388 533
kernel2418 0:9d5f28595388 534 /* Get thing shadow by publishing to GetThingShadow topic through HTTPS/POST */
kernel2418 0:9d5f28595388 535 printf("Getting thing shadow by publishing to GetThingShadow topic through HTTPS/POST\n");
kernel2418 0:9d5f28595388 536 if (! run_req_resp(GETTHINGSHADOW_TOPIC_HTTPS_PATH, GETTHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD, GETTHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 537 break;
kernel2418 0:9d5f28595388 538 }
kernel2418 0:9d5f28595388 539 printf("Get thing shadow by publishing to GetThingShadow topic through HTTPS/POST OK\n\n");
kernel2418 0:9d5f28595388 540
kernel2418 0:9d5f28595388 541 /* Delete thing shadow by publishing to DeleteThingShadow topic through HTTPS/POST */
kernel2418 0:9d5f28595388 542 printf("Deleting thing shadow by publishing to DeleteThingShadow topic through HTTPS/POST\n");
kernel2418 0:9d5f28595388 543 if (! run_req_resp(DELETETHINGSHADOW_TOPIC_HTTPS_PATH, DELETETHINGSHADOW_TOPIC_HTTPS_REQUEST_METHOD, DELETETHINGSHADOW_TOPIC_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 544 break;
kernel2418 0:9d5f28595388 545 }
kernel2418 0:9d5f28595388 546 printf("Delete thing shadow by publishing to DeleteThingShadow topic through HTTPS/POST OK\n\n");
kernel2418 0:9d5f28595388 547
kernel2418 0:9d5f28595388 548 /* Update thing shadow RESTfully through HTTPS/POST */
kernel2418 0:9d5f28595388 549 printf("Updating thing shadow RESTfully through HTTPS/POST\n");
kernel2418 0:9d5f28595388 550 if (! run_req_resp(UPDATETHINGSHADOW_THING_HTTPS_PATH, UPDATETHINGSHADOW_THING_HTTPS_REQUEST_METHOD, UPDATETHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 551 break;
kernel2418 0:9d5f28595388 552 }
kernel2418 0:9d5f28595388 553 printf("Update thing shadow RESTfully through HTTPS/POST OK\n\n");
kernel2418 0:9d5f28595388 554
kernel2418 0:9d5f28595388 555 /* Get thing shadow RESTfully through HTTPS/GET */
kernel2418 0:9d5f28595388 556 printf("Getting thing shadow RESTfully through HTTPS/GET\n");
kernel2418 0:9d5f28595388 557 if (! run_req_resp(GETTHINGSHADOW_THING_HTTPS_PATH, GETTHINGSHADOW_THING_HTTPS_REQUEST_METHOD, GETTHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 558 break;
kernel2418 0:9d5f28595388 559 }
kernel2418 0:9d5f28595388 560 printf("Get thing shadow RESTfully through HTTPS/GET OK\n\n");
kernel2418 0:9d5f28595388 561
kernel2418 0:9d5f28595388 562 /* Delete thing shadow RESTfully through HTTPS/DELETE */
kernel2418 0:9d5f28595388 563 printf("Deleting thing shadow RESTfully through HTTPS/DELETE\n");
kernel2418 0:9d5f28595388 564 if (! run_req_resp(DELETETHINGSHADOW_THING_HTTPS_PATH, DELETETHINGSHADOW_THING_HTTPS_REQUEST_METHOD, DELETETHINGSHADOW_THING_HTTPS_REQUEST_MESSAGE_BODY)) {
kernel2418 0:9d5f28595388 565 break;
kernel2418 0:9d5f28595388 566 }
kernel2418 0:9d5f28595388 567 printf("Delete thing shadow RESTfully through HTTPS/DELETE OK\n\n");
kernel2418 0:9d5f28595388 568
kernel2418 0:9d5f28595388 569 } while (0);
kernel2418 0:9d5f28595388 570
kernel2418 0:9d5f28595388 571 /* Close socket */
kernel2418 0:9d5f28595388 572 _tlssocket->close();
kernel2418 0:9d5f28595388 573 }
kernel2418 0:9d5f28595388 574
kernel2418 0:9d5f28595388 575 protected:
kernel2418 0:9d5f28595388 576
kernel2418 0:9d5f28595388 577 /**
kernel2418 0:9d5f28595388 578 * @brief Run request/response through HTTPS
kernel2418 0:9d5f28595388 579 */
kernel2418 0:9d5f28595388 580 bool run_req_resp(const char *https_path, const char *https_request_method, const char *https_request_message_body) {
kernel2418 0:9d5f28595388 581
kernel2418 0:9d5f28595388 582 bool ret = false;
kernel2418 0:9d5f28595388 583
kernel2418 0:9d5f28595388 584 do {
kernel2418 0:9d5f28595388 585 int tls_rc;
kernel2418 0:9d5f28595388 586 bool _got200 = false;
kernel2418 0:9d5f28595388 587
kernel2418 0:9d5f28595388 588 int _bpos;
kernel2418 0:9d5f28595388 589
kernel2418 0:9d5f28595388 590 /* Fill the request buffer */
kernel2418 0:9d5f28595388 591 _bpos = snprintf(_buffer, sizeof(_buffer) - 1,
kernel2418 0:9d5f28595388 592 "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "Content-Length: %d\r\n" "\r\n" "%s",
kernel2418 0:9d5f28595388 593 https_request_method, https_path, AWS_IOT_HTTPS_SERVER_NAME, strlen(https_request_message_body), https_request_message_body);
kernel2418 0:9d5f28595388 594 if (_bpos < 0 || ((size_t) _bpos) > (sizeof (_buffer) - 1)) {
kernel2418 0:9d5f28595388 595 printf("snprintf failed: %d\n", _bpos);
kernel2418 0:9d5f28595388 596 break;
kernel2418 0:9d5f28595388 597 }
kernel2418 0:9d5f28595388 598 _buffer[_bpos] = 0;
kernel2418 0:9d5f28595388 599 /* Print request message */
kernel2418 0:9d5f28595388 600 printf("HTTPS: Request message:\n");
kernel2418 0:9d5f28595388 601 printf("%s\n", _buffer);
kernel2418 0:9d5f28595388 602
kernel2418 0:9d5f28595388 603 int offset = 0;
kernel2418 0:9d5f28595388 604 do {
kernel2418 0:9d5f28595388 605 tls_rc = _tlssocket->send((const unsigned char *) _buffer + offset, _bpos - offset);
kernel2418 0:9d5f28595388 606 if (tls_rc > 0) {
kernel2418 0:9d5f28595388 607 offset += tls_rc;
kernel2418 0:9d5f28595388 608 }
kernel2418 0:9d5f28595388 609 } while (offset < _bpos &&
kernel2418 0:9d5f28595388 610 (tls_rc > 0 || tls_rc == MBEDTLS_ERR_SSL_WANT_READ || tls_rc == MBEDTLS_ERR_SSL_WANT_WRITE));
kernel2418 0:9d5f28595388 611 if (tls_rc < 0) {
kernel2418 0:9d5f28595388 612 print_mbedtls_error("_tlssocket->send", tls_rc);
kernel2418 0:9d5f28595388 613 break;
kernel2418 0:9d5f28595388 614 }
kernel2418 0:9d5f28595388 615
kernel2418 0:9d5f28595388 616 /* Read data out of the socket */
kernel2418 0:9d5f28595388 617 offset = 0;
kernel2418 0:9d5f28595388 618 size_t content_length = 0;
kernel2418 0:9d5f28595388 619 size_t offset_end = 0;
kernel2418 0:9d5f28595388 620 char *line_beg = _buffer;
kernel2418 0:9d5f28595388 621 char *line_end = NULL;
kernel2418 0:9d5f28595388 622 do {
kernel2418 0:9d5f28595388 623 tls_rc = _tlssocket->recv((unsigned char *) _buffer + offset, sizeof(_buffer) - offset - 1);
kernel2418 0:9d5f28595388 624 if (tls_rc > 0) {
kernel2418 0:9d5f28595388 625 offset += tls_rc;
kernel2418 0:9d5f28595388 626 }
kernel2418 0:9d5f28595388 627
kernel2418 0:9d5f28595388 628 /* Make it null-terminated */
kernel2418 0:9d5f28595388 629 _buffer[offset] = 0;
kernel2418 0:9d5f28595388 630
kernel2418 0:9d5f28595388 631 /* Scan response message
kernel2418 0:9d5f28595388 632 *
kernel2418 0:9d5f28595388 633 * 1. A status line which includes the status code and reason message (e.g., HTTP/1.1 200 OK)
kernel2418 0:9d5f28595388 634 * 2. Response header fields (e.g., Content-Type: text/html)
kernel2418 0:9d5f28595388 635 * 3. An empty line (\r\n)
kernel2418 0:9d5f28595388 636 * 4. An optional message body
kernel2418 0:9d5f28595388 637 */
kernel2418 0:9d5f28595388 638 if (! offset_end) {
kernel2418 0:9d5f28595388 639 line_end = strstr(line_beg, "\r\n");
kernel2418 0:9d5f28595388 640 if (line_end) {
kernel2418 0:9d5f28595388 641 /* Scan status line */
kernel2418 0:9d5f28595388 642 if (! _got200) {
kernel2418 0:9d5f28595388 643 _got200 = strstr(line_beg, HTTPS_OK_STR) != NULL;
kernel2418 0:9d5f28595388 644 }
kernel2418 0:9d5f28595388 645
kernel2418 0:9d5f28595388 646 /* Scan response header fields for Content-Length
kernel2418 0:9d5f28595388 647 *
kernel2418 0:9d5f28595388 648 * NOTE: Assume chunked transfer (Transfer-Encoding: chunked) is not used
kernel2418 0:9d5f28595388 649 * NOTE: Assume response field name are in lower case
kernel2418 0:9d5f28595388 650 */
kernel2418 0:9d5f28595388 651 if (content_length == 0) {
kernel2418 0:9d5f28595388 652 sscanf(line_beg, "content-length:%d", &content_length);
kernel2418 0:9d5f28595388 653 }
kernel2418 0:9d5f28595388 654
kernel2418 0:9d5f28595388 655 /* An empty line indicates end of response header fields */
kernel2418 0:9d5f28595388 656 if (line_beg == line_end) {
kernel2418 0:9d5f28595388 657 offset_end = line_end - _buffer + 2 + content_length;
kernel2418 0:9d5f28595388 658 }
kernel2418 0:9d5f28595388 659
kernel2418 0:9d5f28595388 660 /* Go to next line */
kernel2418 0:9d5f28595388 661 line_beg = line_end + 2;
kernel2418 0:9d5f28595388 662 line_end = NULL;
kernel2418 0:9d5f28595388 663 }
kernel2418 0:9d5f28595388 664 }
kernel2418 0:9d5f28595388 665 } while ((offset_end == 0 || offset < offset_end) &&
kernel2418 0:9d5f28595388 666 (tls_rc > 0 || tls_rc == MBEDTLS_ERR_SSL_WANT_READ || tls_rc == MBEDTLS_ERR_SSL_WANT_WRITE));
kernel2418 0:9d5f28595388 667 if (tls_rc < 0 &&
kernel2418 0:9d5f28595388 668 tls_rc != MBEDTLS_ERR_SSL_WANT_READ &&
kernel2418 0:9d5f28595388 669 tls_rc != MBEDTLS_ERR_SSL_WANT_WRITE) {
kernel2418 0:9d5f28595388 670 print_mbedtls_error("_tlssocket->read", tls_rc);
kernel2418 0:9d5f28595388 671 break;
kernel2418 0:9d5f28595388 672 }
kernel2418 0:9d5f28595388 673 _bpos = offset;
kernel2418 0:9d5f28595388 674
kernel2418 0:9d5f28595388 675 _buffer[_bpos] = 0;
kernel2418 0:9d5f28595388 676
kernel2418 0:9d5f28595388 677 /* Print status messages */
kernel2418 0:9d5f28595388 678 printf("HTTPS: Received %d chars from server\n", _bpos);
kernel2418 0:9d5f28595388 679 printf("HTTPS: Received 200 OK status ... %s\n", _got200 ? "[OK]" : "[FAIL]");
kernel2418 0:9d5f28595388 680 printf("HTTPS: Received message:\n");
kernel2418 0:9d5f28595388 681 printf("%s\n", _buffer);
kernel2418 0:9d5f28595388 682
kernel2418 0:9d5f28595388 683 ret = true;
kernel2418 0:9d5f28595388 684
kernel2418 0:9d5f28595388 685 } while (0);
kernel2418 0:9d5f28595388 686
kernel2418 0:9d5f28595388 687 return ret;
kernel2418 0:9d5f28595388 688 }
kernel2418 0:9d5f28595388 689
kernel2418 0:9d5f28595388 690 protected:
kernel2418 0:9d5f28595388 691 TLSSocket * _tlssocket;
kernel2418 0:9d5f28595388 692
kernel2418 0:9d5f28595388 693 const char *_domain; /**< Domain name of the HTTPS server */
kernel2418 0:9d5f28595388 694 const uint16_t _port; /**< Port number of the HTTPS server */
kernel2418 0:9d5f28595388 695 char _buffer[HTTPS_USER_BUFFER_SIZE]; /**< User buffer */
kernel2418 0:9d5f28595388 696 };
kernel2418 0:9d5f28595388 697
kernel2418 0:9d5f28595388 698 #endif // End of AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 699
kernel2418 0:9d5f28595388 700 int main() {
kernel2418 0:9d5f28595388 701
kernel2418 0:9d5f28595388 702 /* The default 9600 bps is too slow to print full TLS debug info and could
kernel2418 0:9d5f28595388 703 * cause the other party to time out. */
kernel2418 0:9d5f28595388 704
kernel2418 0:9d5f28595388 705 printf("\nStarting AWS IoT test\n");
kernel2418 0:9d5f28595388 706
kernel2418 0:9d5f28595388 707 #if defined(MBED_MAJOR_VERSION)
kernel2418 0:9d5f28595388 708 printf("Using Mbed OS %d.%d.%d\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
kernel2418 0:9d5f28595388 709 #else
kernel2418 0:9d5f28595388 710 printf("Using Mbed OS from master.\n");
kernel2418 0:9d5f28595388 711 #endif
kernel2418 0:9d5f28595388 712
kernel2418 0:9d5f28595388 713 /* Use the easy-connect lib to support multiple network bearers. */
kernel2418 0:9d5f28595388 714 /* See https://github.com/ARMmbed/easy-connect README.md for info. */
kernel2418 0:9d5f28595388 715
kernel2418 0:9d5f28595388 716 NetworkInterface* network = easy_connect(false);
kernel2418 0:9d5f28595388 717 if (NULL == network) {
kernel2418 0:9d5f28595388 718 printf("Connecting to the network failed. See serial output.\n");
kernel2418 0:9d5f28595388 719 return 1;
kernel2418 0:9d5f28595388 720 }
kernel2418 0:9d5f28595388 721
kernel2418 0:9d5f28595388 722 #if AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 723 AWS_IoT_MQTT_Test *mqtt_test = new AWS_IoT_MQTT_Test(AWS_IOT_MQTT_SERVER_NAME, AWS_IOT_MQTT_SERVER_PORT, network);
kernel2418 0:9d5f28595388 724 mqtt_test->start_test();
kernel2418 0:9d5f28595388 725 delete mqtt_test;
kernel2418 0:9d5f28595388 726 #endif // End of AWS_IOT_MQTT_TEST
kernel2418 0:9d5f28595388 727
kernel2418 0:9d5f28595388 728 #if AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 729 AWS_IoT_HTTPS_Test *https_test = new AWS_IoT_HTTPS_Test(AWS_IOT_HTTPS_SERVER_NAME, AWS_IOT_HTTPS_SERVER_PORT, network);
kernel2418 0:9d5f28595388 730 https_test->start_test();
kernel2418 0:9d5f28595388 731 delete https_test;
kernel2418 0:9d5f28595388 732 #endif // End of AWS_IOT_HTTPS_TEST
kernel2418 0:9d5f28595388 733
kernel2418 0:9d5f28595388 734 /* Heap usage */
kernel2418 0:9d5f28595388 735 mbed_stats_heap_t heap_stats;
kernel2418 0:9d5f28595388 736 mbed_stats_heap_get(&heap_stats);
kernel2418 0:9d5f28595388 737 printf("\nCurrent heap size: %lu\n", heap_stats.current_size);
kernel2418 0:9d5f28595388 738 printf("Max heap size: %lu\n\n", heap_stats.max_size);
kernel2418 0:9d5f28595388 739 }