mg_sonoff/src/mqttHandler.c

80 lines
2.6 KiB
C

#include "mgos.h"
#include "mgos_mqtt.h"
#include "mqttHandler.h"
#include "relayHandler.h"
static bool mqtt_conn_flag = false;
static bool enablePub = false;
static const char *pubTopic = NULL;
static bool enableSub = false;
static const char *subTopic = NULL;
static struct mg_connection *mqttConnection = NULL;
bool mqtt_connected(void) {
return mqtt_conn_flag;
}
//static void pub(struct mg_connection *c, const char *fmt, ...) {
//char msg[200];
//struct json_out jmo = JSON_OUT_BUF(msg, sizeof(msg));
//va_list ap;
//int n;
//va_start(ap, fmt);
//n = json_vprintf(&jmo, fmt, ap);
//va_end(ap);
//mg_mqtt_publish(c, get_cfg()->mqtt.pub, 0, MG_MQTT_QOS(0), msg, n);
//LOG(LL_INFO, ("%s -> %s", get_cfg()->mqtt.pub, msg));
//}
static void mqtt_ev_handler(struct mg_connection *c, int ev, void *p, void *user_data) {
struct mg_mqtt_message *msg = (struct mg_mqtt_message *) p;
mqttConnection = c;
if (ev == MG_EV_MQTT_CONNACK) {
LOG(LL_INFO, ("SonoffApp: MQTT connected: %d", msg->connack_ret_code));
mqtt_conn_flag = true;
//if (get_cfg()->mqtt.pub == NULL) {
//LOG(LL_ERROR, ("Run 'mos config-set mqtt.pub=... '"));
//} else {
//pub(c, "{timestamp:%.3lf, mem_free:%d}", mg_time(), mgos_get_free_heap_size() ); /* post uptime */
//}
// subscribe command topic
(void) subTopic;
} else if (ev == MG_EV_CLOSE) {
mqtt_conn_flag = false;
}
(void) user_data;
(void) c;
}
static void pubMqttStatus(char *event) {
if (!enablePub) return;
if (!mqtt_conn_flag) return;
char msg[255];
snprintf(msg, sizeof(msg),
"{timestamp:%.3lf, event: \"%s\", mem_free:%d, switch: \"%s\"}",
mg_time(),
event,
mgos_get_free_heap_size(),
relay_is_on() ? "true" : "false");
mgos_mqtt_pub(pubTopic, msg, strlen(msg), MG_MQTT_QOS(0), true);
//mg_mqtt_publish(c, get_cfg()->mqtt.pub, 0, MG_MQTT_QOS(0), msg, n);
LOG(LL_DEBUG, ("MQTT pub topic=%s -> %s", pubTopic, msg));
}
void init_mqtt_handler() {
mgos_mqtt_add_global_handler(mqtt_ev_handler, NULL);
pubTopic = mgos_sys_config_get_sonoff_switch_status_pub_topic();
if (pubTopic != NULL) enablePub = true;
subTopic = mgos_sys_config_get_sonoff_command_sub_topic();
if (subTopic != NULL) enableSub = true;
if (pubTopic == NULL) {
LOG(LL_WARN, ("Missing configuration for sonoff.switch_status_pub_topic"));
enablePub = false;
} else {
pubMqttStatus("DeviceInit");
}
LOG(LL_INFO, ("MQTT handler initialized"));
(void) subTopic;
}