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:
Fri Nov 13 16:08:20 2015 -0800
Revision:
22:afe08a0ed332
Parent:
20:ea66de0f1a06
Child:
23:e37e4e321690
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 }