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:
Mon Sep 28 09:54:26 2015 -0700
Revision:
13:ec77de4e43c7
Parent:
11:2d3ddf2a8d45
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 #ifdef MBED_BUILD_TIMESTAMP
AzureIoTClient 9:a43d30a74a1b 151 // For mbed add the certificate information
AzureIoTClient 9:a43d30a74a1b 152 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
AzureIoTClient 9:a43d30a74a1b 153 {
AzureIoTClient 9:a43d30a74a1b 154 printf("failure to set option \"TrustedCerts\"\r\n");
AzureIoTClient 9:a43d30a74a1b 155 }
AzureIoTClient 9:a43d30a74a1b 156 #endif // MBED_BUILD_TIMESTAMP
AzureIoTClient 9:a43d30a74a1b 157
AzureIoTClient 9:a43d30a74a1b 158 Thermostat* thermostat = CREATE_MODEL_INSTANCE(Contoso, Thermostat);
AzureIoTClient 9:a43d30a74a1b 159 if (thermostat == NULL)
AzureIoTClient 9:a43d30a74a1b 160 {
AzureIoTClient 9:a43d30a74a1b 161 (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n");
AzureIoTClient 9:a43d30a74a1b 162 }
AzureIoTClient 9:a43d30a74a1b 163 else
AzureIoTClient 9:a43d30a74a1b 164 {
AzureIoTClient 9:a43d30a74a1b 165 STRING_HANDLE commandsMetadata;
AzureIoTClient 9:a43d30a74a1b 166
AzureIoTClient 9:a43d30a74a1b 167 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, IoTHubMessage, thermostat) != IOTHUB_CLIENT_OK)
AzureIoTClient 9:a43d30a74a1b 168 {
AzureIoTClient 9:a43d30a74a1b 169 printf("unable to IoTHubClient_SetMessageCallback\r\n");
AzureIoTClient 9:a43d30a74a1b 170 }
AzureIoTClient 9:a43d30a74a1b 171 else
AzureIoTClient 9:a43d30a74a1b 172 {
AzureIoTClient 9:a43d30a74a1b 173
AzureIoTClient 9:a43d30a74a1b 174 /* send the device info upon startup so that the cloud app knows
AzureIoTClient 9:a43d30a74a1b 175 what commands are available and the fact that the device is up */
AzureIoTClient 9:a43d30a74a1b 176 thermostat->ObjectType = "DeviceInfo";
AzureIoTClient 9:a43d30a74a1b 177 thermostat->IsSimulatedDevice = false;
AzureIoTClient 9:a43d30a74a1b 178 thermostat->Version = "1.0";
AzureIoTClient 9:a43d30a74a1b 179 thermostat->DeviceProperties.HubEnabledState = true;
AzureIoTClient 9:a43d30a74a1b 180 thermostat->DeviceProperties.DeviceID = (char*)deviceId;
AzureIoTClient 9:a43d30a74a1b 181
AzureIoTClient 9:a43d30a74a1b 182 commandsMetadata = STRING_new();
AzureIoTClient 9:a43d30a74a1b 183 if (commandsMetadata == NULL)
AzureIoTClient 9:a43d30a74a1b 184 {
AzureIoTClient 9:a43d30a74a1b 185 (void)printf("Failed on creating string for commands metadata\r\n");
AzureIoTClient 9:a43d30a74a1b 186 }
AzureIoTClient 9:a43d30a74a1b 187 else
AzureIoTClient 9:a43d30a74a1b 188 {
AzureIoTClient 9:a43d30a74a1b 189 /* Serialize the commands metadata as a JSON string before sending */
AzureIoTClient 9:a43d30a74a1b 190 if (SchemaSerializer_SerializeCommandMetadata(GET_MODEL_HANDLE(Contoso, Thermostat), commandsMetadata) != SCHEMA_SERIALIZER_OK)
AzureIoTClient 9:a43d30a74a1b 191 {
AzureIoTClient 9:a43d30a74a1b 192 (void)printf("Failed serializing commands metadata\r\n");
AzureIoTClient 9:a43d30a74a1b 193 }
AzureIoTClient 9:a43d30a74a1b 194 else
AzureIoTClient 9:a43d30a74a1b 195 {
AzureIoTClient 9:a43d30a74a1b 196 unsigned char* buffer;
AzureIoTClient 9:a43d30a74a1b 197 size_t bufferSize;
AzureIoTClient 9:a43d30a74a1b 198 thermostat->Commands = (char*)STRING_c_str(commandsMetadata);
AzureIoTClient 9:a43d30a74a1b 199
AzureIoTClient 9:a43d30a74a1b 200 /* Here is the actual send of the Device Info */
AzureIoTClient 9:a43d30a74a1b 201 if (SERIALIZE(&buffer, &bufferSize, thermostat->ObjectType, thermostat->Version, thermostat->IsSimulatedDevice, thermostat->DeviceProperties, thermostat->Commands) != IOT_AGENT_OK)
AzureIoTClient 9:a43d30a74a1b 202 {
AzureIoTClient 9:a43d30a74a1b 203 (void)printf("Failed serializing\r\n");
AzureIoTClient 9:a43d30a74a1b 204 }
AzureIoTClient 9:a43d30a74a1b 205 else
AzureIoTClient 9:a43d30a74a1b 206 {
AzureIoTClient 9:a43d30a74a1b 207 sendMessage(iotHubClientHandle, buffer, bufferSize);
AzureIoTClient 9:a43d30a74a1b 208 }
AzureIoTClient 9:a43d30a74a1b 209
AzureIoTClient 9:a43d30a74a1b 210 }
AzureIoTClient 9:a43d30a74a1b 211
AzureIoTClient 9:a43d30a74a1b 212 STRING_delete(commandsMetadata);
AzureIoTClient 9:a43d30a74a1b 213 }
AzureIoTClient 9:a43d30a74a1b 214
AzureIoTClient 9:a43d30a74a1b 215 thermostat->Temperature = 50.0;
AzureIoTClient 11:2d3ddf2a8d45 216 thermostat->ExternalTemperature = 55.0;
AzureIoTClient 9:a43d30a74a1b 217 thermostat->Humidity = 50.0;
AzureIoTClient 9:a43d30a74a1b 218 thermostat->DeviceId = (char*)deviceId;
AzureIoTClient 9:a43d30a74a1b 219
AzureIoTClient 9:a43d30a74a1b 220 while (1)
AzureIoTClient 9:a43d30a74a1b 221 {
AzureIoTClient 9:a43d30a74a1b 222 unsigned char*buffer;
AzureIoTClient 9:a43d30a74a1b 223 size_t bufferSize;
AzureIoTClient 9:a43d30a74a1b 224
AzureIoTClient 9:a43d30a74a1b 225 (void)printf("Sending sensor value Temperature = %02f, Humidity = %02f\r\n", thermostat->Temperature, thermostat->Humidity);
AzureIoTClient 9:a43d30a74a1b 226
AzureIoTClient 11:2d3ddf2a8d45 227 if (SERIALIZE(&buffer, &bufferSize, thermostat->Temperature, thermostat->ExternalTemperature, thermostat->Humidity, thermostat->DeviceId) != IOT_AGENT_OK)
AzureIoTClient 9:a43d30a74a1b 228 {
AzureIoTClient 9:a43d30a74a1b 229 (void)printf("Failed sending sensor value\r\n");
AzureIoTClient 9:a43d30a74a1b 230 }
AzureIoTClient 9:a43d30a74a1b 231 else
AzureIoTClient 9:a43d30a74a1b 232 {
AzureIoTClient 9:a43d30a74a1b 233 sendMessage(iotHubClientHandle, buffer, bufferSize);
AzureIoTClient 9:a43d30a74a1b 234 }
AzureIoTClient 9:a43d30a74a1b 235
AzureIoTClient 9:a43d30a74a1b 236 ThreadAPI_Sleep(1000);
AzureIoTClient 9:a43d30a74a1b 237 }
AzureIoTClient 9:a43d30a74a1b 238 }
AzureIoTClient 9:a43d30a74a1b 239
AzureIoTClient 9:a43d30a74a1b 240 DESTROY_MODEL_INSTANCE(thermostat);
AzureIoTClient 9:a43d30a74a1b 241 }
AzureIoTClient 9:a43d30a74a1b 242 IoTHubClient_Destroy(iotHubClientHandle);
AzureIoTClient 9:a43d30a74a1b 243 }
AzureIoTClient 9:a43d30a74a1b 244 serializer_deinit();
AzureIoTClient 9:a43d30a74a1b 245 }
AzureIoTClient 9:a43d30a74a1b 246 }