Last active
January 1, 2019 16:54
-
-
Save QiMata/2484bd3962606e2fb81e7579705a081e to your computer and use it in GitHub Desktop.
An example of updating a list of IP addresses with Azure IoT Edge Module Twin
This file contains hidden or 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
#include <stdio.h> | |
#include <stdlib.h> | |
#include "iothub_module_client_ll.h" | |
#include "iothub_client_options.h" | |
#include "iothub_message.h" | |
#include "azure_c_shared_utility/threadapi.h" | |
#include "azure_c_shared_utility/crt_abstractions.h" | |
#include "azure_c_shared_utility/platform.h" | |
#include "azure_c_shared_utility/shared_util_options.h" | |
#include "iothubtransportmqtt.h" | |
#include "iothub.h" | |
#include "time.h" | |
#include "parson.h" | |
typedef struct IP_ADDRESS_NODE | |
{ | |
const char * address; | |
struct IP_ADDRESS_NODE * next; | |
} ip_address_node; | |
ip_address_node * add_address(const char * address,ip_address_node * previous) | |
{ | |
ip_address_node * new_node = (ip_address_node *)malloc(sizeof(ip_address_node)); | |
new_node->address = address; | |
new_node->next = NULL; | |
if (previous == NULL) | |
{ | |
return new_node; | |
} | |
previous->next = new_node; | |
return previous; | |
} | |
void delete_address(ip_address_node * current) | |
{ | |
if (current == NULL) | |
{ | |
return; | |
} | |
delete_address(current->next); | |
//free(current->address); | |
free(current); | |
} | |
ip_address_node * root_node = NULL; | |
ip_address_node * add_address_to_root(const char * address) | |
{ | |
if (root_node = NULL) | |
{ | |
root_node = add_address(address,root_node); | |
} | |
ip_address_node * current = root_node; | |
while(current->next != NULL) | |
{ | |
current = current->next; | |
} | |
add_address(address,current); | |
} | |
static void moduleTwinCallback(DEVICE_TWIN_UPDATE_STATE update_state, const unsigned char* payLoad, size_t size, void* userContextCallback) | |
{ | |
printf("\r\nTwin callback called with (state=%s, size=%zu):\r\n%s\r\n", | |
ENUM_TO_STRING(DEVICE_TWIN_UPDATE_STATE, update_state), size, payLoad); | |
JSON_Value *root_value = json_parse_string(payLoad); | |
JSON_Object *root_object = json_value_get_object(root_value); | |
JSON_Array * ipaddresses = json_object_dotget_array(root_object, "desired.CameraAddresses"); | |
if (ipaddresses != NULL) { | |
delete_address(root_node); | |
for (int i = 0; i < json_array_get_count(ipaddresses); i++) { | |
add_address_to_root(json_array_get_string(ipaddresses,i)); | |
} | |
return; | |
} | |
ipaddresses = json_object_get_array(root_object, "CameraAddresses"); | |
if (ipaddresses != NULL) { | |
delete_address(root_node); | |
for (int i = 0; i < json_array_get_count(ipaddresses); i++) { | |
add_address_to_root(json_array_get_string(ipaddresses,i)); | |
} | |
return; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment