A simple IoTHub sample using HTTP as transport

Dependencies:   EthernetInterface NTPClient iothub_client iothub_http_transport mbed-rtos mbed wolfSSL serializer azure_c_shared_utility

This sample showcases the usage of Azure IoT client libraries with the HTTP transport for sending/receiving raw messages from an IoT Hub.

Committer:
AzureIoTClient
Date:
Tue Sep 15 22:47:14 2015 -0700
Revision:
0:a00ac564e057
Child:
7:b2c9d461ef42
New release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 0:a00ac564e057 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 0:a00ac564e057 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 0:a00ac564e057 3
AzureIoTClient 0:a00ac564e057 4 #include <stdlib.h>
AzureIoTClient 0:a00ac564e057 5
AzureIoTClient 0:a00ac564e057 6 #include <stdio.h>
AzureIoTClient 0:a00ac564e057 7 #include <stdint.h>
AzureIoTClient 0:a00ac564e057 8
AzureIoTClient 0:a00ac564e057 9 /* This sample uses the _LL APIs of iothub_client for example purposes.
AzureIoTClient 0:a00ac564e057 10 That does not mean that HTTP only works with the _LL APIs.
AzureIoTClient 0:a00ac564e057 11 Simply changing the using the convenience layer (functions not having _LL)
AzureIoTClient 0:a00ac564e057 12 and removing calls to _DoWork will yield the same results. */
AzureIoTClient 0:a00ac564e057 13
AzureIoTClient 0:a00ac564e057 14 #include "serializer.h"
AzureIoTClient 0:a00ac564e057 15 #include "iothub_client_ll.h"
AzureIoTClient 0:a00ac564e057 16 #include "iothubtransporthttp.h"
AzureIoTClient 0:a00ac564e057 17 #include "threadapi.h"
AzureIoTClient 0:a00ac564e057 18
AzureIoTClient 0:a00ac564e057 19 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 20 #include "certs.h"
AzureIoTClient 0:a00ac564e057 21 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 22
AzureIoTClient 0:a00ac564e057 23 static const char* connectionString = "[device connection string]";
AzureIoTClient 0:a00ac564e057 24
AzureIoTClient 0:a00ac564e057 25 // Define the Model
AzureIoTClient 0:a00ac564e057 26 BEGIN_NAMESPACE(MyThermostat);
AzureIoTClient 0:a00ac564e057 27
AzureIoTClient 0:a00ac564e057 28 DECLARE_MODEL(ContosoThermostat505,
AzureIoTClient 0:a00ac564e057 29 WITH_DATA(int, Temperature),
AzureIoTClient 0:a00ac564e057 30 WITH_DATA(int, Humidity),
AzureIoTClient 0:a00ac564e057 31 WITH_DATA(bool, LowTemperatureAlarm),
AzureIoTClient 0:a00ac564e057 32 WITH_ACTION(TurnFanOn),
AzureIoTClient 0:a00ac564e057 33 WITH_ACTION(TurnFanOff),
AzureIoTClient 0:a00ac564e057 34 WITH_ACTION(SetTemperature, int, DesiredTemperature)
AzureIoTClient 0:a00ac564e057 35 );
AzureIoTClient 0:a00ac564e057 36
AzureIoTClient 0:a00ac564e057 37 END_NAMESPACE(MyThermostat);
AzureIoTClient 0:a00ac564e057 38
AzureIoTClient 0:a00ac564e057 39 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_CONFIRMATION_RESULT, IOTHUB_CLIENT_CONFIRMATION_RESULT_VALUES)
AzureIoTClient 0:a00ac564e057 40
AzureIoTClient 0:a00ac564e057 41 EXECUTE_COMMAND_RESULT TurnFanOn(ContosoThermostat505* device)
AzureIoTClient 0:a00ac564e057 42 {
AzureIoTClient 0:a00ac564e057 43 (void)device;
AzureIoTClient 0:a00ac564e057 44 (void)printf("Turning fan on.\r\n");
AzureIoTClient 0:a00ac564e057 45 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:a00ac564e057 46 }
AzureIoTClient 0:a00ac564e057 47
AzureIoTClient 0:a00ac564e057 48 EXECUTE_COMMAND_RESULT TurnFanOff(ContosoThermostat505* device)
AzureIoTClient 0:a00ac564e057 49 {
AzureIoTClient 0:a00ac564e057 50 (void)device;
AzureIoTClient 0:a00ac564e057 51 (void)printf("Turning fan off.\r\n");
AzureIoTClient 0:a00ac564e057 52 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:a00ac564e057 53 }
AzureIoTClient 0:a00ac564e057 54
AzureIoTClient 0:a00ac564e057 55 EXECUTE_COMMAND_RESULT SetTemperature(ContosoThermostat505* device, int DesiredTemperature)
AzureIoTClient 0:a00ac564e057 56 {
AzureIoTClient 0:a00ac564e057 57 (void)device;
AzureIoTClient 0:a00ac564e057 58 (void)printf("Setting home temperature to %d degrees.\r\n", DesiredTemperature);
AzureIoTClient 0:a00ac564e057 59 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:a00ac564e057 60 }
AzureIoTClient 0:a00ac564e057 61
AzureIoTClient 0:a00ac564e057 62 void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
AzureIoTClient 0:a00ac564e057 63 {
AzureIoTClient 0:a00ac564e057 64 int messageTrackingId = (intptr_t)userContextCallback;
AzureIoTClient 0:a00ac564e057 65
AzureIoTClient 0:a00ac564e057 66 (void)printf("Message Id: %d Received.\r\n", messageTrackingId);
AzureIoTClient 0:a00ac564e057 67
AzureIoTClient 0:a00ac564e057 68 (void)printf("Result Call Back Called! Result is: %s \r\n", ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
AzureIoTClient 0:a00ac564e057 69 }
AzureIoTClient 0:a00ac564e057 70
AzureIoTClient 0:a00ac564e057 71 static void sendMessage(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size)
AzureIoTClient 0:a00ac564e057 72 {
AzureIoTClient 0:a00ac564e057 73 static unsigned int messageTrackingId;
AzureIoTClient 0:a00ac564e057 74 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size);
AzureIoTClient 0:a00ac564e057 75 if (messageHandle == NULL)
AzureIoTClient 0:a00ac564e057 76 {
AzureIoTClient 0:a00ac564e057 77 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 0:a00ac564e057 78 }
AzureIoTClient 0:a00ac564e057 79 else
AzureIoTClient 0:a00ac564e057 80 {
AzureIoTClient 0:a00ac564e057 81 if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)(uintptr_t)messageTrackingId) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 82 {
AzureIoTClient 0:a00ac564e057 83 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 0:a00ac564e057 84 }
AzureIoTClient 0:a00ac564e057 85 else
AzureIoTClient 0:a00ac564e057 86 {
AzureIoTClient 0:a00ac564e057 87 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 0:a00ac564e057 88 }
AzureIoTClient 0:a00ac564e057 89 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 0:a00ac564e057 90 }
AzureIoTClient 0:a00ac564e057 91 free((void*)buffer);
AzureIoTClient 0:a00ac564e057 92 messageTrackingId++;
AzureIoTClient 0:a00ac564e057 93 }
AzureIoTClient 0:a00ac564e057 94
AzureIoTClient 0:a00ac564e057 95 /*this functiuon "links" IoTHub to the serialization library*/
AzureIoTClient 0:a00ac564e057 96 static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubNotification(IOTHUB_MESSAGE_HANDLE notificationMessage, void* userContextCallback)
AzureIoTClient 0:a00ac564e057 97 {
AzureIoTClient 0:a00ac564e057 98 IOTHUBMESSAGE_DISPOSITION_RESULT result;
AzureIoTClient 0:a00ac564e057 99 const unsigned char* buffer;
AzureIoTClient 0:a00ac564e057 100 size_t size;
AzureIoTClient 0:a00ac564e057 101 if (IoTHubMessage_GetByteArray(notificationMessage, &buffer, &size) != IOTHUB_MESSAGE_OK)
AzureIoTClient 0:a00ac564e057 102 {
AzureIoTClient 0:a00ac564e057 103 printf("unable to IoTHubMessage_GetByteArray\r\n");
AzureIoTClient 0:a00ac564e057 104 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:a00ac564e057 105 }
AzureIoTClient 0:a00ac564e057 106 else
AzureIoTClient 0:a00ac564e057 107 {
AzureIoTClient 0:a00ac564e057 108 /*buffer is not zero terminated*/
AzureIoTClient 0:a00ac564e057 109 char* temp = malloc(size + 1);
AzureIoTClient 0:a00ac564e057 110 if (temp == NULL)
AzureIoTClient 0:a00ac564e057 111 {
AzureIoTClient 0:a00ac564e057 112 printf("failed to malloc\r\n");
AzureIoTClient 0:a00ac564e057 113 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:a00ac564e057 114 }
AzureIoTClient 0:a00ac564e057 115 else
AzureIoTClient 0:a00ac564e057 116 {
AzureIoTClient 0:a00ac564e057 117 memcpy(temp, buffer, size);
AzureIoTClient 0:a00ac564e057 118 temp[size] = '\0';
AzureIoTClient 0:a00ac564e057 119 EXECUTE_COMMAND_RESULT executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp);
AzureIoTClient 0:a00ac564e057 120 result =
AzureIoTClient 0:a00ac564e057 121 (executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED :
AzureIoTClient 0:a00ac564e057 122 (executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED :
AzureIoTClient 0:a00ac564e057 123 IOTHUBMESSAGE_REJECTED;
AzureIoTClient 0:a00ac564e057 124 free(temp);
AzureIoTClient 0:a00ac564e057 125 }
AzureIoTClient 0:a00ac564e057 126 }
AzureIoTClient 0:a00ac564e057 127 return result;
AzureIoTClient 0:a00ac564e057 128 }
AzureIoTClient 0:a00ac564e057 129
AzureIoTClient 0:a00ac564e057 130 void simplesample_http_run(void)
AzureIoTClient 0:a00ac564e057 131 {
AzureIoTClient 0:a00ac564e057 132 if (serializer_init(NULL) != SERIALIZER_OK)
AzureIoTClient 0:a00ac564e057 133 {
AzureIoTClient 0:a00ac564e057 134 (void)printf("Failed on serializer_init\r\n");
AzureIoTClient 0:a00ac564e057 135 }
AzureIoTClient 0:a00ac564e057 136 else
AzureIoTClient 0:a00ac564e057 137 {
AzureIoTClient 0:a00ac564e057 138
AzureIoTClient 0:a00ac564e057 139 /* Setup IoTHub client configuration */
AzureIoTClient 0:a00ac564e057 140
AzureIoTClient 0:a00ac564e057 141 IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, IoTHubTransportHttp_ProvideTransportInterface);
AzureIoTClient 0:a00ac564e057 142
AzureIoTClient 0:a00ac564e057 143 if (iotHubClientHandle == NULL)
AzureIoTClient 0:a00ac564e057 144 {
AzureIoTClient 0:a00ac564e057 145 (void)printf("Failed on IoTHubClient_LL_Create\r\n");
AzureIoTClient 0:a00ac564e057 146 }
AzureIoTClient 0:a00ac564e057 147 else
AzureIoTClient 0:a00ac564e057 148 {
AzureIoTClient 0:a00ac564e057 149 unsigned int minimumPollingTime = 9; /*because it can poll "after 9 seconds" polls will happen effectively at ~10 seconds*/
AzureIoTClient 0:a00ac564e057 150 if (IoTHubClient_LL_SetOption(iotHubClientHandle, "MinimumPollingTime", &minimumPollingTime) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 151 {
AzureIoTClient 0:a00ac564e057 152 printf("failure to set option \"MinimumPollingTime\"\r\n");
AzureIoTClient 0:a00ac564e057 153 }
AzureIoTClient 0:a00ac564e057 154
AzureIoTClient 0:a00ac564e057 155 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 156 // For mbed add the certificate information
AzureIoTClient 0:a00ac564e057 157 if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 158 {
AzureIoTClient 0:a00ac564e057 159 printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 0:a00ac564e057 160 }
AzureIoTClient 0:a00ac564e057 161 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 162
AzureIoTClient 0:a00ac564e057 163 ContosoThermostat505* Thermostat = CREATE_MODEL_INSTANCE(MyThermostat, ContosoThermostat505);
AzureIoTClient 0:a00ac564e057 164 if (Thermostat == NULL)
AzureIoTClient 0:a00ac564e057 165 {
AzureIoTClient 0:a00ac564e057 166 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 0:a00ac564e057 167 }
AzureIoTClient 0:a00ac564e057 168 else
AzureIoTClient 0:a00ac564e057 169 {
AzureIoTClient 0:a00ac564e057 170 if (IoTHubClient_LL_SetNotificationCallback(iotHubClientHandle, IoTHubNotification, Thermostat) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 171 {
AzureIoTClient 0:a00ac564e057 172 printf("unable to IoTHubClient_SetNotificationCallback\r\n");
AzureIoTClient 0:a00ac564e057 173 }
AzureIoTClient 0:a00ac564e057 174 else
AzureIoTClient 0:a00ac564e057 175 {
AzureIoTClient 0:a00ac564e057 176 Thermostat->Temperature = 67;
AzureIoTClient 0:a00ac564e057 177 Thermostat->Humidity = 42;
AzureIoTClient 0:a00ac564e057 178 {
AzureIoTClient 0:a00ac564e057 179 unsigned char* destination;
AzureIoTClient 0:a00ac564e057 180 size_t destinationSize;
AzureIoTClient 0:a00ac564e057 181 if (SERIALIZE(&destination, &destinationSize, Thermostat->Temperature, Thermostat->Humidity) != IOT_AGENT_OK)
AzureIoTClient 0:a00ac564e057 182 {
AzureIoTClient 0:a00ac564e057 183 (void)printf("Failed to serialize\r\n");
AzureIoTClient 0:a00ac564e057 184 }
AzureIoTClient 0:a00ac564e057 185 else
AzureIoTClient 0:a00ac564e057 186 {
AzureIoTClient 0:a00ac564e057 187 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(destination, destinationSize);
AzureIoTClient 0:a00ac564e057 188 if (messageHandle == NULL)
AzureIoTClient 0:a00ac564e057 189 {
AzureIoTClient 0:a00ac564e057 190 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 0:a00ac564e057 191 }
AzureIoTClient 0:a00ac564e057 192 else
AzureIoTClient 0:a00ac564e057 193 {
AzureIoTClient 0:a00ac564e057 194 if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)1) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 195 {
AzureIoTClient 0:a00ac564e057 196 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 0:a00ac564e057 197 }
AzureIoTClient 0:a00ac564e057 198 else
AzureIoTClient 0:a00ac564e057 199 {
AzureIoTClient 0:a00ac564e057 200 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 0:a00ac564e057 201 }
AzureIoTClient 0:a00ac564e057 202
AzureIoTClient 0:a00ac564e057 203 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 0:a00ac564e057 204 }
AzureIoTClient 0:a00ac564e057 205 free(destination);
AzureIoTClient 0:a00ac564e057 206 }
AzureIoTClient 0:a00ac564e057 207 }
AzureIoTClient 0:a00ac564e057 208
AzureIoTClient 0:a00ac564e057 209 /* wait for commands */
AzureIoTClient 0:a00ac564e057 210 while (1)
AzureIoTClient 0:a00ac564e057 211 {
AzureIoTClient 0:a00ac564e057 212 IoTHubClient_LL_DoWork(iotHubClientHandle);
AzureIoTClient 0:a00ac564e057 213 ThreadAPI_Sleep(1000);
AzureIoTClient 0:a00ac564e057 214 }
AzureIoTClient 0:a00ac564e057 215 }
AzureIoTClient 0:a00ac564e057 216
AzureIoTClient 0:a00ac564e057 217 DESTROY_MODEL_INSTANCE(Thermostat);
AzureIoTClient 0:a00ac564e057 218 }
AzureIoTClient 0:a00ac564e057 219 IoTHubClient_LL_Destroy(iotHubClientHandle);
AzureIoTClient 0:a00ac564e057 220 }
AzureIoTClient 0:a00ac564e057 221 serializer_deinit();
AzureIoTClient 0:a00ac564e057 222 }
AzureIoTClient 0:a00ac564e057 223 }