Azure IoT / Mbed 2 deprecated remote_monitoring

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

Committer:
AzureIoTClient
Date:
Fri Nov 13 16:08:20 2015 -0800
Revision:
22:afe08a0ed332
Parent:
20:ea66de0f1a06
Child:
23:ff89811f3fa3
v1.0.0-preview.4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 20:ea66de0f1a06 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 20:ea66de0f1a06 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 20:ea66de0f1a06 3
AzureIoTClient 20:ea66de0f1a06 4 #include "iothubtransportamqp.h"
AzureIoTClient 20:ea66de0f1a06 5 #include "schemalib.h"
AzureIoTClient 20:ea66de0f1a06 6 #include "iothub_client.h"
AzureIoTClient 20:ea66de0f1a06 7 #include "serializer.h"
AzureIoTClient 20:ea66de0f1a06 8 #include "schemaserializer.h"
AzureIoTClient 20:ea66de0f1a06 9 #include "threadapi.h"
AzureIoTClient 20:ea66de0f1a06 10
AzureIoTClient 20:ea66de0f1a06 11 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 20:ea66de0f1a06 12 #include "certs.h"
AzureIoTClient 20:ea66de0f1a06 13 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 20:ea66de0f1a06 14
AzureIoTClient 20:ea66de0f1a06 15 static const char* deviceId = "[Device Id]";
AzureIoTClient 20:ea66de0f1a06 16 static const char* deviceKey = "[Device Key]";
AzureIoTClient 20:ea66de0f1a06 17 static const char* hubName = "[IoTHub Name]";
AzureIoTClient 20:ea66de0f1a06 18 static const char* hubSuffix = "[IoTHub Suffix, i.e. azure-devices.net]";
AzureIoTClient 20:ea66de0f1a06 19
AzureIoTClient 20:ea66de0f1a06 20 // Define the Model
AzureIoTClient 20:ea66de0f1a06 21 BEGIN_NAMESPACE(Contoso);
AzureIoTClient 20:ea66de0f1a06 22
AzureIoTClient 20:ea66de0f1a06 23 DECLARE_STRUCT(SystemProperties,
AzureIoTClient 20:ea66de0f1a06 24 ascii_char_ptr, DeviceID,
AzureIoTClient 20:ea66de0f1a06 25 _Bool, Enabled
AzureIoTClient 20:ea66de0f1a06 26 );
AzureIoTClient 20:ea66de0f1a06 27
AzureIoTClient 20:ea66de0f1a06 28 DECLARE_STRUCT(DeviceProperties,
AzureIoTClient 20:ea66de0f1a06 29 ascii_char_ptr, DeviceID,
AzureIoTClient 20:ea66de0f1a06 30 _Bool, HubEnabledState
AzureIoTClient 20:ea66de0f1a06 31 );
AzureIoTClient 20:ea66de0f1a06 32
AzureIoTClient 20:ea66de0f1a06 33 DECLARE_MODEL(Thermostat,
AzureIoTClient 20:ea66de0f1a06 34
AzureIoTClient 20:ea66de0f1a06 35 /* Event data (temperature, external temperature and humidity) */
AzureIoTClient 20:ea66de0f1a06 36 WITH_DATA(double, Temperature),
AzureIoTClient 20:ea66de0f1a06 37 WITH_DATA(double, ExternalTemperature),
AzureIoTClient 20:ea66de0f1a06 38 WITH_DATA(double, Humidity),
AzureIoTClient 20:ea66de0f1a06 39 WITH_DATA(ascii_char_ptr, DeviceId),
AzureIoTClient 20:ea66de0f1a06 40
AzureIoTClient 20:ea66de0f1a06 41 /* Device Info - This is command metadata + some extra fields */
AzureIoTClient 20:ea66de0f1a06 42 WITH_DATA(ascii_char_ptr, ObjectType),
AzureIoTClient 20:ea66de0f1a06 43 WITH_DATA(_Bool, IsSimulatedDevice),
AzureIoTClient 20:ea66de0f1a06 44 WITH_DATA(ascii_char_ptr, Version),
AzureIoTClient 20:ea66de0f1a06 45 WITH_DATA(DeviceProperties, DeviceProperties),
AzureIoTClient 20:ea66de0f1a06 46 WITH_DATA(ascii_char_ptr_no_quotes, Commands),
AzureIoTClient 20:ea66de0f1a06 47
AzureIoTClient 20:ea66de0f1a06 48 /* Commands implemented by the device */
AzureIoTClient 20:ea66de0f1a06 49 WITH_ACTION(SetTemperature, double, temperature),
AzureIoTClient 20:ea66de0f1a06 50 WITH_ACTION(SetHumidity, double, humidity)
AzureIoTClient 20:ea66de0f1a06 51 );
AzureIoTClient 20:ea66de0f1a06 52
AzureIoTClient 20:ea66de0f1a06 53 END_NAMESPACE(Contoso);
AzureIoTClient 20:ea66de0f1a06 54
AzureIoTClient 20:ea66de0f1a06 55 EXECUTE_COMMAND_RESULT SetTemperature(Thermostat* thermostat, double temperature)
AzureIoTClient 20:ea66de0f1a06 56 {
AzureIoTClient 20:ea66de0f1a06 57 (void)printf("Received temperature %.02fs\r\n", temperature);
AzureIoTClient 20:ea66de0f1a06 58 thermostat->Temperature = temperature;
AzureIoTClient 20:ea66de0f1a06 59 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 20:ea66de0f1a06 60 }
AzureIoTClient 20:ea66de0f1a06 61
AzureIoTClient 20:ea66de0f1a06 62 EXECUTE_COMMAND_RESULT SetHumidity(Thermostat* thermostat, double humidity)
AzureIoTClient 20:ea66de0f1a06 63 {
AzureIoTClient 20:ea66de0f1a06 64 (void)printf("Received humidity %.02fs\r\n", humidity);
AzureIoTClient 20:ea66de0f1a06 65 thermostat->Humidity = humidity;
AzureIoTClient 20:ea66de0f1a06 66 return EXECUTE_COMMAND_SUCCESS;
AzureIoTClient 20:ea66de0f1a06 67 }
AzureIoTClient 20:ea66de0f1a06 68
AzureIoTClient 20:ea66de0f1a06 69 static void sendMessage(IOTHUB_CLIENT_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size)
AzureIoTClient 20:ea66de0f1a06 70 {
AzureIoTClient 20:ea66de0f1a06 71 IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size);
AzureIoTClient 20:ea66de0f1a06 72 if (messageHandle == NULL)
AzureIoTClient 20:ea66de0f1a06 73 {
AzureIoTClient 20:ea66de0f1a06 74 printf("unable to create a new IoTHubMessage\r\n");
AzureIoTClient 20:ea66de0f1a06 75 }
AzureIoTClient 20:ea66de0f1a06 76 else
AzureIoTClient 20:ea66de0f1a06 77 {
AzureIoTClient 20:ea66de0f1a06 78 if (IoTHubClient_SendEventAsync(iotHubClientHandle, messageHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
AzureIoTClient 20:ea66de0f1a06 79 {
AzureIoTClient 20:ea66de0f1a06 80 printf("failed to hand over the message to IoTHubClient");
AzureIoTClient 20:ea66de0f1a06 81 }
AzureIoTClient 20:ea66de0f1a06 82 else
AzureIoTClient 20:ea66de0f1a06 83 {
AzureIoTClient 20:ea66de0f1a06 84 printf("IoTHubClient accepted the message for delivery\r\n");
AzureIoTClient 20:ea66de0f1a06 85 }
AzureIoTClient 20:ea66de0f1a06 86
AzureIoTClient 20:ea66de0f1a06 87 IoTHubMessage_Destroy(messageHandle);
AzureIoTClient 20:ea66de0f1a06 88 }
AzureIoTClient 20:ea66de0f1a06 89 free((void*)buffer);
AzureIoTClient 20:ea66de0f1a06 90 }
AzureIoTClient 20:ea66de0f1a06 91
AzureIoTClient 20:ea66de0f1a06 92 /*this function "links" IoTHub to the serialization library*/
AzureIoTClient 20:ea66de0f1a06 93 static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubMessage(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
AzureIoTClient 20:ea66de0f1a06 94 {
AzureIoTClient 20:ea66de0f1a06 95 IOTHUBMESSAGE_DISPOSITION_RESULT result;
AzureIoTClient 20:ea66de0f1a06 96 const unsigned char* buffer;
AzureIoTClient 20:ea66de0f1a06 97 size_t size;
AzureIoTClient 20:ea66de0f1a06 98 if (IoTHubMessage_GetByteArray(message, &buffer, &size) != IOTHUB_MESSAGE_OK)
AzureIoTClient 20:ea66de0f1a06 99 {
AzureIoTClient 20:ea66de0f1a06 100 printf("unable to IoTHubMessage_GetByteArray\r\n");
AzureIoTClient 20:ea66de0f1a06 101 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 20:ea66de0f1a06 102 }
AzureIoTClient 20:ea66de0f1a06 103 else
AzureIoTClient 20:ea66de0f1a06 104 {
AzureIoTClient 20:ea66de0f1a06 105 /*buffer is not zero terminated*/
AzureIoTClient 20:ea66de0f1a06 106 char* temp = malloc(size + 1);
AzureIoTClient 20:ea66de0f1a06 107 if (temp == NULL)
AzureIoTClient 20:ea66de0f1a06 108 {
AzureIoTClient 20:ea66de0f1a06 109 printf("failed to malloc\r\n");
AzureIoTClient 20:ea66de0f1a06 110 result = EXECUTE_COMMAND_ERROR;
AzureIoTClient 20:ea66de0f1a06 111 }
AzureIoTClient 20:ea66de0f1a06 112 else
AzureIoTClient 20:ea66de0f1a06 113 {
AzureIoTClient 20:ea66de0f1a06 114 memcpy(temp, buffer, size);
AzureIoTClient 20:ea66de0f1a06 115 temp[size] = '\0';
AzureIoTClient 20:ea66de0f1a06 116 EXECUTE_COMMAND_RESULT executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp);
AzureIoTClient 20:ea66de0f1a06 117 result =
AzureIoTClient 20:ea66de0f1a06 118 (executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED :
AzureIoTClient 20:ea66de0f1a06 119 (executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED :
AzureIoTClient 20:ea66de0f1a06 120 IOTHUBMESSAGE_REJECTED;
AzureIoTClient 20:ea66de0f1a06 121 free(temp);
AzureIoTClient 20:ea66de0f1a06 122 }
AzureIoTClient 20:ea66de0f1a06 123 }
AzureIoTClient 20:ea66de0f1a06 124 return result;
AzureIoTClient 20:ea66de0f1a06 125 }
AzureIoTClient 20:ea66de0f1a06 126
AzureIoTClient 20:ea66de0f1a06 127 void remote_monitoring_run(void)
AzureIoTClient 20:ea66de0f1a06 128 {
AzureIoTClient 20:ea66de0f1a06 129 if (serializer_init(NULL) != SERIALIZER_OK)
AzureIoTClient 20:ea66de0f1a06 130 {
AzureIoTClient 20:ea66de0f1a06 131 printf("Failed on serializer_init\r\n");
AzureIoTClient 20:ea66de0f1a06 132 }
AzureIoTClient 20:ea66de0f1a06 133 else
AzureIoTClient 20:ea66de0f1a06 134 {
AzureIoTClient 20:ea66de0f1a06 135 IOTHUB_CLIENT_CONFIG config;
AzureIoTClient 20:ea66de0f1a06 136
AzureIoTClient 20:ea66de0f1a06 137 config.deviceId = deviceId;
AzureIoTClient 20:ea66de0f1a06 138 config.deviceKey = deviceKey;
AzureIoTClient 20:ea66de0f1a06 139 config.iotHubName = hubName;
AzureIoTClient 20:ea66de0f1a06 140 config.iotHubSuffix = hubSuffix;
AzureIoTClient 20:ea66de0f1a06 141 config.protocol = AMQP_Protocol;
AzureIoTClient 20:ea66de0f1a06 142
AzureIoTClient 20:ea66de0f1a06 143 IOTHUB_CLIENT_HANDLE iotHubClientHandle = IoTHubClient_Create(&config);
AzureIoTClient 20:ea66de0f1a06 144 if (iotHubClientHandle == NULL)
AzureIoTClient 20:ea66de0f1a06 145 {
AzureIoTClient 20:ea66de0f1a06 146 (void)printf("Failed on IoTHubClient_CreateFromConnectionString\r\n");
AzureIoTClient 20:ea66de0f1a06 147 }
AzureIoTClient 20:ea66de0f1a06 148 else
AzureIoTClient 20:ea66de0f1a06 149 {
AzureIoTClient 20:ea66de0f1a06 150 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 20:ea66de0f1a06 151 // For mbed add the certificate information
AzureIoTClient 20:ea66de0f1a06 152 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 20:ea66de0f1a06 153 {
AzureIoTClient 20:ea66de0f1a06 154 printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 20:ea66de0f1a06 155 }
AzureIoTClient 20:ea66de0f1a06 156 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 20:ea66de0f1a06 157
AzureIoTClient 20:ea66de0f1a06 158 Thermostat* thermostat = CREATE_MODEL_INSTANCE(Contoso, Thermostat);
AzureIoTClient 20:ea66de0f1a06 159 if (thermostat == NULL)
AzureIoTClient 20:ea66de0f1a06 160 {
AzureIoTClient 20:ea66de0f1a06 161 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 20:ea66de0f1a06 162 }
AzureIoTClient 20:ea66de0f1a06 163 else
AzureIoTClient 20:ea66de0f1a06 164 {
AzureIoTClient 20:ea66de0f1a06 165 STRING_HANDLE commandsMetadata;
AzureIoTClient 20:ea66de0f1a06 166
AzureIoTClient 20:ea66de0f1a06 167 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, IoTHubMessage, thermostat) != IOTHUB_CLIENT_OK)
AzureIoTClient 20:ea66de0f1a06 168 {
AzureIoTClient 20:ea66de0f1a06 169 printf("unable to IoTHubClient_SetMessageCallback\r\n");
AzureIoTClient 20:ea66de0f1a06 170 }
AzureIoTClient 20:ea66de0f1a06 171 else
AzureIoTClient 20:ea66de0f1a06 172 {
AzureIoTClient 20:ea66de0f1a06 173
AzureIoTClient 20:ea66de0f1a06 174 /* send the device info upon startup so that the cloud app knows
AzureIoTClient 20:ea66de0f1a06 175 what commands are available and the fact that the device is up */
AzureIoTClient 20:ea66de0f1a06 176 thermostat->ObjectType = "DeviceInfo";
AzureIoTClient 20:ea66de0f1a06 177 thermostat->IsSimulatedDevice = false;
AzureIoTClient 20:ea66de0f1a06 178 thermostat->Version = "1.0";
AzureIoTClient 20:ea66de0f1a06 179 thermostat->DeviceProperties.HubEnabledState = true;
AzureIoTClient 20:ea66de0f1a06 180 thermostat->DeviceProperties.DeviceID = (char*)deviceId;
AzureIoTClient 20:ea66de0f1a06 181
AzureIoTClient 20:ea66de0f1a06 182 commandsMetadata = STRING_new();
AzureIoTClient 20:ea66de0f1a06 183 if (commandsMetadata == NULL)
AzureIoTClient 20:ea66de0f1a06 184 {
AzureIoTClient 20:ea66de0f1a06 185 (void)printf("Failed on creating string for commands metadata\r\n");
AzureIoTClient 20:ea66de0f1a06 186 }
AzureIoTClient 20:ea66de0f1a06 187 else
AzureIoTClient 20:ea66de0f1a06 188 {
AzureIoTClient 20:ea66de0f1a06 189 /* Serialize the commands metadata as a JSON string before sending */
AzureIoTClient 20:ea66de0f1a06 190 if (SchemaSerializer_SerializeCommandMetadata(GET_MODEL_HANDLE(Contoso, Thermostat), commandsMetadata) != SCHEMA_SERIALIZER_OK)
AzureIoTClient 20:ea66de0f1a06 191 {
AzureIoTClient 20:ea66de0f1a06 192 (void)printf("Failed serializing commands metadata\r\n");
AzureIoTClient 20:ea66de0f1a06 193 }
AzureIoTClient 20:ea66de0f1a06 194 else
AzureIoTClient 20:ea66de0f1a06 195 {
AzureIoTClient 20:ea66de0f1a06 196 unsigned char* buffer;
AzureIoTClient 20:ea66de0f1a06 197 size_t bufferSize;
AzureIoTClient 20:ea66de0f1a06 198 thermostat->Commands = (char*)STRING_c_str(commandsMetadata);
AzureIoTClient 20:ea66de0f1a06 199
AzureIoTClient 20:ea66de0f1a06 200 /* Here is the actual send of the Device Info */
AzureIoTClient 20:ea66de0f1a06 201 if (SERIALIZE(&buffer, &bufferSize, thermostat->ObjectType, thermostat->Version, thermostat->IsSimulatedDevice, thermostat->DeviceProperties, thermostat->Commands) != IOT_AGENT_OK)
AzureIoTClient 20:ea66de0f1a06 202 {
AzureIoTClient 20:ea66de0f1a06 203 (void)printf("Failed serializing\r\n");
AzureIoTClient 20:ea66de0f1a06 204 }
AzureIoTClient 20:ea66de0f1a06 205 else
AzureIoTClient 20:ea66de0f1a06 206 {
AzureIoTClient 20:ea66de0f1a06 207 sendMessage(iotHubClientHandle, buffer, bufferSize);
AzureIoTClient 20:ea66de0f1a06 208 }
AzureIoTClient 20:ea66de0f1a06 209
AzureIoTClient 20:ea66de0f1a06 210 }
AzureIoTClient 20:ea66de0f1a06 211
AzureIoTClient 20:ea66de0f1a06 212 STRING_delete(commandsMetadata);
AzureIoTClient 20:ea66de0f1a06 213 }
AzureIoTClient 20:ea66de0f1a06 214
AzureIoTClient 20:ea66de0f1a06 215 thermostat->Temperature = 50.0;
AzureIoTClient 20:ea66de0f1a06 216 thermostat->ExternalTemperature = 55.0;
AzureIoTClient 20:ea66de0f1a06 217 thermostat->Humidity = 50.0;
AzureIoTClient 20:ea66de0f1a06 218 thermostat->DeviceId = (char*)deviceId;
AzureIoTClient 20:ea66de0f1a06 219
AzureIoTClient 20:ea66de0f1a06 220 while (1)
AzureIoTClient 20:ea66de0f1a06 221 {
AzureIoTClient 20:ea66de0f1a06 222 unsigned char*buffer;
AzureIoTClient 20:ea66de0f1a06 223 size_t bufferSize;
AzureIoTClient 20:ea66de0f1a06 224
AzureIoTClient 20:ea66de0f1a06 225 (void)printf("Sending sensor value Temperature = %02f, Humidity = %02f\r\n", thermostat->Temperature, thermostat->Humidity);
AzureIoTClient 20:ea66de0f1a06 226
AzureIoTClient 22:afe08a0ed332 227 if (SERIALIZE(&buffer, &bufferSize, thermostat->DeviceId, thermostat->Temperature, thermostat->Humidity, thermostat->ExternalTemperature) != IOT_AGENT_OK)
AzureIoTClient 20:ea66de0f1a06 228 {
AzureIoTClient 20:ea66de0f1a06 229 (void)printf("Failed sending sensor value\r\n");
AzureIoTClient 20:ea66de0f1a06 230 }
AzureIoTClient 20:ea66de0f1a06 231 else
AzureIoTClient 20:ea66de0f1a06 232 {
AzureIoTClient 20:ea66de0f1a06 233 sendMessage(iotHubClientHandle, buffer, bufferSize);
AzureIoTClient 20:ea66de0f1a06 234 }
AzureIoTClient 20:ea66de0f1a06 235
AzureIoTClient 20:ea66de0f1a06 236 ThreadAPI_Sleep(1000);
AzureIoTClient 20:ea66de0f1a06 237 }
AzureIoTClient 20:ea66de0f1a06 238 }
AzureIoTClient 20:ea66de0f1a06 239
AzureIoTClient 20:ea66de0f1a06 240 DESTROY_MODEL_INSTANCE(thermostat);
AzureIoTClient 20:ea66de0f1a06 241 }
AzureIoTClient 20:ea66de0f1a06 242 IoTHubClient_Destroy(iotHubClientHandle);
AzureIoTClient 20:ea66de0f1a06 243 }
AzureIoTClient 20:ea66de0f1a06 244 serializer_deinit();
AzureIoTClient 20:ea66de0f1a06 245 }
AzureIoTClient 20:ea66de0f1a06 246 }