add: status for mqtt
fix: refactor connection handlers
This commit is contained in:
parent
2bc11ee829
commit
6c6e5023da
19 changed files with 534 additions and 183 deletions
src/handlers
95
src/handlers/mqtt.c
Normal file
95
src/handlers/mqtt.c
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <mongoose.h>
|
||||
#include <logger.h>
|
||||
#include <handlers.h>
|
||||
#include <status.h>
|
||||
#include <models/controller.h>
|
||||
#include <models/relay.h>
|
||||
|
||||
static void
|
||||
handle_mqtt_publish_controller(char **topic_save, int controller_id, char *payload)
|
||||
{
|
||||
(void)controller_id;
|
||||
(void)payload;
|
||||
char *topic_token = strtok_r(NULL, "/", topic_save);
|
||||
if(!topic_token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if(strcmp(topic_token, "relay") == 0)
|
||||
{
|
||||
char *relay_num_str = strtok_r(NULL, "/", topic_save);
|
||||
if(!relay_num_str)
|
||||
{
|
||||
return;
|
||||
}
|
||||
errno = 0;
|
||||
int relay_num = strtol(relay_num_str, NULL, 10);
|
||||
if(errno)
|
||||
{
|
||||
return;
|
||||
}
|
||||
relay_t *relay = relay_get_for_controller(controller_id, relay_num);
|
||||
if(!relay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
status_update_entry(relay->id, payload[0] == '1');
|
||||
free(relay);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
handle_mqtt_publish(struct mg_mqtt_message *msg)
|
||||
{
|
||||
char *topic = malloc(sizeof(char) * (msg->topic.len + 1));
|
||||
strncpy(topic, msg->topic.p, msg->topic.len);
|
||||
topic[msg->topic.len] = '\0';
|
||||
LOG_DEBUG("received mqtt publish for topic %s\n", topic);
|
||||
|
||||
char *payload = malloc(sizeof(char) * (msg->payload.len + 1));
|
||||
strncpy(payload, msg->payload.p, msg->payload.len);
|
||||
payload[msg->payload.len] = '\0';
|
||||
|
||||
char *topic_save_null = NULL;
|
||||
char **topic_save = &topic_save_null;
|
||||
char *topic_token = strtok_r(topic, "/", topic_save);
|
||||
if(topic_token)
|
||||
{
|
||||
if(strcmp(topic_token, "controller") == 0)
|
||||
{
|
||||
char *controller_uid_str = strtok_r(NULL, "/", topic_save);
|
||||
uuid_t controller_uid;
|
||||
if(uuid_parse(controller_uid_str, controller_uid) == 0)
|
||||
{
|
||||
controller_t *controller = controller_get_by_uid(controller_uid);
|
||||
if(controller)
|
||||
{
|
||||
handle_mqtt_publish_controller(topic_save, controller->id, payload);
|
||||
controller_free(controller);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(payload);
|
||||
free(topic);
|
||||
}
|
||||
|
||||
void
|
||||
handler_mqtt(struct mg_connection *nc, int ev, void *p)
|
||||
{
|
||||
if(ev == MG_EV_POLL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mg_mqtt_broker(nc, ev, p);
|
||||
if(ev == MG_EV_MQTT_PUBLISH)
|
||||
{
|
||||
struct mg_mqtt_message *msg = (struct mg_mqtt_message*)p;
|
||||
handle_mqtt_publish(msg);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue