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:
Thu Sep 17 00:26:54 2015 -0700
Revision:
7:b2c9d461ef42
Parent:
0:a00ac564e057
Child:
8:a9db8d5c22ee
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 IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, IoTHubTransportHttp_ProvideTransportInterface);
AzureIoTClient 0:a00ac564e057 139
AzureIoTClient 0:a00ac564e057 140 if (iotHubClientHandle == NULL)
AzureIoTClient 0:a00ac564e057 141 {
AzureIoTClient 0:a00ac564e057 142 (void)printf("Failed on IoTHubClient_LL_Create\r\n");
AzureIoTClient 0:a00ac564e057 143 }
AzureIoTClient 0:a00ac564e057 144 else
AzureIoTClient 0:a00ac564e057 145 {
AzureIoTClient 0:a00ac564e057 146 unsigned int minimumPollingTime = 9; /*because it can poll "after 9 seconds" polls will happen effectively at ~10 seconds*/
AzureIoTClient 0:a00ac564e057 147 if (IoTHubClient_LL_SetOption(iotHubClientHandle, "MinimumPollingTime", &minimumPollingTime) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 148 {
AzureIoTClient 0:a00ac564e057 149 printf("failure to set option \"MinimumPollingTime\"\r\n");
AzureIoTClient 0:a00ac564e057 150 }
AzureIoTClient 0:a00ac564e057 151
AzureIoTClient 0:a00ac564e057 152 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 153 // For mbed add the certificate information
AzureIoTClient 0:a00ac564e057 154 if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 155 {
AzureIoTClient 0:a00ac564e057 156 printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 0:a00ac564e057 157 }
AzureIoTClient 0:a00ac564e057 158 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:a00ac564e057 159
AzureIoTClient 0:a00ac564e057 160 ContosoThermostat505* Thermostat = CREATE_MODEL_INSTANCE(MyThermostat, ContosoThermostat505);
AzureIoTClient 0:a00ac564e057 161 if (Thermostat == NULL)
AzureIoTClient 0:a00ac564e057 162 {
AzureIoTClient 0:a00ac564e057 163 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 0:a00ac564e057 164 }
AzureIoTClient 0:a00ac564e057 165 else
AzureIoTClient 0:a00ac564e057 166 {
AzureIoTClient 0:a00ac564e057 167 if (IoTHubClient_LL_SetNotificationCallback(iotHubClientHandle, IoTHubNotification, Thermostat) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 168 {
AzureIoTClient 0:a00ac564e057 169 printf("unable to IoTHubClient_SetNotificationCallback\r\n");
AzureIoTClient 0:a00ac564e057 170 }
AzureIoTClient 0:a00ac564e057 171 else
AzureIoTClient 0:a00ac564e057 172 {
AzureIoTClient 0:a00ac564e057 173 Thermostat->Temperature = 67;
AzureIoTClient 0:a00ac564e057 174 Thermostat->Humidity = 42;
AzureIoTClient 0:a00ac564e057 175 {
AzureIoTClient 0:a00ac564e057 176 unsigned char* destination;
AzureIoTClient 0:a00ac564e057 177 size_t destinationSize;
AzureIoTClient 0:a00ac564e057 178 if (SERIALIZE(&destination, &destinationSize, Thermostat->Temperature, Thermostat->Humidity) != IOT_AGENT_OK)
AzureIoTClient 0:a00ac564e057 179 {
AzureIoTClient 0:a00ac564e057 180 (void)printf("Failed to serialize\r\n");
AzureIoTClient 0:a00ac564e057 181 }
AzureIoTClient 0:a00ac564e057 182 else
AzureIoTClient 0:a00ac564e057 183 {
AzureIoTClient 0:a00ac564e057 184 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(destination, destinationSize);
AzureIoTClient 0:a00ac564e057 185 if (messageHandle == NULL)
AzureIoTClient 0:a00ac564e057 186 {
AzureIoTClient 0:a00ac564e057 187 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 0:a00ac564e057 188 }
AzureIoTClient 0:a00ac564e057 189 else
AzureIoTClient 0:a00ac564e057 190 {
AzureIoTClient 0:a00ac564e057 191 if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)1) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:a00ac564e057 192 {
AzureIoTClient 0:a00ac564e057 193 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 0:a00ac564e057 194 }
AzureIoTClient 0:a00ac564e057 195 else
AzureIoTClient 0:a00ac564e057 196 {
AzureIoTClient 0:a00ac564e057 197 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 0:a00ac564e057 198 }
AzureIoTClient 0:a00ac564e057 199
AzureIoTClient 0:a00ac564e057 200 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 0:a00ac564e057 201 }
AzureIoTClient 0:a00ac564e057 202 free(destination);
AzureIoTClient 0:a00ac564e057 203 }
AzureIoTClient 0:a00ac564e057 204 }
AzureIoTClient 0:a00ac564e057 205
AzureIoTClient 0:a00ac564e057 206 /* wait for commands */
AzureIoTClient 0:a00ac564e057 207 while (1)
AzureIoTClient 0:a00ac564e057 208 {
AzureIoTClient 0:a00ac564e057 209 IoTHubClient_LL_DoWork(iotHubClientHandle);
AzureIoTClient 0:a00ac564e057 210 ThreadAPI_Sleep(1000);
AzureIoTClient 0:a00ac564e057 211 }
AzureIoTClient 0:a00ac564e057 212 }
AzureIoTClient 0:a00ac564e057 213
AzureIoTClient 0:a00ac564e057 214 DESTROY_MODEL_INSTANCE(Thermostat);
AzureIoTClient 0:a00ac564e057 215 }
AzureIoTClient 0:a00ac564e057 216 IoTHubClient_LL_Destroy(iotHubClientHandle);
AzureIoTClient 0:a00ac564e057 217 }
AzureIoTClient 0:a00ac564e057 218 serializer_deinit();
AzureIoTClient 0:a00ac564e057 219 }
AzureIoTClient 0:a00ac564e057 220 }