Temperature sensor anomaly IoTHub sample
Dependencies: C12832 EthernetInterface LM75B NTPClient iothub_client iothub_http_transport mbed-rtos mbed serializer wolfSSL azure_c_shared_utility
This sample showcases the usage of Azure IoT client libraries to build an application sample that uploads temperature data and reacts to an alert for a temperature anomaly sent by a cloud service.
Diff: main.cpp
- Revision:
- 25:0e41808cdb35
- Parent:
- 22:7a1416b3c440
--- a/main.cpp Tue Feb 16 22:38:46 2016 +0000 +++ b/main.cpp Fri Mar 11 17:04:44 2016 -0800 @@ -2,15 +2,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. #include <stdlib.h> -#include "EthernetInterface.h" #include "iothubtransporthttp.h" #include "serializer.h" #include "schemaserializer.h" #include "threadapi.h" #include "C12832.h" #include "LM75B.h" -#include "NTPClient.h" -#include "azureiot_common/platform.h" +#include "platform.h" #ifdef MBED_BUILD_TIMESTAMP #include "certs.h" @@ -247,119 +245,156 @@ int main(void) { - pc.baud(115200); int result; - (void)printf("Initializing mbed specific things...\r\n"); if ((result = platform_init()) != 0) { (void)printf("Error initializing the platform: %d\r\n",result); - return -1; + result = -1; } - - THREAD_HANDLE ThreadHandle; - - /* clear the LED light upon startup */ - red_led = 1; - blue_led = 1; - green_led = 1; - - alarm_type = ALARM_NONE; - led_on = 0; - - /* clear the screen */ - lcd.cls(); - - if (ThreadAPI_Create(&ThreadHandle, LED_Update_Thread, NULL) != THREADAPI_OK) - { - (void)printf("Error spinning LED update thread.\r\n"); - return -1; - } - - /* initialize the IoTHubClient */ - if (serializer_init(NULL) != SERIALIZER_OK) - { - (void)printf("Failed on serializer_init\r\n"); - } else { - /* Setup IoTHub client configuration */ + + THREAD_HANDLE ThreadHandle; - IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, HTTP_Protocol); + /* clear the LED light upon startup */ + red_led = 1; + blue_led = 1; + green_led = 1; - if (iotHubClientHandle == NULL) + alarm_type = ALARM_NONE; + led_on = 0; + + /* clear the screen */ + lcd.cls(); + + if (ThreadAPI_Create(&ThreadHandle, LED_Update_Thread, NULL) != THREADAPI_OK) { - (void)printf("Failed on IoTHubClient_Create\r\n"); + (void)printf("Error spinning LED update thread.\r\n"); + result = -1; } else { -#ifdef MBED_BUILD_TIMESTAMP - // For mbed add the certificate information - if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK) - { - printf("failure to set option \"TrustedCerts\"\r\n"); - } -#endif // MBED_BUILD_TIMESTAMP - - // Because it can poll "after 9 seconds" polls will happen - // effectively at ~10 seconds. - // Note that for scalabilty, the default value of minimumPollingTime - // is 25 minutes. For more information, see: - // https://azure.microsoft.com/documentation/articles/iot-hub-devguide/#messaging - unsigned int minimumPollingTime = 9; - if (IoTHubClient_LL_SetOption(iotHubClientHandle, "MinimumPollingTime", &minimumPollingTime) != IOTHUB_CLIENT_OK) + /* initialize the IoTHubClient */ + if (serializer_init(NULL) != SERIALIZER_OK) { - printf("failure to set option \"MinimumPollingTime\"\r\n"); - } - - FrdmDevice* frdmDevice = CREATE_MODEL_INSTANCE(Contoso, FrdmDevice, true); - if (frdmDevice == NULL) - { - (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n"); + (void)printf("Failed on serializer_init\r\n"); + result = -1; } else { - IOTHUB_CLIENT_RESULT setMessageResult = IoTHubClient_LL_SetMessageCallback(iotHubClientHandle, IoTHubMessage, frdmDevice); - if (setMessageResult != IOTHUB_CLIENT_OK) + /* Setup IoTHub client configuration */ + + IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, HTTP_Protocol); + + if (iotHubClientHandle == NULL) { - (void)printf("unable to IoTHubClient_SetMessageCallback\r\n"); + (void)printf("Failed on IoTHubClient_Create\r\n"); + result = -1; } else { - STRING_HANDLE commandsMetadata; - - temp = (sensor.temp() * 9 / 5) + 32; +#ifdef MBED_BUILD_TIMESTAMP + // For mbed add the certificate information + if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK) + { + printf("failure to set option \"TrustedCerts\"\r\n"); + } +#endif // MBED_BUILD_TIMESTAMP - /* send the device info upon startup so that the cloud app knows - what commands are available and the fact that the device is up */ - frdmDevice->ObjectType = "DeviceInfo-HW"; - frdmDevice->ObjectName = "An ALARM device"; - frdmDevice->Version = "1.0"; - frdmDevice->SystemProperties.DeviceID = (char*)deviceId; - frdmDevice->SystemProperties.Enabled = true; + // Because it can poll "after 9 seconds" polls will happen + // effectively at ~10 seconds. + // Note that for scalabilty, the default value of minimumPollingTime + // is 25 minutes. For more information, see: + // https://azure.microsoft.com/documentation/articles/iot-hub-devguide/#messaging + unsigned int minimumPollingTime = 9; + if (IoTHubClient_LL_SetOption(iotHubClientHandle, "MinimumPollingTime", &minimumPollingTime) != IOTHUB_CLIENT_OK) + { + printf("failure to set option \"MinimumPollingTime\"\r\n"); + } - /* build the description of the commands on the device */ - commandsMetadata = STRING_new(); - if (commandsMetadata == NULL) + FrdmDevice* frdmDevice = CREATE_MODEL_INSTANCE(Contoso, FrdmDevice, true); + if (frdmDevice == NULL) { - (void)printf("Failed on creating string for commands metadata\r\n"); + (void)printf("Failed on CREATE_MODEL_INSTANCE\r\n"); + result = -1; } else { - /* Serialize the commands metadata as a JSON string before sending */ - if (SchemaSerializer_SerializeCommandMetadata(GET_MODEL_HANDLE(Contoso, FrdmDevice), commandsMetadata) != SCHEMA_SERIALIZER_OK) + IOTHUB_CLIENT_RESULT setMessageResult = IoTHubClient_LL_SetMessageCallback(iotHubClientHandle, IoTHubMessage, frdmDevice); + if (setMessageResult != IOTHUB_CLIENT_OK) { - (void)printf("Failed serializing commands metadata\r\n"); + (void)printf("unable to IoTHubClient_SetMessageCallback\r\n"); + result = -1; } else { - frdmDevice->Commands = (char*)STRING_c_str(commandsMetadata); + STRING_HANDLE commandsMetadata; + + temp = (sensor.temp() * 9 / 5) + 32; + + /* send the device info upon startup so that the cloud app knows + what commands are available and the fact that the device is up */ + frdmDevice->ObjectType = "DeviceInfo-HW"; + frdmDevice->ObjectName = "An ALARM device"; + frdmDevice->Version = "1.0"; + frdmDevice->SystemProperties.DeviceID = (char*)deviceId; + frdmDevice->SystemProperties.Enabled = true; - /* Send the device information and commands metadata to the cloud */ + /* build the description of the commands on the device */ + commandsMetadata = STRING_new(); + if (commandsMetadata == NULL) + { + (void)printf("Failed on creating string for commands metadata\r\n"); + result = -1; + } + else + { + /* Serialize the commands metadata as a JSON string before sending */ + if (SchemaSerializer_SerializeCommandMetadata(GET_MODEL_HANDLE(Contoso, FrdmDevice), commandsMetadata) != SCHEMA_SERIALIZER_OK) + { + (void)printf("Failed serializing commands metadata\r\n"); + result = -1; + } + else + { + frdmDevice->Commands = (char*)STRING_c_str(commandsMetadata); + + /* Send the device information and commands metadata to the cloud */ + { + unsigned char* destination; + size_t destinationSize; + if (SERIALIZE(&destination, &destinationSize, frdmDevice->ObjectName, frdmDevice->ObjectType, frdmDevice->SystemProperties, frdmDevice->Version, frdmDevice->Commands) != IOT_AGENT_OK) + { + (void)printf("Failed to serialize\r\n"); + result = -1; + } + else + { + sendMessage(iotHubClientHandle, destination, destinationSize); + free(destination); + } + } + } + + STRING_delete(commandsMetadata); + } + + frdmDevice->ObjectName = (ascii_char_ptr)deviceId; + frdmDevice->ObjectType = "SensorTagEvent"; + frdmDevice->Version = "1.0"; + frdmDevice->TargetAlarmDevice = (ascii_char_ptr)deviceId; + result = 0; + + while (1) { unsigned char* destination; size_t destinationSize; - if (SERIALIZE(&destination, &destinationSize, frdmDevice->ObjectName, frdmDevice->ObjectType, frdmDevice->SystemProperties, frdmDevice->Version, frdmDevice->Commands) != IOT_AGENT_OK) + + (void)printf("Sending %.02f\r\n", temp); + frdmDevice->temp = temp; + + if (SERIALIZE(&destination, &destinationSize, frdmDevice->ObjectName, frdmDevice->ObjectType, frdmDevice->Version, frdmDevice->TargetAlarmDevice, frdmDevice->temp) != IOT_AGENT_OK) { (void)printf("Failed to serialize\r\n"); } @@ -368,44 +403,19 @@ sendMessage(iotHubClientHandle, destination, destinationSize); free(destination); } + + /* schedule IoTHubClient to send events/receive commands */ + IoTHubClient_LL_DoWork(iotHubClientHandle); } } - - STRING_delete(commandsMetadata); + DESTROY_MODEL_INSTANCE(frdmDevice); } - - frdmDevice->ObjectName = (ascii_char_ptr)deviceId; - frdmDevice->ObjectType = "SensorTagEvent"; - frdmDevice->Version = "1.0"; - frdmDevice->TargetAlarmDevice = (ascii_char_ptr)deviceId; - - while (1) - { - unsigned char* destination; - size_t destinationSize; - - (void)printf("Sending %.02f\r\n", temp); - frdmDevice->temp = temp; - - if (SERIALIZE(&destination, &destinationSize, frdmDevice->ObjectName, frdmDevice->ObjectType, frdmDevice->Version, frdmDevice->TargetAlarmDevice, frdmDevice->temp) != IOT_AGENT_OK) - { - (void)printf("Failed to serialize\r\n"); - } - else - { - sendMessage(iotHubClientHandle, destination, destinationSize); - free(destination); - } - - /* schedule IoTHubClient to send events/receive commands */ - IoTHubClient_LL_DoWork(iotHubClientHandle); - } + IoTHubClient_LL_Destroy(iotHubClientHandle); } - DESTROY_MODEL_INSTANCE(frdmDevice); + serializer_deinit(); } - IoTHubClient_LL_Destroy(iotHubClientHandle); } - serializer_deinit(); + platform_deinit(); } - platform_deinit(); + return result; }