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:
Tue Sep 22 20:39:57 2015 -0700
Revision:
7:678d6405a200
Parent:
4:02142ed0a6af
New release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 0:caa8884fe136 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 0:caa8884fe136 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 0:caa8884fe136 3
AzureIoTClient 7:678d6405a200 4 #include <stdlib.h>
AzureIoTClient 7:678d6405a200 5
AzureIoTClient 0:caa8884fe136 6 #include <stdio.h>
AzureIoTClient 0:caa8884fe136 7 #include <stdint.h>
AzureIoTClient 0:caa8884fe136 8
AzureIoTClient 0:caa8884fe136 9 #include "serializer.h"
AzureIoTClient 0:caa8884fe136 10 #include "threadapi.h"
AzureIoTClient 0:caa8884fe136 11 #include "sastoken.h"
AzureIoTClient 0:caa8884fe136 12 #include "iothub_client.h"
AzureIoTClient 0:caa8884fe136 13 #include "iothubtransportamqp.h"
AzureIoTClient 0:caa8884fe136 14 #include "iothub_client_ll.h"
AzureIoTClient 0:caa8884fe136 15
AzureIoTClient 0:caa8884fe136 16 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 17 #include "certs.h"
AzureIoTClient 0:caa8884fe136 18 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 19
AzureIoTClient 4:02142ed0a6af 20 static const char* connectionString = "[device connection string]";
AzureIoTClient 0:caa8884fe136 21
AzureIoTClient 0:caa8884fe136 22 // Define the Model
AzureIoTClient 7:678d6405a200 23 BEGIN_NAMESPACE(WeatherStation);
AzureIoTClient 0:caa8884fe136 24
AzureIoTClient 7:678d6405a200 25 DECLARE_MODEL(ContosoAnemometer,
AzureIoTClient 7:678d6405a200 26 WITH_DATA(ascii_char_ptr, DeviceId),
AzureIoTClient 7:678d6405a200 27 WITH_DATA(double, WindSpeed),
AzureIoTClient 0:caa8884fe136 28 WITH_ACTION(TurnFanOn),
AzureIoTClient 0:caa8884fe136 29 WITH_ACTION(TurnFanOff),
AzureIoTClient 7:678d6405a200 30 WITH_ACTION(SetAirResistance, int, Position)
AzureIoTClient 0:caa8884fe136 31 );
AzureIoTClient 0:caa8884fe136 32
AzureIoTClient 7:678d6405a200 33 END_NAMESPACE(WeatherStation);
AzureIoTClient 0:caa8884fe136 34
AzureIoTClient 0:caa8884fe136 35 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_CONFIRMATION_RESULT, IOTHUB_CLIENT_CONFIRMATION_RESULT_VALUES)
AzureIoTClient 0:caa8884fe136 36
AzureIoTClient 7:678d6405a200 37 EXECUTE_COMMAND_RESULT TurnFanOn(ContosoAnemometer* device)
AzureIoTClient 0:caa8884fe136 38 {
AzureIoTClient 0:caa8884fe136 39 (void)device;
AzureIoTClient 0:caa8884fe136 40 (void)printf("Turning fan on.\r\n");
AzureIoTClient 0:caa8884fe136 41 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 42 }
AzureIoTClient 0:caa8884fe136 43
AzureIoTClient 7:678d6405a200 44 EXECUTE_COMMAND_RESULT TurnFanOff(ContosoAnemometer* device)
AzureIoTClient 0:caa8884fe136 45 {
AzureIoTClient 0:caa8884fe136 46 (void)device;
AzureIoTClient 0:caa8884fe136 47 (void)printf("Turning fan off.\r\n");
AzureIoTClient 0:caa8884fe136 48 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 49 }
AzureIoTClient 0:caa8884fe136 50
AzureIoTClient 7:678d6405a200 51 EXECUTE_COMMAND_RESULT SetAirResistance(ContosoAnemometer* device, int Position)
AzureIoTClient 0:caa8884fe136 52 {
AzureIoTClient 0:caa8884fe136 53 (void)device;
AzureIoTClient 7:678d6405a200 54 (void)printf("Setting Air Resistance Position to %d.\r\n", Position);
AzureIoTClient 0:caa8884fe136 55 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 56 }
AzureIoTClient 0:caa8884fe136 57
AzureIoTClient 0:caa8884fe136 58 void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
AzureIoTClient 0:caa8884fe136 59 {
AzureIoTClient 0:caa8884fe136 60 int messageTrackingId = (intptr_t)userContextCallback;
AzureIoTClient 0:caa8884fe136 61
AzureIoTClient 0:caa8884fe136 62 (void)printf("Message Id: %d Received.\r\n", messageTrackingId);
AzureIoTClient 0:caa8884fe136 63
AzureIoTClient 0:caa8884fe136 64 (void)printf("Result Call Back Called! Result is: %s \r\n", ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
AzureIoTClient 0:caa8884fe136 65 }
AzureIoTClient 0:caa8884fe136 66
AzureIoTClient 0:caa8884fe136 67
AzureIoTClient 0:caa8884fe136 68 static void sendMessage(IOTHUB_CLIENT_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size)
AzureIoTClient 0:caa8884fe136 69 {
AzureIoTClient 0:caa8884fe136 70 static unsigned int messageTrackingId;
AzureIoTClient 0:caa8884fe136 71 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size);
AzureIoTClient 0:caa8884fe136 72 if (messageHandle == NULL)
AzureIoTClient 0:caa8884fe136 73 {
AzureIoTClient 0:caa8884fe136 74 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 0:caa8884fe136 75 }
AzureIoTClient 0:caa8884fe136 76 else
AzureIoTClient 0:caa8884fe136 77 {
AzureIoTClient 0:caa8884fe136 78 if (IoTHubClient_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)(uintptr_t)messageTrackingId) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:caa8884fe136 79 {
AzureIoTClient 0:caa8884fe136 80 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 0:caa8884fe136 81 }
AzureIoTClient 0:caa8884fe136 82 else
AzureIoTClient 0:caa8884fe136 83 {
AzureIoTClient 0:caa8884fe136 84 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 0:caa8884fe136 85 }
AzureIoTClient 0:caa8884fe136 86
AzureIoTClient 0:caa8884fe136 87 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 0:caa8884fe136 88 }
AzureIoTClient 0:caa8884fe136 89 free((void*)buffer);
AzureIoTClient 0:caa8884fe136 90 messageTrackingId++;
AzureIoTClient 0:caa8884fe136 91 }
AzureIoTClient 0:caa8884fe136 92
AzureIoTClient 7:678d6405a200 93 static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubMessage(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
AzureIoTClient 0:caa8884fe136 94 {
AzureIoTClient 0:caa8884fe136 95 IOTHUBMESSAGE_DISPOSITION_RESULT result;
AzureIoTClient 0:caa8884fe136 96 const unsigned char* buffer;
AzureIoTClient 0:caa8884fe136 97 size_t size;
AzureIoTClient 7:678d6405a200 98 if (IoTHubMessage_GetByteArray(message, &buffer, &size) != IOTHUB_MESSAGE_OK)
AzureIoTClient 0:caa8884fe136 99 {
AzureIoTClient 0:caa8884fe136 100 printf("unable to IoTHubMessage_GetByteArray\r\n");
AzureIoTClient 0:caa8884fe136 101 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:caa8884fe136 102 }
AzureIoTClient 0:caa8884fe136 103 else
AzureIoTClient 0:caa8884fe136 104 {
AzureIoTClient 0:caa8884fe136 105 /*buffer is not zero terminated*/
AzureIoTClient 0:caa8884fe136 106 char* temp = malloc(size + 1);
AzureIoTClient 0:caa8884fe136 107 if (temp == NULL)
AzureIoTClient 0:caa8884fe136 108 {
AzureIoTClient 0:caa8884fe136 109 printf("failed to malloc\r\n");
AzureIoTClient 0:caa8884fe136 110 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:caa8884fe136 111 }
AzureIoTClient 0:caa8884fe136 112 else
AzureIoTClient 0:caa8884fe136 113 {
AzureIoTClient 0:caa8884fe136 114 memcpy(temp, buffer, size);
AzureIoTClient 0:caa8884fe136 115 temp[size] = '\0';
AzureIoTClient 0:caa8884fe136 116 EXECUTE_COMMAND_RESULT executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp);
AzureIoTClient 0:caa8884fe136 117 result =
AzureIoTClient 0:caa8884fe136 118 (executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED :
AzureIoTClient 0:caa8884fe136 119 (executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED :
AzureIoTClient 0:caa8884fe136 120 IOTHUBMESSAGE_REJECTED;
AzureIoTClient 0:caa8884fe136 121 free(temp);
AzureIoTClient 0:caa8884fe136 122 }
AzureIoTClient 0:caa8884fe136 123 }
AzureIoTClient 0:caa8884fe136 124 return result;
AzureIoTClient 0:caa8884fe136 125 }
AzureIoTClient 0:caa8884fe136 126
AzureIoTClient 0:caa8884fe136 127 void simplesample_amqp_run(void)
AzureIoTClient 0:caa8884fe136 128 {
AzureIoTClient 0:caa8884fe136 129 if (serializer_init(NULL) != SERIALIZER_OK)
AzureIoTClient 0:caa8884fe136 130 {
AzureIoTClient 0:caa8884fe136 131 (void)printf("Failed on serializer_init\r\n");
AzureIoTClient 0:caa8884fe136 132 }
AzureIoTClient 0:caa8884fe136 133 else
AzureIoTClient 0:caa8884fe136 134 {
AzureIoTClient 0:caa8884fe136 135 /* Setup IoTHub client configuration */
AzureIoTClient 7:678d6405a200 136 IOTHUB_CLIENT_HANDLE iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, AMQP_Protocol);
AzureIoTClient 7:678d6405a200 137 srand((unsigned int)time(NULL));
AzureIoTClient 7:678d6405a200 138 double avgWindSpeed = 10.0;
AzureIoTClient 0:caa8884fe136 139
AzureIoTClient 0:caa8884fe136 140 if (iotHubClientHandle == NULL)
AzureIoTClient 0:caa8884fe136 141 {
AzureIoTClient 0:caa8884fe136 142 (void)printf("Failed on IoTHubClient_Create\r\n");
AzureIoTClient 0:caa8884fe136 143 }
AzureIoTClient 0:caa8884fe136 144 else
AzureIoTClient 0:caa8884fe136 145 {
AzureIoTClient 7:678d6405a200 146 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 7:678d6405a200 147 // For mbed add the certificate information
AzureIoTClient 7:678d6405a200 148 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 7:678d6405a200 149 {
AzureIoTClient 7:678d6405a200 150 (void)printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 7:678d6405a200 151 }
AzureIoTClient 7:678d6405a200 152 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 7:678d6405a200 153
AzureIoTClient 7:678d6405a200 154 ContosoAnemometer* myWeather = CREATE_MODEL_INSTANCE(WeatherStation, ContosoAnemometer);
AzureIoTClient 7:678d6405a200 155 if (myWeather == NULL)
AzureIoTClient 0:caa8884fe136 156 {
AzureIoTClient 0:caa8884fe136 157 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 0:caa8884fe136 158 }
AzureIoTClient 0:caa8884fe136 159 else
AzureIoTClient 0:caa8884fe136 160 {
AzureIoTClient 0:caa8884fe136 161 unsigned char* destination;
AzureIoTClient 0:caa8884fe136 162 size_t destinationSize;
AzureIoTClient 0:caa8884fe136 163
AzureIoTClient 7:678d6405a200 164 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, IoTHubMessage, myWeather) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:caa8884fe136 165 {
AzureIoTClient 7:678d6405a200 166 printf("unable to IoTHubClient_SetMessageCallback\r\n");
AzureIoTClient 0:caa8884fe136 167 }
AzureIoTClient 0:caa8884fe136 168 else
AzureIoTClient 0:caa8884fe136 169 {
AzureIoTClient 7:678d6405a200 170 myWeather->DeviceId = "myFirstDevice";
AzureIoTClient 7:678d6405a200 171 myWeather->WindSpeed = avgWindSpeed + (rand() % 4 + 2);
AzureIoTClient 0:caa8884fe136 172
AzureIoTClient 7:678d6405a200 173 if (SERIALIZE(&destination, &destinationSize, myWeather->DeviceId, myWeather->WindSpeed) != IOT_AGENT_OK)
AzureIoTClient 0:caa8884fe136 174 {
AzureIoTClient 0:caa8884fe136 175 (void)printf("Failed to serialize\r\n");
AzureIoTClient 0:caa8884fe136 176 }
AzureIoTClient 0:caa8884fe136 177 else
AzureIoTClient 0:caa8884fe136 178 {
AzureIoTClient 0:caa8884fe136 179 sendMessage(iotHubClientHandle, destination, destinationSize);
AzureIoTClient 0:caa8884fe136 180 }
AzureIoTClient 0:caa8884fe136 181
AzureIoTClient 0:caa8884fe136 182 /* wait for commands */
AzureIoTClient 0:caa8884fe136 183 (void)getchar();
AzureIoTClient 0:caa8884fe136 184 }
AzureIoTClient 7:678d6405a200 185 DESTROY_MODEL_INSTANCE(myWeather);
AzureIoTClient 0:caa8884fe136 186 }
AzureIoTClient 0:caa8884fe136 187 IoTHubClient_Destroy(iotHubClientHandle);
AzureIoTClient 0:caa8884fe136 188 }
AzureIoTClient 0:caa8884fe136 189 serializer_deinit();
AzureIoTClient 0:caa8884fe136 190 }
AzureIoTClient 0:caa8884fe136 191 }
AzureIoTClient 0:caa8884fe136 192