A simple IoTHub sample using AMQP as transport

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed azure_c_shared_utility serializer wolfSSL azure_uamqp_c

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

Committer:
AzureIoTClient
Date:
Thu Oct 04 09:18:46 2018 -0700
Revision:
91:dd9c294f8e84
Parent:
90:3bd0463ca623
1.2.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 16:b2c6de619743 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 16:b2c6de619743 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 16:b2c6de619743 3
AzureIoTClient 90:3bd0463ca623 4 //
AzureIoTClient 90:3bd0463ca623 5 // IMPORTANT: Please read and understand serializer limitations and alternatives as
AzureIoTClient 90:3bd0463ca623 6 // described ../../readme.md before beginning to use the serializer.
AzureIoTClient 90:3bd0463ca623 7 //
AzureIoTClient 90:3bd0463ca623 8
AzureIoTClient 16:b2c6de619743 9 #include <stdlib.h>
AzureIoTClient 16:b2c6de619743 10
AzureIoTClient 16:b2c6de619743 11 #include <stdio.h>
AzureIoTClient 16:b2c6de619743 12 #include <stdint.h>
AzureIoTClient 16:b2c6de619743 13
AzureIoTClient 16:b2c6de619743 14 #include "serializer.h"
AzureIoTClient 35:862d7bc6755c 15 #include "azure_c_shared_utility/threadapi.h"
AzureIoTClient 35:862d7bc6755c 16 #include "azure_c_shared_utility/sastoken.h"
Azure.IoT Build 42:6bb5884a0648 17 #include "azure_c_shared_utility/platform.h"
AzureIoTClient 16:b2c6de619743 18 #include "iothub_client.h"
AzureIoTClient 16:b2c6de619743 19 #include "iothubtransportamqp.h"
AzureIoTClient 16:b2c6de619743 20 #include "iothub_client_ll.h"
AzureIoTClient 16:b2c6de619743 21
AzureIoTClient 16:b2c6de619743 22 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 74:b684f612f838 23 #define SET_TRUSTED_CERT_IN_SAMPLES
AzureIoTClient 74:b684f612f838 24 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 74:b684f612f838 25
AzureIoTClient 74:b684f612f838 26 #ifdef SET_TRUSTED_CERT_IN_SAMPLES
AzureIoTClient 16:b2c6de619743 27 #include "certs.h"
AzureIoTClient 74:b684f612f838 28 #endif // SET_TRUSTED_CERT_IN_SAMPLES
AzureIoTClient 16:b2c6de619743 29
AzureIoTClient 18:a3ec1aab72dc 30 /*String containing Hostname, Device Id & Device Key in the format: */
AzureIoTClient 18:a3ec1aab72dc 31 /* "HostName=<host_name>;DeviceId=<device_id>;SharedAccessKey=<device_key>" */
AzureIoTClient 16:b2c6de619743 32 static const char* connectionString = "[device connection string]";
AzureIoTClient 16:b2c6de619743 33
AzureIoTClient 16:b2c6de619743 34 // Define the Model
AzureIoTClient 16:b2c6de619743 35 BEGIN_NAMESPACE(WeatherStation);
AzureIoTClient 16:b2c6de619743 36
AzureIoTClient 16:b2c6de619743 37 DECLARE_MODEL(ContosoAnemometer,
AzureIoTClient 16:b2c6de619743 38 WITH_DATA(ascii_char_ptr, DeviceId),
AzureIoTClient 19:eae21b79ceff 39 WITH_DATA(int, WindSpeed),
AzureIoTClient 64:a1b8a60c0a5b 40 WITH_DATA(float, Temperature),
AzureIoTClient 64:a1b8a60c0a5b 41 WITH_DATA(float, Humidity),
AzureIoTClient 16:b2c6de619743 42 WITH_ACTION(TurnFanOn),
AzureIoTClient 16:b2c6de619743 43 WITH_ACTION(TurnFanOff),
AzureIoTClient 16:b2c6de619743 44 WITH_ACTION(SetAirResistance, int, Position)
AzureIoTClient 16:b2c6de619743 45 );
AzureIoTClient 16:b2c6de619743 46
AzureIoTClient 16:b2c6de619743 47 END_NAMESPACE(WeatherStation);
AzureIoTClient 16:b2c6de619743 48
AzureIoTClient 64:a1b8a60c0a5b 49 static char propText[1024];
AzureIoTClient 16:b2c6de619743 50
AzureIoTClient 16:b2c6de619743 51 EXECUTE_COMMAND_RESULT TurnFanOn(ContosoAnemometer* device)
AzureIoTClient 16:b2c6de619743 52 {
AzureIoTClient 16:b2c6de619743 53 (void)device;
AzureIoTClient 16:b2c6de619743 54 (void)printf("Turning fan on.\r\n");
AzureIoTClient 16:b2c6de619743 55 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 16:b2c6de619743 56 }
AzureIoTClient 16:b2c6de619743 57
AzureIoTClient 16:b2c6de619743 58 EXECUTE_COMMAND_RESULT TurnFanOff(ContosoAnemometer* device)
AzureIoTClient 16:b2c6de619743 59 {
AzureIoTClient 16:b2c6de619743 60 (void)device;
AzureIoTClient 16:b2c6de619743 61 (void)printf("Turning fan off.\r\n");
AzureIoTClient 16:b2c6de619743 62 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 16:b2c6de619743 63 }
AzureIoTClient 16:b2c6de619743 64
AzureIoTClient 16:b2c6de619743 65 EXECUTE_COMMAND_RESULT SetAirResistance(ContosoAnemometer* device, int Position)
AzureIoTClient 16:b2c6de619743 66 {
AzureIoTClient 16:b2c6de619743 67 (void)device;
AzureIoTClient 16:b2c6de619743 68 (void)printf("Setting Air Resistance Position to %d.\r\n", Position);
AzureIoTClient 16:b2c6de619743 69 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 16:b2c6de619743 70 }
AzureIoTClient 16:b2c6de619743 71
AzureIoTClient 16:b2c6de619743 72 void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
AzureIoTClient 16:b2c6de619743 73 {
AzureIoTClient 43:f179aa2ce96f 74 unsigned int messageTrackingId = (unsigned int)(uintptr_t)userContextCallback;
AzureIoTClient 16:b2c6de619743 75
AzureIoTClient 43:f179aa2ce96f 76 (void)printf("Message Id: %u Received.\r\n", messageTrackingId);
AzureIoTClient 16:b2c6de619743 77
AzureIoTClient 16:b2c6de619743 78 (void)printf("Result Call Back Called! Result is: %s \r\n", ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
AzureIoTClient 16:b2c6de619743 79 }
AzureIoTClient 16:b2c6de619743 80
AzureIoTClient 16:b2c6de619743 81
AzureIoTClient 64:a1b8a60c0a5b 82 static void sendMessage(IOTHUB_CLIENT_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size, ContosoAnemometer *myWeather)
AzureIoTClient 16:b2c6de619743 83 {
AzureIoTClient 16:b2c6de619743 84 static unsigned int messageTrackingId;
AzureIoTClient 16:b2c6de619743 85 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size);
AzureIoTClient 16:b2c6de619743 86 if (messageHandle == NULL)
AzureIoTClient 16:b2c6de619743 87 {
AzureIoTClient 16:b2c6de619743 88 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 16:b2c6de619743 89 }
AzureIoTClient 16:b2c6de619743 90 else
AzureIoTClient 16:b2c6de619743 91 {
AzureIoTClient 64:a1b8a60c0a5b 92 MAP_HANDLE propMap = IoTHubMessage_Properties(messageHandle);
AzureIoTClient 64:a1b8a60c0a5b 93 (void)sprintf_s(propText, sizeof(propText), myWeather->Temperature > 28 ? "true" : "false");
AzureIoTClient 64:a1b8a60c0a5b 94 if (Map_AddOrUpdate(propMap, "temperatureAlert", propText) != MAP_OK)
AzureIoTClient 64:a1b8a60c0a5b 95 {
AzureIoTClient 64:a1b8a60c0a5b 96 (void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
AzureIoTClient 64:a1b8a60c0a5b 97 }
AzureIoTClient 64:a1b8a60c0a5b 98
AzureIoTClient 16:b2c6de619743 99 if (IoTHubClient_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)(uintptr_t)messageTrackingId) != IOTHUB_CLIENT_OK)
AzureIoTClient 16:b2c6de619743 100 {
AzureIoTClient 16:b2c6de619743 101 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 16:b2c6de619743 102 }
AzureIoTClient 16:b2c6de619743 103 else
AzureIoTClient 16:b2c6de619743 104 {
AzureIoTClient 16:b2c6de619743 105 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 16:b2c6de619743 106 }
AzureIoTClient 16:b2c6de619743 107
AzureIoTClient 16:b2c6de619743 108 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 16:b2c6de619743 109 }
AzureIoTClient 16:b2c6de619743 110 free((void*)buffer);
AzureIoTClient 16:b2c6de619743 111 messageTrackingId++;
AzureIoTClient 16:b2c6de619743 112 }
AzureIoTClient 16:b2c6de619743 113
AzureIoTClient 16:b2c6de619743 114 static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubMessage(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
AzureIoTClient 16:b2c6de619743 115 {
AzureIoTClient 16:b2c6de619743 116 IOTHUBMESSAGE_DISPOSITION_RESULT result;
AzureIoTClient 16:b2c6de619743 117 const unsigned char* buffer;
AzureIoTClient 16:b2c6de619743 118 size_t size;
AzureIoTClient 16:b2c6de619743 119 if (IoTHubMessage_GetByteArray(message, &buffer, &size) != IOTHUB_MESSAGE_OK)
AzureIoTClient 16:b2c6de619743 120 {
AzureIoTClient 16:b2c6de619743 121 printf("unable to IoTHubMessage_GetByteArray\r\n");
AzureIoTClient 56:68f0d4c20dea 122 result = IOTHUBMESSAGE_ABANDONED;
AzureIoTClient 16:b2c6de619743 123 }
AzureIoTClient 16:b2c6de619743 124 else
AzureIoTClient 16:b2c6de619743 125 {
AzureIoTClient 16:b2c6de619743 126 /*buffer is not zero terminated*/
AzureIoTClient 16:b2c6de619743 127 char* temp = malloc(size + 1);
AzureIoTClient 16:b2c6de619743 128 if (temp == NULL)
AzureIoTClient 16:b2c6de619743 129 {
AzureIoTClient 16:b2c6de619743 130 printf("failed to malloc\r\n");
AzureIoTClient 56:68f0d4c20dea 131 result = IOTHUBMESSAGE_ABANDONED;
AzureIoTClient 16:b2c6de619743 132 }
AzureIoTClient 16:b2c6de619743 133 else
AzureIoTClient 16:b2c6de619743 134 {
AzureIoTClient 56:68f0d4c20dea 135 (void)memcpy(temp, buffer, size);
AzureIoTClient 16:b2c6de619743 136 temp[size] = '\0';
AzureIoTClient 16:b2c6de619743 137 EXECUTE_COMMAND_RESULT executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp);
AzureIoTClient 16:b2c6de619743 138 result =
AzureIoTClient 16:b2c6de619743 139 (executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED :
AzureIoTClient 16:b2c6de619743 140 (executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED :
AzureIoTClient 16:b2c6de619743 141 IOTHUBMESSAGE_REJECTED;
AzureIoTClient 16:b2c6de619743 142 free(temp);
AzureIoTClient 16:b2c6de619743 143 }
AzureIoTClient 16:b2c6de619743 144 }
AzureIoTClient 16:b2c6de619743 145 return result;
AzureIoTClient 16:b2c6de619743 146 }
AzureIoTClient 16:b2c6de619743 147
AzureIoTClient 16:b2c6de619743 148 void simplesample_amqp_run(void)
AzureIoTClient 16:b2c6de619743 149 {
Azure.IoT Build 29:12a5fd69f49e 150 if (platform_init() != 0)
AzureIoTClient 16:b2c6de619743 151 {
Azure.IoT Build 29:12a5fd69f49e 152 printf("Failed to initialize the platform.\r\n");
AzureIoTClient 16:b2c6de619743 153 }
AzureIoTClient 16:b2c6de619743 154 else
AzureIoTClient 16:b2c6de619743 155 {
Azure.IoT Build 29:12a5fd69f49e 156 if (serializer_init(NULL) != SERIALIZER_OK)
AzureIoTClient 16:b2c6de619743 157 {
Azure.IoT Build 29:12a5fd69f49e 158 (void)printf("Failed on serializer_init\r\n");
AzureIoTClient 16:b2c6de619743 159 }
AzureIoTClient 16:b2c6de619743 160 else
AzureIoTClient 16:b2c6de619743 161 {
Azure.IoT Build 29:12a5fd69f49e 162 /* Setup IoTHub client configuration */
Azure.IoT Build 29:12a5fd69f49e 163 IOTHUB_CLIENT_HANDLE iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, AMQP_Protocol);
Azure.IoT Build 29:12a5fd69f49e 164 srand((unsigned int)time(NULL));
Azure.IoT Build 29:12a5fd69f49e 165 int avgWindSpeed = 10;
AzureIoTClient 64:a1b8a60c0a5b 166 float minTemperature = 20.0;
AzureIoTClient 64:a1b8a60c0a5b 167 float minHumidity = 60.0;
Azure.IoT Build 29:12a5fd69f49e 168
AzureIoTClient 90:3bd0463ca623 169 // Turn on Log
AzureIoTClient 43:f179aa2ce96f 170 bool trace = true;
AzureIoTClient 43:f179aa2ce96f 171 (void)IoTHubClient_SetOption(iotHubClientHandle, "logtrace", &trace);
AzureIoTClient 43:f179aa2ce96f 172
Azure.IoT Build 29:12a5fd69f49e 173 if (iotHubClientHandle == NULL)
Azure.IoT Build 26:9662f727e974 174 {
Azure.IoT Build 29:12a5fd69f49e 175 (void)printf("Failed on IoTHubClient_Create\r\n");
AzureIoTClient 16:b2c6de619743 176 }
AzureIoTClient 16:b2c6de619743 177 else
AzureIoTClient 16:b2c6de619743 178 {
AzureIoTClient 74:b684f612f838 179 #ifdef SET_TRUSTED_CERT_IN_SAMPLES
Azure.IoT Build 29:12a5fd69f49e 180 // For mbed add the certificate information
Azure.IoT Build 29:12a5fd69f49e 181 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
Azure.IoT Build 29:12a5fd69f49e 182 {
Azure.IoT Build 29:12a5fd69f49e 183 (void)printf("failure to set option \"TrustedCerts\"\r\n");
Azure.IoT Build 29:12a5fd69f49e 184 }
AzureIoTClient 74:b684f612f838 185 #endif // SET_TRUSTED_CERT_IN_SAMPLES
Azure.IoT Build 26:9662f727e974 186
Azure.IoT Build 29:12a5fd69f49e 187 ContosoAnemometer* myWeather = CREATE_MODEL_INSTANCE(WeatherStation, ContosoAnemometer);
Azure.IoT Build 29:12a5fd69f49e 188 if (myWeather == NULL)
Azure.IoT Build 25:9cb9b0c15218 189 {
Azure.IoT Build 29:12a5fd69f49e 190 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 16:b2c6de619743 191 }
AzureIoTClient 16:b2c6de619743 192 else
AzureIoTClient 16:b2c6de619743 193 {
Azure.IoT Build 29:12a5fd69f49e 194 unsigned char* destination;
Azure.IoT Build 29:12a5fd69f49e 195 size_t destinationSize;
AzureIoTClient 16:b2c6de619743 196
Azure.IoT Build 29:12a5fd69f49e 197 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, IoTHubMessage, myWeather) != IOTHUB_CLIENT_OK)
AzureIoTClient 16:b2c6de619743 198 {
Azure.IoT Build 29:12a5fd69f49e 199 printf("unable to IoTHubClient_SetMessageCallback\r\n");
AzureIoTClient 16:b2c6de619743 200 }
AzureIoTClient 16:b2c6de619743 201 else
AzureIoTClient 16:b2c6de619743 202 {
Azure.IoT Build 29:12a5fd69f49e 203 myWeather->DeviceId = "myFirstDevice";
Azure.IoT Build 29:12a5fd69f49e 204 myWeather->WindSpeed = avgWindSpeed + (rand() % 4 + 2);
AzureIoTClient 64:a1b8a60c0a5b 205 myWeather->Temperature = minTemperature + (rand() % 10);
AzureIoTClient 64:a1b8a60c0a5b 206 myWeather->Humidity = minHumidity + (rand() % 20);
AzureIoTClient 16:b2c6de619743 207
AzureIoTClient 64:a1b8a60c0a5b 208 if (SERIALIZE(&destination, &destinationSize, myWeather->DeviceId, myWeather->WindSpeed, myWeather->Temperature, myWeather->Humidity) != CODEFIRST_OK)
Azure.IoT Build 29:12a5fd69f49e 209 {
Azure.IoT Build 29:12a5fd69f49e 210 (void)printf("Failed to serialize\r\n");
Azure.IoT Build 29:12a5fd69f49e 211 }
Azure.IoT Build 29:12a5fd69f49e 212 else
Azure.IoT Build 29:12a5fd69f49e 213 {
AzureIoTClient 64:a1b8a60c0a5b 214 sendMessage(iotHubClientHandle, destination, destinationSize, myWeather);
Azure.IoT Build 29:12a5fd69f49e 215 }
Azure.IoT Build 29:12a5fd69f49e 216
Azure.IoT Build 29:12a5fd69f49e 217 /* wait for commands */
Azure.IoT Build 29:12a5fd69f49e 218 (void)getchar();
Azure.IoT Build 29:12a5fd69f49e 219 }
Azure.IoT Build 29:12a5fd69f49e 220 DESTROY_MODEL_INSTANCE(myWeather);
AzureIoTClient 16:b2c6de619743 221 }
Azure.IoT Build 29:12a5fd69f49e 222 IoTHubClient_Destroy(iotHubClientHandle);
AzureIoTClient 16:b2c6de619743 223 }
Azure.IoT Build 29:12a5fd69f49e 224 serializer_deinit();
AzureIoTClient 16:b2c6de619743 225 }
Azure.IoT Build 29:12a5fd69f49e 226 platform_deinit();
AzureIoTClient 16:b2c6de619743 227 }
AzureIoTClient 16:b2c6de619743 228 }
AzureIoTClient 16:b2c6de619743 229