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:
Tue Sep 22 20:37:54 2015 -0700
Revision:
9:a43d30a74a1b
Child:
11:2d3ddf2a8d45
New release

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