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:
Fri Jan 15 15:50:06 2016 -0800
Revision:
20:188fd25e65fc
Parent:
19:253a0a1ea1c5
Child:
28:44b1d44d0d3b
v1.0.0-preview.4

Who changed what in which revision?

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