yh Tang
/
NuMaker-mbed-AWS-IoT-example
NuMaker connection with AWS IoT thru MQTT/HTTPS
main.cpp@29:e890b0fdce53, 2019-10-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |