ioc-invicta/db_feeder/main.c

103 lines
2.6 KiB
C
Raw Normal View History

2023-11-19 13:03:35 +01:00
#include <err.h>
#include <errno.h>
#include <mosquitto.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sqlite3.h>
#include <unistd.h>
#include "db.h"
#include "msg.h"
#include "serialization.h"
#define BRI "brightness"
#define BTN "button"
#define HOST "localhost"
#define PORT 1883
#define USERNAME "user"
#define PASSWD "test"
sem_t lock;
struct mosquitto *mosq = NULL;
sqlite3 *db = NULL;
void mosquitto_server_callback(__attribute__((unused)) struct mosquitto *mosq,
__attribute__((unused)) void *obj,
const struct mosquitto_message *message)
{
struct brightness_msg br_msg;
struct button_msg btn_msg;
unsigned char buf[message->payloadlen];
memcpy(buf, message->payload, message->payloadlen);
if (strcmp(message->topic, BRI) == 0) {
bzero(&br_msg, sizeof(struct brightness_msg));
if (unmarshal_brightness_msg((char *)buf, &br_msg) < 0)
return;
printf("BRI: %s %d\n", br_msg.id, br_msg.val);
insert_data(br_msg.id, BRI, br_msg.val);
} else if (strcmp(message->topic, BTN) == 0) {
bzero(&btn_msg, sizeof(struct button_msg));
if (unmarshal_button_msg((char *)buf, &btn_msg) < 0)
return;
printf("BTN: %s\n", btn_msg.id);
insert_data(btn_msg.id, BTN, 1);
}
}
void clean_server(void)
{
if (mosq != NULL)
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
clean_db(db);
}
void sigint_handler(__attribute__((unused)) int num)
{
sem_post(&lock);
}
int main(void)
{
struct sigaction sa;
if (mosquitto_lib_init() != MOSQ_ERR_SUCCESS)
errx(EXIT_FAILURE, "libmosquitto failed to initialize");
atexit(clean_server);
init_db(&db);
if (!(mosq = mosquitto_new(NULL, true, NULL)))
errx(EXIT_FAILURE, "mosquitto_new: %s", strerror(errno));
mosquitto_username_pw_set(mosq, USERNAME, PASSWD);
mosquitto_message_callback_set(mosq, mosquitto_server_callback);
sa.sa_handler = sigint_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGINT, &sa, NULL);
if (mosquitto_connect(mosq, HOST, 1883, 5) != MOSQ_ERR_SUCCESS)
errx(EXIT_FAILURE, "mosquitto_connect: %s:%d %s", HOST, PORT, strerror(errno));
if (mosquitto_subscribe(mosq, NULL, BRI, 0) != MOSQ_ERR_SUCCESS)
errx(EXIT_FAILURE, "mosquitto_subscribe: %s %s", BRI, strerror(errno));
if (mosquitto_subscribe(mosq, NULL, BTN, 0) != MOSQ_ERR_SUCCESS)
errx(EXIT_FAILURE, "mosquitto_subscribe: %s %s", BTN, strerror(errno));
mosquitto_loop_start(mosq);
sem_wait(&lock);
if (mosquitto_disconnect(mosq) != MOSQ_ERR_SUCCESS)
warnx("mosquitto_disconnect: %s:%d already disconnected", HOST, PORT);
return 0;
}