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:
Wed Sep 16 22:43:21 2015 -0700
Revision:
2:fc3132155be8
Parent:
0:caa8884fe136
Child:
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 0:caa8884fe136 4 #include <stdio.h>
AzureIoTClient 0:caa8884fe136 5 #include <stdint.h>
AzureIoTClient 0:caa8884fe136 6
AzureIoTClient 0:caa8884fe136 7 #include "serializer.h"
AzureIoTClient 0:caa8884fe136 8 #include "threadapi.h"
AzureIoTClient 0:caa8884fe136 9 #include "sastoken.h"
AzureIoTClient 0:caa8884fe136 10 #include "iothub_client.h"
AzureIoTClient 0:caa8884fe136 11 #include "iothubtransportamqp.h"
AzureIoTClient 0:caa8884fe136 12 #include "iothub_client_ll.h"
AzureIoTClient 0:caa8884fe136 13
AzureIoTClient 0:caa8884fe136 14 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 15 #include "certs.h"
AzureIoTClient 0:caa8884fe136 16 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 17
AzureIoTClient 2:fc3132155be8 18 static const char* connectionString = "[IoT Connection String goes here]";
AzureIoTClient 0:caa8884fe136 19
AzureIoTClient 0:caa8884fe136 20 // Define the Model
AzureIoTClient 0:caa8884fe136 21 BEGIN_NAMESPACE(MyThermostat);
AzureIoTClient 0:caa8884fe136 22
AzureIoTClient 0:caa8884fe136 23 DECLARE_MODEL(ContosoThermostat505,
AzureIoTClient 0:caa8884fe136 24 WITH_DATA(int, Temperature),
AzureIoTClient 0:caa8884fe136 25 WITH_DATA(int, Humidity),
AzureIoTClient 0:caa8884fe136 26 WITH_DATA(bool, LowTemperatureAlarm),
AzureIoTClient 0:caa8884fe136 27 WITH_ACTION(TurnFanOn),
AzureIoTClient 0:caa8884fe136 28 WITH_ACTION(TurnFanOff),
AzureIoTClient 0:caa8884fe136 29 WITH_ACTION(SetTemperature, int, DesiredTemperature)
AzureIoTClient 0:caa8884fe136 30 );
AzureIoTClient 0:caa8884fe136 31
AzureIoTClient 0:caa8884fe136 32 END_NAMESPACE(MyThermostat);
AzureIoTClient 0:caa8884fe136 33
AzureIoTClient 0:caa8884fe136 34 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_CONFIRMATION_RESULT, IOTHUB_CLIENT_CONFIRMATION_RESULT_VALUES)
AzureIoTClient 0:caa8884fe136 35
AzureIoTClient 0:caa8884fe136 36 EXECUTE_COMMAND_RESULT TurnFanOn(ContosoThermostat505* device)
AzureIoTClient 0:caa8884fe136 37 {
AzureIoTClient 0:caa8884fe136 38 (void)device;
AzureIoTClient 0:caa8884fe136 39 (void)printf("Turning fan on.\r\n");
AzureIoTClient 0:caa8884fe136 40 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 41 }
AzureIoTClient 0:caa8884fe136 42
AzureIoTClient 0:caa8884fe136 43 EXECUTE_COMMAND_RESULT TurnFanOff(ContosoThermostat505* device)
AzureIoTClient 0:caa8884fe136 44 {
AzureIoTClient 0:caa8884fe136 45 (void)device;
AzureIoTClient 0:caa8884fe136 46 (void)printf("Turning fan off.\r\n");
AzureIoTClient 0:caa8884fe136 47 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 48 }
AzureIoTClient 0:caa8884fe136 49
AzureIoTClient 0:caa8884fe136 50 EXECUTE_COMMAND_RESULT SetTemperature(ContosoThermostat505* device, int DesiredTemperature)
AzureIoTClient 0:caa8884fe136 51 {
AzureIoTClient 0:caa8884fe136 52 (void)device;
AzureIoTClient 0:caa8884fe136 53 (void)printf("Setting home temperature to %d degrees.\r\n", DesiredTemperature);
AzureIoTClient 0:caa8884fe136 54 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 0:caa8884fe136 55 }
AzureIoTClient 0:caa8884fe136 56
AzureIoTClient 0:caa8884fe136 57 void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
AzureIoTClient 0:caa8884fe136 58 {
AzureIoTClient 0:caa8884fe136 59 int messageTrackingId = (intptr_t)userContextCallback;
AzureIoTClient 0:caa8884fe136 60
AzureIoTClient 0:caa8884fe136 61 (void)printf("Message Id: %d Received.\r\n", messageTrackingId);
AzureIoTClient 0:caa8884fe136 62
AzureIoTClient 0:caa8884fe136 63 (void)printf("Result Call Back Called! Result is: %s \r\n", ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
AzureIoTClient 0:caa8884fe136 64 }
AzureIoTClient 0:caa8884fe136 65
AzureIoTClient 0:caa8884fe136 66
AzureIoTClient 0:caa8884fe136 67 static void sendMessage(IOTHUB_CLIENT_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size)
AzureIoTClient 0:caa8884fe136 68 {
AzureIoTClient 0:caa8884fe136 69 static unsigned int messageTrackingId;
AzureIoTClient 0:caa8884fe136 70 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size);
AzureIoTClient 0:caa8884fe136 71 if (messageHandle == NULL)
AzureIoTClient 0:caa8884fe136 72 {
AzureIoTClient 0:caa8884fe136 73 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 0:caa8884fe136 74 }
AzureIoTClient 0:caa8884fe136 75 else
AzureIoTClient 0:caa8884fe136 76 {
AzureIoTClient 0:caa8884fe136 77 if (IoTHubClient_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)(uintptr_t)messageTrackingId) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:caa8884fe136 78 {
AzureIoTClient 0:caa8884fe136 79 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 0:caa8884fe136 80 }
AzureIoTClient 0:caa8884fe136 81 else
AzureIoTClient 0:caa8884fe136 82 {
AzureIoTClient 0:caa8884fe136 83 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 0:caa8884fe136 84 }
AzureIoTClient 0:caa8884fe136 85
AzureIoTClient 0:caa8884fe136 86 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 0:caa8884fe136 87 }
AzureIoTClient 0:caa8884fe136 88 free((void*)buffer);
AzureIoTClient 0:caa8884fe136 89 messageTrackingId++;
AzureIoTClient 0:caa8884fe136 90 }
AzureIoTClient 0:caa8884fe136 91
AzureIoTClient 0:caa8884fe136 92 static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubNotification(IOTHUB_MESSAGE_HANDLE notificationMessage, void* userContextCallback)
AzureIoTClient 0:caa8884fe136 93 {
AzureIoTClient 0:caa8884fe136 94 IOTHUBMESSAGE_DISPOSITION_RESULT result;
AzureIoTClient 0:caa8884fe136 95 const unsigned char* buffer;
AzureIoTClient 0:caa8884fe136 96 size_t size;
AzureIoTClient 0:caa8884fe136 97 if (IoTHubMessage_GetByteArray(notificationMessage, &buffer, &size) != IOTHUB_MESSAGE_OK)
AzureIoTClient 0:caa8884fe136 98 {
AzureIoTClient 0:caa8884fe136 99 printf("unable to IoTHubMessage_GetByteArray\r\n");
AzureIoTClient 0:caa8884fe136 100 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:caa8884fe136 101 }
AzureIoTClient 0:caa8884fe136 102 else
AzureIoTClient 0:caa8884fe136 103 {
AzureIoTClient 0:caa8884fe136 104 /*buffer is not zero terminated*/
AzureIoTClient 0:caa8884fe136 105 char* temp = malloc(size + 1);
AzureIoTClient 0:caa8884fe136 106 if (temp == NULL)
AzureIoTClient 0:caa8884fe136 107 {
AzureIoTClient 0:caa8884fe136 108 printf("failed to malloc\r\n");
AzureIoTClient 0:caa8884fe136 109 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 0:caa8884fe136 110 }
AzureIoTClient 0:caa8884fe136 111 else
AzureIoTClient 0:caa8884fe136 112 {
AzureIoTClient 0:caa8884fe136 113 memcpy(temp, buffer, size);
AzureIoTClient 0:caa8884fe136 114 temp[size] = '\0';
AzureIoTClient 0:caa8884fe136 115 EXECUTE_COMMAND_RESULT executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp);
AzureIoTClient 0:caa8884fe136 116 result =
AzureIoTClient 0:caa8884fe136 117 (executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED :
AzureIoTClient 0:caa8884fe136 118 (executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED :
AzureIoTClient 0:caa8884fe136 119 IOTHUBMESSAGE_REJECTED;
AzureIoTClient 0:caa8884fe136 120 free(temp);
AzureIoTClient 0:caa8884fe136 121 }
AzureIoTClient 0:caa8884fe136 122 }
AzureIoTClient 0:caa8884fe136 123 return result;
AzureIoTClient 0:caa8884fe136 124 }
AzureIoTClient 0:caa8884fe136 125
AzureIoTClient 0:caa8884fe136 126 void simplesample_amqp_run(void)
AzureIoTClient 0:caa8884fe136 127 {
AzureIoTClient 0:caa8884fe136 128 if (serializer_init(NULL) != SERIALIZER_OK)
AzureIoTClient 0:caa8884fe136 129 {
AzureIoTClient 0:caa8884fe136 130 (void)printf("Failed on serializer_init\r\n");
AzureIoTClient 0:caa8884fe136 131 }
AzureIoTClient 0:caa8884fe136 132 else
AzureIoTClient 0:caa8884fe136 133 {
AzureIoTClient 0:caa8884fe136 134
AzureIoTClient 0:caa8884fe136 135 /* Setup IoTHub client configuration */
AzureIoTClient 0:caa8884fe136 136
AzureIoTClient 0:caa8884fe136 137 IOTHUB_CLIENT_HANDLE iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, IoTHubTransportAmqp_ProvideTransportInterface);
AzureIoTClient 0:caa8884fe136 138
AzureIoTClient 0:caa8884fe136 139 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 140 // For mbed add the certificate information
AzureIoTClient 0:caa8884fe136 141 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:caa8884fe136 142 {
AzureIoTClient 0:caa8884fe136 143 printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 0:caa8884fe136 144 }
AzureIoTClient 0:caa8884fe136 145 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 0:caa8884fe136 146
AzureIoTClient 0:caa8884fe136 147 if (iotHubClientHandle == NULL)
AzureIoTClient 0:caa8884fe136 148 {
AzureIoTClient 0:caa8884fe136 149 (void)printf("Failed on IoTHubClient_Create\r\n");
AzureIoTClient 0:caa8884fe136 150 }
AzureIoTClient 0:caa8884fe136 151 else
AzureIoTClient 0:caa8884fe136 152 {
AzureIoTClient 0:caa8884fe136 153 ContosoThermostat505* Thermostat = CREATE_MODEL_INSTANCE(MyThermostat, ContosoThermostat505);
AzureIoTClient 0:caa8884fe136 154 if (Thermostat == NULL)
AzureIoTClient 0:caa8884fe136 155 {
AzureIoTClient 0:caa8884fe136 156 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 0:caa8884fe136 157 }
AzureIoTClient 0:caa8884fe136 158 else
AzureIoTClient 0:caa8884fe136 159 {
AzureIoTClient 0:caa8884fe136 160 unsigned char* destination;
AzureIoTClient 0:caa8884fe136 161 size_t destinationSize;
AzureIoTClient 0:caa8884fe136 162
AzureIoTClient 0:caa8884fe136 163 if (IoTHubClient_SetNotificationCallback(iotHubClientHandle, IoTHubNotification, Thermostat) != IOTHUB_CLIENT_OK)
AzureIoTClient 0:caa8884fe136 164 {
AzureIoTClient 0:caa8884fe136 165 printf("unable to IoTHubClient_SetNotificationCallback\r\n");
AzureIoTClient 0:caa8884fe136 166 }
AzureIoTClient 0:caa8884fe136 167 else
AzureIoTClient 0:caa8884fe136 168 {
AzureIoTClient 0:caa8884fe136 169
AzureIoTClient 0:caa8884fe136 170 Thermostat->Temperature = 67;
AzureIoTClient 0:caa8884fe136 171 Thermostat->Humidity = 42;
AzureIoTClient 0:caa8884fe136 172
AzureIoTClient 0:caa8884fe136 173 if (SERIALIZE(&destination, &destinationSize, Thermostat->Temperature, Thermostat->Humidity) != 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 0:caa8884fe136 185 DESTROY_MODEL_INSTANCE(Thermostat);
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