Remote monitoring IoTHub device sample Added real SHTx sensor to get temperature and humidity Added new command to set temperature scale change Removed "mock" commands to set temperature and humidity values It's configured to work on FRDM-K64F board

Dependencies:   EthernetInterface NTPClient SHTx iothub_amqp_transport iothub_client mbed-rtos mbed proton-c-mbed serializer wolfSSL

Fork of remote_monitoring by Azure IoT

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 }