#include #include #include #include #include #include #include #include #include #include #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; }