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:
Fri Jan 15 15:50:02 2016 -0800
Revision:
19:eae21b79ceff
Parent:
18:a3ec1aab72dc
Child:
25:9cb9b0c15218
v1.0.0-preview.4

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