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:
Sat Sep 26 00:18:18 2015 -0700
Revision:
11:2d3ddf2a8d45
Parent:
9:a43d30a74a1b
Child:
13:ec77de4e43c7
v1.0.0-preview.3

Who changed what in which revision?

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