Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 58:f50b97b08851 1 // Copyright (c) Microsoft. All rights reserved.
markrad 58:f50b97b08851 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 58:f50b97b08851 3
markrad 58:f50b97b08851 4 #include <mbed.h>
markrad 58:f50b97b08851 5 #include <stdio.h>
markrad 58:f50b97b08851 6 #include <stdlib.h>
markrad 58:f50b97b08851 7
markrad 58:f50b97b08851 8 #include "azure_c_shared_utility/platform.h"
markrad 58:f50b97b08851 9 #include "azure_c_shared_utility/threadapi.h"
markrad 58:f50b97b08851 10 #include "azure_c_shared_utility/crt_abstractions.h"
markrad 58:f50b97b08851 11 #include "iothub_client.h"
markrad 58:f50b97b08851 12 #include "iothub_message.h"
markrad 58:f50b97b08851 13 #include "iothubtransportamqp.h"
markrad 58:f50b97b08851 14
markrad 58:f50b97b08851 15 #ifdef MBED_BUILD_TIMESTAMP
markrad 58:f50b97b08851 16 #include "certs.h"
markrad 58:f50b97b08851 17 #endif // MBED_BUILD_TIMESTAMP
markrad 58:f50b97b08851 18
markrad 58:f50b97b08851 19 /*String containing Hostname, Device Id & Device Key in the format: */
markrad 58:f50b97b08851 20 /* "HostName=<host_name>;DeviceId=<device_id>;SharedAccessKey=<device_key>" */
markrad 58:f50b97b08851 21 /* "HostName=<host_name>;DeviceId=<device_id>;SharedAccessSignature=<device_sas_token>" */
markrad 58:f50b97b08851 22 static const char* connectionString = "HostName=MarkRadML.azure-devices.net;DeviceId=MBEDTest;SharedAccessKey=rgxlnR0rIBW4vnnnDkrbAv+mSOc/Mt60mg1CEjLx7pY=";
markrad 58:f50b97b08851 23
markrad 58:f50b97b08851 24 static int callbackCounter;
markrad 58:f50b97b08851 25 static bool g_continueRunning;
markrad 58:f50b97b08851 26 static char msgText[1024];
markrad 58:f50b97b08851 27 static char propText[1024];
markrad 58:f50b97b08851 28 #define MESSAGE_COUNT 5
markrad 58:f50b97b08851 29 #define DOWORK_LOOP_NUM 3
markrad 58:f50b97b08851 30
markrad 58:f50b97b08851 31
markrad 58:f50b97b08851 32 typedef struct EVENT_INSTANCE_TAG
markrad 58:f50b97b08851 33 {
markrad 58:f50b97b08851 34 IOTHUB_MESSAGE_HANDLE messageHandle;
markrad 58:f50b97b08851 35 size_t messageTrackingId; // For tracking the messages within the user callback.
markrad 58:f50b97b08851 36 } EVENT_INSTANCE;
markrad 58:f50b97b08851 37
markrad 58:f50b97b08851 38 static IOTHUBMESSAGE_DISPOSITION_RESULT ReceiveMessageCallback(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
markrad 58:f50b97b08851 39 {
markrad 58:f50b97b08851 40 int* counter = (int*)userContextCallback;
markrad 58:f50b97b08851 41 const unsigned char* buffer = NULL;
markrad 58:f50b97b08851 42 size_t size = 0;
markrad 58:f50b97b08851 43 const char* messageId;
markrad 58:f50b97b08851 44 const char* correlationId;
markrad 58:f50b97b08851 45
markrad 58:f50b97b08851 46 // AMQP message properties
markrad 58:f50b97b08851 47 if ((messageId = IoTHubMessage_GetMessageId(message)) == NULL)
markrad 58:f50b97b08851 48 {
markrad 58:f50b97b08851 49 messageId = "<null>";
markrad 58:f50b97b08851 50 }
markrad 58:f50b97b08851 51
markrad 58:f50b97b08851 52 if ((correlationId = IoTHubMessage_GetCorrelationId(message)) == NULL)
markrad 58:f50b97b08851 53 {
markrad 58:f50b97b08851 54 correlationId = "<null>";
markrad 58:f50b97b08851 55 }
markrad 58:f50b97b08851 56
markrad 58:f50b97b08851 57 // AMQP message content.
markrad 58:f50b97b08851 58 IOTHUBMESSAGE_CONTENT_TYPE contentType = IoTHubMessage_GetContentType(message);
markrad 58:f50b97b08851 59
markrad 58:f50b97b08851 60 if (contentType == IOTHUBMESSAGE_BYTEARRAY)
markrad 58:f50b97b08851 61 {
markrad 58:f50b97b08851 62 if (IoTHubMessage_GetByteArray(message, &buffer, &size) == IOTHUB_MESSAGE_OK)
markrad 58:f50b97b08851 63 {
markrad 58:f50b97b08851 64 (void)printf("Received Message [%d] (message-id: %s, correlation-id: %s) with BINARY Data: <<<%.*s>>> & Size=%d\r\n", *counter, messageId, correlationId,(int)size, buffer, (int)size);
markrad 58:f50b97b08851 65 }
markrad 58:f50b97b08851 66 else
markrad 58:f50b97b08851 67 {
markrad 58:f50b97b08851 68 (void)printf("Failed getting the BINARY body of the message received.\r\n");
markrad 58:f50b97b08851 69 }
markrad 58:f50b97b08851 70 }
markrad 58:f50b97b08851 71 else if (contentType == IOTHUBMESSAGE_STRING)
markrad 58:f50b97b08851 72 {
markrad 58:f50b97b08851 73 if ((buffer = (const unsigned char*)IoTHubMessage_GetString(message)) != NULL && (size = strlen((const char*)buffer)) > 0)
markrad 58:f50b97b08851 74 {
markrad 58:f50b97b08851 75 (void)printf("Received Message [%d] (message-id: %s, correlation-id: %s) with STRING Data: <<<%.*s>>> & Size=%d\r\n", *counter, messageId, correlationId, (int)size, buffer, (int)size);
markrad 58:f50b97b08851 76
markrad 58:f50b97b08851 77 // If we receive the work 'quit' then we stop running
markrad 58:f50b97b08851 78 }
markrad 58:f50b97b08851 79 else
markrad 58:f50b97b08851 80 {
markrad 58:f50b97b08851 81 (void)printf("Failed getting the STRING body of the message received.\r\n");
markrad 58:f50b97b08851 82 }
markrad 58:f50b97b08851 83 }
markrad 58:f50b97b08851 84 else
markrad 58:f50b97b08851 85 {
markrad 58:f50b97b08851 86 (void)printf("Failed getting the body of the message received (type %i).\r\n", contentType);
markrad 58:f50b97b08851 87 }
markrad 58:f50b97b08851 88
markrad 58:f50b97b08851 89 // Retrieve properties from the message
markrad 58:f50b97b08851 90 MAP_HANDLE mapProperties = IoTHubMessage_Properties(message);
markrad 58:f50b97b08851 91 if (mapProperties != NULL)
markrad 58:f50b97b08851 92 {
markrad 58:f50b97b08851 93 const char*const* keys;
markrad 58:f50b97b08851 94 const char*const* values;
markrad 58:f50b97b08851 95 size_t propertyCount = 0;
markrad 58:f50b97b08851 96 if (Map_GetInternals(mapProperties, &keys, &values, &propertyCount) == MAP_OK)
markrad 58:f50b97b08851 97 {
markrad 58:f50b97b08851 98 if (propertyCount > 0)
markrad 58:f50b97b08851 99 {
markrad 58:f50b97b08851 100 size_t index;
markrad 58:f50b97b08851 101
markrad 58:f50b97b08851 102 printf("Message Properties:\r\n");
markrad 58:f50b97b08851 103 for (index = 0; index < propertyCount; index++)
markrad 58:f50b97b08851 104 {
markrad 58:f50b97b08851 105 printf("\tKey: %s Value: %s\r\n", keys[index], values[index]);
markrad 58:f50b97b08851 106 }
markrad 58:f50b97b08851 107 printf("\r\n");
markrad 58:f50b97b08851 108 }
markrad 58:f50b97b08851 109 }
markrad 58:f50b97b08851 110 }
markrad 58:f50b97b08851 111
markrad 58:f50b97b08851 112 if (size == (strlen("quit") * sizeof(char)) && memcmp(buffer, "quit", size) == 0)
markrad 58:f50b97b08851 113 {
markrad 58:f50b97b08851 114 g_continueRunning = false;
markrad 58:f50b97b08851 115 }
markrad 58:f50b97b08851 116
markrad 58:f50b97b08851 117 /* Some device specific action code goes here... */
markrad 58:f50b97b08851 118 (*counter)++;
markrad 58:f50b97b08851 119 return IOTHUBMESSAGE_ACCEPTED;
markrad 58:f50b97b08851 120 }
markrad 58:f50b97b08851 121
markrad 58:f50b97b08851 122 static void SendConfirmationCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
markrad 58:f50b97b08851 123 {
markrad 58:f50b97b08851 124 EVENT_INSTANCE* eventInstance = (EVENT_INSTANCE*)userContextCallback;
markrad 58:f50b97b08851 125 (void)printf("Confirmation[%d] received for message tracking id = %zu with result = %s\r\n", callbackCounter, eventInstance->messageTrackingId, ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
markrad 58:f50b97b08851 126 /* Some device specific action code goes here... */
markrad 58:f50b97b08851 127 callbackCounter++;
markrad 58:f50b97b08851 128 IoTHubMessage_Destroy(eventInstance->messageHandle);
markrad 58:f50b97b08851 129 }
markrad 58:f50b97b08851 130
markrad 58:f50b97b08851 131 void iothub_client_sample_amqp_run(void)
markrad 58:f50b97b08851 132 {
markrad 58:f50b97b08851 133 IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle;
markrad 58:f50b97b08851 134
markrad 58:f50b97b08851 135 EVENT_INSTANCE messages[MESSAGE_COUNT];
markrad 58:f50b97b08851 136
markrad 58:f50b97b08851 137 g_continueRunning = true;
markrad 58:f50b97b08851 138 srand((unsigned int)time(NULL));
markrad 58:f50b97b08851 139 double avgWindSpeed = 10.0;
markrad 58:f50b97b08851 140
markrad 58:f50b97b08851 141 callbackCounter = 0;
markrad 58:f50b97b08851 142 int receiveContext = 0;
markrad 58:f50b97b08851 143
markrad 58:f50b97b08851 144 (void)printf("Starting the IoTHub client sample AMQP...\r\n");
markrad 58:f50b97b08851 145
markrad 58:f50b97b08851 146 if (platform_init() != 0)
markrad 58:f50b97b08851 147 {
markrad 58:f50b97b08851 148 printf("Failed to initialize the platform.\r\n");
markrad 58:f50b97b08851 149 }
markrad 58:f50b97b08851 150 else
markrad 58:f50b97b08851 151 {
markrad 58:f50b97b08851 152 printf("Platform initialized\r\n");
markrad 58:f50b97b08851 153 if ((iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, AMQP_Protocol)) == NULL)
markrad 58:f50b97b08851 154 {
markrad 58:f50b97b08851 155 (void)printf("ERROR: iotHubClientHandle is NULL!\r\n");
markrad 58:f50b97b08851 156 }
markrad 58:f50b97b08851 157 else
markrad 58:f50b97b08851 158 {
markrad 58:f50b97b08851 159 printf("Client handle created\r\n");
markrad 58:f50b97b08851 160 bool traceOn = true;
markrad 58:f50b97b08851 161 IoTHubClient_LL_SetOption(iotHubClientHandle, "logtrace", &traceOn);
markrad 58:f50b97b08851 162
markrad 58:f50b97b08851 163 #ifdef MBED_BUILD_TIMESTAMP
markrad 58:f50b97b08851 164 // For mbed add the certificate information
markrad 58:f50b97b08851 165 if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
markrad 58:f50b97b08851 166 {
markrad 58:f50b97b08851 167 printf("failure to set option \"TrustedCerts\"\r\n");
markrad 58:f50b97b08851 168 }
markrad 58:f50b97b08851 169 #endif // MBED_BUILD_TIMESTAMP
markrad 58:f50b97b08851 170
markrad 58:f50b97b08851 171 /* Setting Message call back, so we can receive Commands. */
markrad 58:f50b97b08851 172 if (IoTHubClient_LL_SetMessageCallback(iotHubClientHandle, ReceiveMessageCallback, &receiveContext) != IOTHUB_CLIENT_OK)
markrad 58:f50b97b08851 173 {
markrad 58:f50b97b08851 174 (void)printf("ERROR: IoTHubClient_SetMessageCallback..........FAILED!\r\n");
markrad 58:f50b97b08851 175 }
markrad 58:f50b97b08851 176 else
markrad 58:f50b97b08851 177 {
markrad 58:f50b97b08851 178 (void)printf("IoTHubClient_SetMessageCallback...successful.\r\n");
markrad 58:f50b97b08851 179
markrad 58:f50b97b08851 180 /* Now that we are ready to receive commands, let's send some messages */
markrad 58:f50b97b08851 181 size_t iterator = 0;
markrad 58:f50b97b08851 182 do
markrad 58:f50b97b08851 183 {
markrad 58:f50b97b08851 184 if (iterator < MESSAGE_COUNT)
markrad 58:f50b97b08851 185 {
markrad 58:f50b97b08851 186 sprintf_s(msgText, sizeof(msgText), "{\"deviceId\":\"myFirstDevice\",\"windSpeed\":%.2f}", avgWindSpeed + (rand() % 4 + 2));
markrad 58:f50b97b08851 187 if ((messages[iterator].messageHandle = IoTHubMessage_CreateFromByteArray((const unsigned char*)msgText, strlen(msgText))) == NULL)
markrad 58:f50b97b08851 188 {
markrad 58:f50b97b08851 189 (void)printf("ERROR: iotHubMessageHandle is NULL!\r\n");
markrad 58:f50b97b08851 190 }
markrad 58:f50b97b08851 191 else
markrad 58:f50b97b08851 192 {
markrad 58:f50b97b08851 193 messages[iterator].messageTrackingId = iterator;
markrad 58:f50b97b08851 194
markrad 58:f50b97b08851 195 MAP_HANDLE propMap = IoTHubMessage_Properties(messages[iterator].messageHandle);
markrad 58:f50b97b08851 196 (void)sprintf_s(propText, sizeof(propText), "PropMsg_%zu", iterator);
markrad 58:f50b97b08851 197 if (Map_AddOrUpdate(propMap, "PropName", propText) != MAP_OK)
markrad 58:f50b97b08851 198 {
markrad 58:f50b97b08851 199 (void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
markrad 58:f50b97b08851 200 }
markrad 58:f50b97b08851 201
markrad 58:f50b97b08851 202 if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messages[iterator].messageHandle, SendConfirmationCallback, &messages[iterator]) != IOTHUB_CLIENT_OK)
markrad 58:f50b97b08851 203 {
markrad 58:f50b97b08851 204 (void)printf("ERROR: IoTHubClient_SendEventAsync..........FAILED!\r\n");
markrad 58:f50b97b08851 205 }
markrad 58:f50b97b08851 206 else
markrad 58:f50b97b08851 207 {
markrad 58:f50b97b08851 208 (void)printf("IoTHubClient_SendEventAsync accepted data for transmission to IoT Hub.\r\n");
markrad 58:f50b97b08851 209 }
markrad 58:f50b97b08851 210 }
markrad 58:f50b97b08851 211 }
markrad 58:f50b97b08851 212 IoTHubClient_LL_DoWork(iotHubClientHandle);
markrad 58:f50b97b08851 213 ThreadAPI_Sleep(1);
markrad 58:f50b97b08851 214
markrad 58:f50b97b08851 215 iterator++;
markrad 58:f50b97b08851 216 } while (g_continueRunning);
markrad 58:f50b97b08851 217
markrad 58:f50b97b08851 218 (void)printf("iothub_client_sample_mqtt has gotten quit message, call DoWork %d more time to complete final sending...\r\n", DOWORK_LOOP_NUM);
markrad 58:f50b97b08851 219 for (size_t index = 0; index < DOWORK_LOOP_NUM; index++)
markrad 58:f50b97b08851 220 {
markrad 58:f50b97b08851 221 IoTHubClient_LL_DoWork(iotHubClientHandle);
markrad 58:f50b97b08851 222 ThreadAPI_Sleep(1);
markrad 58:f50b97b08851 223 }
markrad 58:f50b97b08851 224 }
markrad 58:f50b97b08851 225 IoTHubClient_LL_Destroy(iotHubClientHandle);
markrad 58:f50b97b08851 226 }
markrad 58:f50b97b08851 227 platform_deinit();
markrad 58:f50b97b08851 228 }
markrad 58:f50b97b08851 229 }
markrad 58:f50b97b08851 230
markrad 58:f50b97b08851 231 int main(void)
markrad 58:f50b97b08851 232 {
markrad 58:f50b97b08851 233 Serial pc(USBTX, USBRX); // Primary output to demonstrate library
markrad 58:f50b97b08851 234
markrad 58:f50b97b08851 235 pc.baud(115200); // Print quickly! 200Hz x line of output data!
markrad 58:f50b97b08851 236
markrad 58:f50b97b08851 237 printf("Start...\r\n");
markrad 58:f50b97b08851 238 iothub_client_sample_amqp_run();
markrad 58:f50b97b08851 239 return 0;
markrad 58:f50b97b08851 240 }