Downloading an image from an Izon camera and sending to the EdgeHub for comsumption
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