NuMaker connection with AWS IoT thru MQTT/HTTPS

Dependencies:   MQTT

Committer:
ccli8
Date:
Tue Oct 29 10:59:34 2019 +0800
Revision:
29:e890b0fdce53
Parent:
23:5111e398e651
Child:
35:36578356ed8a
Update to mbed-os 5.14.2 and related modifications

1. Provide custom entropy source on targets without real TRNG
The targets below don't have real TRNG and cannot annouce TRNG support. A custom entropy source with EADC seeded PRNG is given to remedy it:
- NUMAKER_PFM_NUC47
- NUMAKER_PFM_M487
- NUMAKER_IOT_M487
2. Override mbed_main() for:
(1) Simulating provision process
(2) Handling host command via event queue
3. Remove memory statistics printing at end of main(). Printed via host command instead.

Who changed what in which revision?

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