Last active
January 16, 2019 11:41
-
-
Save QiMata/65ffd38af4a6a3625f811ca3065f1493 to your computer and use it in GitHub Desktop.
Downloading an image from an Izon camera and sending to the EdgeHub for comsumption
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
struct MemoryStruct { | |
char *memory; | |
size_t size; | |
}; | |
static size_t | |
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) | |
{ | |
size_t realsize = size * nmemb; | |
struct MemoryStruct *mem = (struct MemoryStruct *)userp; | |
char *ptr = realloc(mem->memory, mem->size + realsize + 1); | |
if(ptr == NULL) { | |
/* out of memory! */ | |
printf("not enough memory (realloc returned NULL)\n"); | |
return 0; | |
} | |
mem->memory = ptr; | |
memcpy(&(mem->memory[mem->size]), contents, realsize); | |
mem->size += realsize; | |
mem->memory[mem->size] = 0; | |
return realsize; | |
} | |
struct MemoryStruct download_file(const char * address) | |
{ | |
struct MemoryStruct chunk; | |
chunk.memory = malloc(1); /* will be grown as needed by the realloc above */ | |
chunk.size = 0; /* no data at this point */ | |
/* init the curl session */ | |
CURL * curl_handle = curl_easy_init(); | |
/* specify URL to get */ | |
curl_easy_setopt(curl_handle, CURLOPT_URL, address); | |
/* send all data to this function */ | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); | |
/* we pass our 'chunk' struct to the callback function */ | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); | |
/* some servers don't like requests that are made without a user-agent | |
field, so we provide one */ | |
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); | |
/* get it! */ | |
CURLcode res = curl_easy_perform(curl_handle); | |
/* check for errors */ | |
if(res != CURLE_OK) { | |
fprintf(stderr, "curl_easy_perform() failed: %s\n", | |
curl_easy_strerror(res)); | |
} | |
/* cleanup curl stuff */ | |
curl_easy_cleanup(curl_handle); | |
return chunk; | |
} | |
void download_image(IOTHUB_MODULE_CLIENT_LL_HANDLE iotHubModuleClientHandle) | |
{ | |
ip_address_node * address_node = root_node; | |
do | |
{ | |
struct MemoryStruct image = download_file(address_node->address); | |
if (image.size > 1) | |
{ | |
IOTHUB_MESSAGE_HANDLE message_handle = IoTHubMessage_CreateFromByteArray((char*)image.memory, image.size); | |
MAP_HANDLE propMap = IoTHubMessage_Properties(message_handle); | |
Map_AddOrUpdate(propMap, "IpAddress", address_node->address); | |
IOTHUB_CLIENT_RESULT clientResult = IoTHubModuleClient_LL_SendEventToOutputAsync(iotHubModuleClientHandle, message_handle, "IncomingImage", NULL,NULL); | |
if (clientResult != IOTHUB_CLIENT_OK) | |
{ | |
IoTHubMessage_Destroy(message_handle); | |
printf("IoTHubModuleClient_LL_SendEventToOutputAsync failed on sending to output IncomingImage, err=%d\n", clientResult); | |
} | |
} | |
free(image.memory); | |
address_node = address_node->next; | |
} while(address_node != NULL); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment