blob: 155de6c89ff888c73528dacb53fdd5ca1d036c19 [file] [log] [blame]
/*
* Copyright (c) 2017 FH Dortmund and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Description:
* Hono interaction library for Rover
*
* Authors:
* M. Ozcelikors, R.Hottger
* <mozcelikors@gmail.com> <robert.hoettger@fh-dortmund.de>
*
* Usage:
* To test the hono interaction library:
*
* registerDeviceToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", 4771);
* sendEventDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", 4771,"Bearing",0.5);
*
*/
#include "hono_interaction.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//Buffers to work with strings
char buffer[256];
char num_buffer[33];
/**
* Function Name: handleCode
* Description: Handles code that is returned with HTTP response
* Arguments: int code
* Returns: Generates a status value
* If the action completed -> returns 1
* If the action failed -> returns 0
*/
int handleCode(int code)
{
int status = 0;
switch (code)
{
case 200: //Accepted
printf("200 Accepted\n");
printf("Registration of device to Hono instance accepted.\n");
status = 1;
break;
case 201: //Created
printf("201 Created\n");
printf("Registration of device to Hono instance is done.\n");
status = 1;
break;
case 202:
status = 1; //Telemetry data accepted
break;
case 203:
case 204:
case 205:
case 206:
case 207:
case 208:
case 209:
status = 1;
break;
case 400:
fprintf(stderr, ("400 Bad Request\n"));
status = 0;
break;
case 403:
fprintf(stderr, ("403 Forbidden\n"));
status = 0;
break;
case 409:
fprintf(stderr, ("409 Conflict. A device with this ID is registered already. \n"));
status = 0;
break;
case 503:
fprintf(stderr, ("503 Service Unavailable. You may need to create a consumer."));
status = 0;
break;
case 401:
case 402:
case 404:
case 405:
case 406:
case 407:
case 408:
fprintf(stderr, ("Error\n"));
status = 0;
break;
default:
status = 0;
break;
}
return status;
}
/**
* Function Name: registerDeviceToHonoInstance
* Description: Registers a device to Eclipse Hono instance.
* A device should be registered only once.
* Arguments: char * host_name
* int port
* char * tenant_name
* int device_id
* Returns: Successfully returns status data.
* If the action completed -> returns 1
* If the action failed -> returns 0
*/
int registerDeviceToHonoInstance (char * host_name, int port, char * tenant_name, int device_id)
{
FILE *fp;
int code;
int status;
//Prepare command as string
//Example: "curl -X POST -i -d 'device_id=4711' http://localhost:28080/registration/DEFAULT_TENANT"
sprintf(buffer, "curl -X POST -i -d 'device_id=");
snprintf(num_buffer, sizeof(num_buffer), "%d", device_id);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "' http://");
strcat(buffer, host_name);
strcat(buffer, ":");
snprintf(num_buffer, sizeof(num_buffer), "%d", port);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "/registration/");
strcat(buffer, tenant_name);
//To redirect pipe to prevent stdout showing all outputs generated by curl
strcat(buffer, " 2>curl_log"); //2>&1 would redirect to stderr, we choose to redirect to a file to be able to parse returned code
#ifdef DEBUG_DEVICE_REGISTRATION
//Print the command that is created
printf("Command=%s\n",buffer);
#endif
//Execute the command
fp = popen(buffer,"r");
//Get and Parse the output
fgets(buffer, 13, fp); //Get the string HTTP/1.1 XXX
//Prepare the response code
sscanf(buffer, "HTTP/1.1 %d", &code);
#ifdef DEBUG_DEVICE_REGISTRATION
//Print the code
printf("Code=%d\n",code);
//Print the response
printf("Response=%s\n",buffer);
#endif
//Handle the code and return status: 1-succeeded 0-failed
status = handleCode(code);
//Close the file
fclose(fp);
//Return status
return status;
}
/**
* Function Name: sendTelemetryDataToHonoInstance
* Description: Sends telemetry data to a hono instance with given
* host name and port
* Arguments: char * host_name
* int port
* char * tenant_name
* int device_id
* char * field
* double value
* Returns: Successfully returns status data.
* If the action completed -> returns 1
* If the action failed -> returns 0
*/
int sendTelemetryDataToHonoInstance (char * host_name, int port, char * tenant_name, int device_id, char * field, double value)
{
FILE *fp;
int code;
int status;
//Prepare command as string
//Example: "curl -X PUT -i -H 'Content-Type: application/json' --data-binary '{"Bearing": 0.5}' http://idial.institute:8080/telemetry/DEFAULT_TENANT/4711"
sprintf(buffer, "curl -X PUT -i -H 'Content-Type: application/json' --data-binary '{\"");
strcat(buffer, field);
strcat(buffer, "\": ");
snprintf(num_buffer, sizeof(num_buffer), "%f", value);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "}' http://");
strcat(buffer, host_name);
strcat(buffer, ":");
snprintf(num_buffer, sizeof(num_buffer), "%d", port);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "/telemetry/");
strcat(buffer, tenant_name);
strcat(buffer, "/");
snprintf(num_buffer, sizeof(num_buffer), "%d", device_id);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
//To redirect pipe to prevent stdout showing all outputs generated by curl
strcat(buffer, " 2>curl_log"); //2>&1 would redirect to stderr, we choose to redirect to a file to be able to parse returned code
#ifdef DEBUG_HTTP_RESPONSE
//Print the command that is created
printf("Command=%s\n",buffer);
#endif
//Execute the command
fp = popen(buffer,"r");
//Get and Parse the output
fgets(buffer, 13, fp); //Get the string HTTP/1.1 XXX
//Prepare the response code
sscanf(buffer, "HTTP/1.1 %d", &code);
#ifdef DEBUG_HTTP_RESPONSE
//Print the code
printf("Code=%d\n",code);
//Print the response
printf("Response=%s\n",buffer);
#endif
//Handle the code and return status: 1-succeeded 0-failed
status = handleCode(code);
//Close the file
fclose(fp);
//Return status
return status;
}
/**
* Function Name: sendEventDataToHonoInstance
* Description: Sends event data to a hono instance with given
* host name and port
* Arguments: char * host_name
* int port
* char * tenant_name
* int device_id
* char * field
* double value
* Returns: Successfully returns status data.
* If the action completed -> returns 1
* If the action failed -> returns 0
*/
int sendEventDataToHonoInstance (char * host_name, int port, char * tenant_name, int device_id, char * field, double value)
{
FILE *fp;
int code;
int status;
//Prepare command as string
//Example: "curl -X PUT -i -H 'Content-Type: application/json' --data-binary '{"Bearing": 0.5}' http://idial.institute:8080/event/DEFAULT_TENANT/4711"
sprintf(buffer, "curl -X PUT -i -H 'Content-Type: application/json' --data-binary '{\"");
strcat(buffer, field);
strcat(buffer, "\": ");
snprintf(num_buffer, sizeof(num_buffer), "%f", value);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "}' http://");
strcat(buffer, host_name);
strcat(buffer, ":");
snprintf(num_buffer, sizeof(num_buffer), "%d", port);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
strcat(buffer, "/event/");
strcat(buffer, tenant_name);
strcat(buffer, "/");
snprintf(num_buffer, sizeof(num_buffer), "%d", device_id);
strcat(buffer, num_buffer);
num_buffer[0] = 0; //Clear array
//To redirect pipe to prevent stdout showing all outputs generated by curl
strcat(buffer, " 2>curl_log"); //2>&1 would redirect to stderr, we choose to redirect to a file to be able to parse returned code
#ifdef DEBUG_HTTP_RESPONSE
//Print the command that is created
printf("Command=%s\n",buffer);
#endif
//Execute the command
fp = popen(buffer,"r");
//Get and Parse the output
fgets(buffer, 13, fp); //Get the string HTTP/1.1 XXX
//Prepare the response code XXX
sscanf(buffer, "HTTP/1.1 %d", &code);
#ifdef DEBUG_HTTP_RESPONSE
//Print the code
printf("Code=%d\n",code);
//Print the response
printf("Response=%s\n",buffer);
#endif
//Handle the code and return status: 1-succeeded 0-failed
status = handleCode(code);
//Close the file
fclose(fp);
//Return status
return status;
}