forked from Azure/azure-iot-arduino-utility
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6a95dd2
commit d2adf54
Showing
19 changed files
with
571 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,259 @@ | ||
// Copyright (c) Microsoft. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#include <stdlib.h> | ||
|
||
#include <stdio.h> | ||
#include <stdint.h> | ||
|
||
/* This sample uses the _LL APIs of iothub_client for example purposes. | ||
That does not mean that HTTP only works with the _LL APIs. | ||
Simply changing the using the convenience layer (functions not having _LL) | ||
and removing calls to _DoWork will yield the same results. */ | ||
|
||
#ifdef ARDUINO | ||
#include "AzureIoTHub.h" | ||
#else | ||
#include "azure_c_shared_utility/threadapi.h" | ||
#include "azure_c_shared_utility/platform.h" | ||
#include "serializer.h" | ||
#include "iothub_client_ll.h" | ||
#include "iothubtransporthttp.h" | ||
#endif | ||
|
||
#ifdef MBED_BUILD_TIMESTAMP | ||
#include "certs.h" | ||
#endif // MBED_BUILD_TIMESTAMP | ||
|
||
/*String containing Hostname, Device Id & Device Key in the format: */ | ||
/* "HostName=<host_name>;DeviceId=<device_id>;SharedAccessKey=<device_key>" */ | ||
static const char* connectionString = "[device connection string]"; | ||
|
||
// Define the Model | ||
BEGIN_NAMESPACE(WeatherStation); | ||
|
||
DECLARE_MODEL(ContosoAnemometer, | ||
WITH_DATA(ascii_char_ptr, DeviceId), | ||
WITH_DATA(int, WindSpeed), | ||
WITH_DATA(float, Temperature), | ||
WITH_DATA(float, Humidity), | ||
WITH_ACTION(TurnFanOn), | ||
WITH_ACTION(TurnFanOff), | ||
WITH_ACTION(SetAirResistance, int, Position) | ||
); | ||
|
||
END_NAMESPACE(WeatherStation); | ||
|
||
static char propText[1024]; | ||
|
||
EXECUTE_COMMAND_RESULT TurnFanOn(ContosoAnemometer* device) | ||
{ | ||
(void)device; | ||
(void)printf("Turning fan on.\r\n"); | ||
return EXECUTE_COMMAND_SUCCESS; | ||
} | ||
|
||
EXECUTE_COMMAND_RESULT TurnFanOff(ContosoAnemometer* device) | ||
{ | ||
(void)device; | ||
(void)printf("Turning fan off.\r\n"); | ||
return EXECUTE_COMMAND_SUCCESS; | ||
} | ||
|
||
EXECUTE_COMMAND_RESULT SetAirResistance(ContosoAnemometer* device, int Position) | ||
{ | ||
(void)device; | ||
(void)printf("Setting Air Resistance Position to %d.\r\n", Position); | ||
return EXECUTE_COMMAND_SUCCESS; | ||
} | ||
|
||
void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback) | ||
{ | ||
unsigned int messageTrackingId = (unsigned int)(uintptr_t)userContextCallback; | ||
|
||
(void)printf("Message Id: %u Received.\r\n", messageTrackingId); | ||
|
||
(void)printf("Result Call Back Called! Result is: %s \r\n", ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result)); | ||
} | ||
|
||
static void sendMessage(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, const unsigned char* buffer, size_t size) | ||
{ | ||
static unsigned int messageTrackingId; | ||
IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(buffer, size); | ||
if (messageHandle == NULL) | ||
{ | ||
printf("unable to create a new IoTHubMessage\r\n"); | ||
} | ||
else | ||
{ | ||
if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)(uintptr_t)messageTrackingId) != IOTHUB_CLIENT_OK) | ||
{ | ||
printf("failed to hand over the message to IoTHubClient"); | ||
} | ||
else | ||
{ | ||
printf("IoTHubClient accepted the message for delivery\r\n"); | ||
} | ||
IoTHubMessage_Destroy(messageHandle); | ||
} | ||
free((void*)buffer); | ||
messageTrackingId++; | ||
} | ||
|
||
/*this function "links" IoTHub to the serialization library*/ | ||
static IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubMessage(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback) | ||
{ | ||
IOTHUBMESSAGE_DISPOSITION_RESULT result; | ||
const unsigned char* buffer; | ||
size_t size; | ||
if (IoTHubMessage_GetByteArray(message, &buffer, &size) != IOTHUB_MESSAGE_OK) | ||
{ | ||
printf("unable to IoTHubMessage_GetByteArray\r\n"); | ||
result = IOTHUBMESSAGE_ABANDONED; | ||
} | ||
else | ||
{ | ||
/*buffer is not zero terminated*/ | ||
char* temp = malloc(size + 1); | ||
if (temp == NULL) | ||
{ | ||
printf("failed to malloc\r\n"); | ||
result = IOTHUBMESSAGE_ABANDONED; | ||
} | ||
else | ||
{ | ||
EXECUTE_COMMAND_RESULT executeCommandResult; | ||
|
||
(void)memcpy(temp, buffer, size); | ||
temp[size] = '\0'; | ||
executeCommandResult = EXECUTE_COMMAND(userContextCallback, temp); | ||
result = | ||
(executeCommandResult == EXECUTE_COMMAND_ERROR) ? IOTHUBMESSAGE_ABANDONED : | ||
(executeCommandResult == EXECUTE_COMMAND_SUCCESS) ? IOTHUBMESSAGE_ACCEPTED : | ||
IOTHUBMESSAGE_REJECTED; | ||
free(temp); | ||
} | ||
} | ||
return result; | ||
} | ||
|
||
void simplesample_http_run(void) | ||
{ | ||
if (platform_init() != 0) | ||
{ | ||
printf("Failed to initialize the platform.\r\n"); | ||
} | ||
else | ||
{ | ||
if (serializer_init(NULL) != SERIALIZER_OK) | ||
{ | ||
(void)printf("Failed on serializer_init\r\n"); | ||
} | ||
else | ||
{ | ||
IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, HTTP_Protocol); | ||
int avgWindSpeed = 10; | ||
float minTemperature = 20.0; | ||
float minHumidity = 60.0; | ||
|
||
srand((unsigned int)time(NULL)); | ||
|
||
if (iotHubClientHandle == NULL) | ||
{ | ||
(void)printf("Failed on IoTHubClient_LL_Create\r\n"); | ||
} | ||
else | ||
{ | ||
// 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; | ||
ContosoAnemometer* myWeather; | ||
|
||
if (IoTHubClient_LL_SetOption(iotHubClientHandle, "MinimumPollingTime", &minimumPollingTime) != IOTHUB_CLIENT_OK) | ||
{ | ||
printf("failure to set option \"MinimumPollingTime\"\r\n"); | ||
} | ||
|
||
#ifdef MBED_BUILD_TIMESTAMP | ||
// For mbed add the certificate information | ||
if (IoTHubClient_LL_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK) | ||
{ | ||
(void)printf("failure to set option \"TrustedCerts\"\r\n"); | ||
} | ||
#endif // MBED_BUILD_TIMESTAMP | ||
|
||
myWeather = CREATE_MODEL_INSTANCE(WeatherStation, ContosoAnemometer); | ||
if (myWeather == NULL) | ||
{ | ||
(void)printf("Failed on CREATE_MODEL_INSTANCE\r\n"); | ||
} | ||
else | ||
{ | ||
if (IoTHubClient_LL_SetMessageCallback(iotHubClientHandle, IoTHubMessage, myWeather) != IOTHUB_CLIENT_OK) | ||
{ | ||
printf("unable to IoTHubClient_SetMessageCallback\r\n"); | ||
} | ||
else | ||
{ | ||
myWeather->DeviceId = "myFirstDevice"; | ||
myWeather->WindSpeed = avgWindSpeed + (rand() % 4 + 2); | ||
myWeather->Temperature = minTemperature + (rand() % 10); | ||
myWeather->Humidity = minHumidity + (rand() % 20); | ||
{ | ||
unsigned char* destination; | ||
size_t destinationSize; | ||
if (SERIALIZE(&destination, &destinationSize, myWeather->DeviceId, myWeather->WindSpeed, myWeather->Temperature, myWeather->Humidity) != CODEFIRST_OK) | ||
{ | ||
(void)printf("Failed to serialize\r\n"); | ||
} | ||
else | ||
{ | ||
IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray(destination, destinationSize); | ||
if (messageHandle == NULL) | ||
{ | ||
printf("unable to create a new IoTHubMessage\r\n"); | ||
} | ||
else | ||
{ | ||
MAP_HANDLE propMap = IoTHubMessage_Properties(messageHandle); | ||
(void)sprintf_s(propText, sizeof(propText), myWeather->Temperature > 28 ? "true" : "false"); | ||
if (Map_AddOrUpdate(propMap, "temperatureAlert", propText) != MAP_OK) | ||
{ | ||
printf("ERROR: Map_AddOrUpdate Failed!\r\n"); | ||
} | ||
|
||
if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, (void*)1) != IOTHUB_CLIENT_OK) | ||
{ | ||
printf("failed to hand over the message to IoTHubClient"); | ||
} | ||
else | ||
{ | ||
printf("IoTHubClient accepted the message for delivery\r\n"); | ||
} | ||
|
||
IoTHubMessage_Destroy(messageHandle); | ||
} | ||
free(destination); | ||
} | ||
} | ||
|
||
/* wait for commands */ | ||
while (1) | ||
{ | ||
IoTHubClient_LL_DoWork(iotHubClientHandle); | ||
ThreadAPI_Sleep(100); | ||
} | ||
} | ||
|
||
DESTROY_MODEL_INSTANCE(myWeather); | ||
} | ||
IoTHubClient_LL_Destroy(iotHubClientHandle); | ||
} | ||
serializer_deinit(); | ||
} | ||
platform_deinit(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// Copyright (c) Microsoft. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#ifndef SIMPLESAMPLEHTTP_H | ||
#define SIMPLESAMPLEHTTP_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
void simplesample_http_run(void); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* SIMPLESAMPLEHTTP_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
name=AzureIoTUtility | ||
version=1.0.36 | ||
version=1.0.39 | ||
author=Microsoft | ||
maintainer=Microsoft <[email protected]> | ||
sentence=Azure C shared utility library for Arduino. For the Arduino MKR1000 or Zero and WiFi Shield 101, Adafruit Huzzah and Feather M0, or SparkFun Thing. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.