85 lines
2.6 KiB
C
85 lines
2.6 KiB
C
#include "mgos.h"
|
|
#include "mgos_mqtt.h"
|
|
#include "mgos_config.h"
|
|
#include "mqtt.h"
|
|
#include "buttons.h"
|
|
#include "relays.h"
|
|
#include "helper.h"
|
|
|
|
static void mqtt_publish_broadcast_stat(const char *stat, const char *msg) {
|
|
char topic[80];
|
|
snprintf(topic, sizeof(topic)-1, "%s/%s", MQTT_TOPIC_BROADCAST_STAT, stat);
|
|
mgos_mqtt_pub((char*)topic, (char*)msg, strlen(msg), 0, false);
|
|
LOG(LL_INFO, ("Sent topic='%s' msg='%s'", topic, msg));
|
|
}
|
|
|
|
static void mqtt_broadcast_cmd_id() {
|
|
char resp[300];
|
|
struct mgos_net_ip_info ip_info;
|
|
char sta_ip[16], ap_ip[16];
|
|
|
|
memset(sta_ip, 0, sizeof(sta_ip));
|
|
memset(ap_ip, 0, sizeof(ap_ip));
|
|
|
|
if (mgos_net_get_ip_info(MGOS_NET_IF_TYPE_WIFI, MGOS_NET_IF_WIFI_STA, &ip_info))
|
|
mgos_net_ip_to_str(&ip_info.ip, sta_ip);
|
|
if (mgos_net_get_ip_info(MGOS_NET_IF_TYPE_WIFI, MGOS_NET_IF_WIFI_AP, &ip_info))
|
|
mgos_net_ip_to_str(&ip_info.ip, ap_ip);
|
|
|
|
snprintf(resp, sizeof(resp)-1, "{\"deviceid\": \"%s\", \"macaddress\": \"%s\", \"sta_ip\": \"%s\", \"ap_ip\": \"%s\", \"app\": \"%s\", \"arch\": \"%s\", \"uptime\": %lu}",
|
|
mgos_sys_config_get_device_id(),
|
|
mgos_sys_ro_vars_get_mac_address(),
|
|
sta_ip,
|
|
ap_ip,
|
|
MGOS_APP,
|
|
mgos_sys_ro_vars_get_arch(), (unsigned long) mgos_uptime());
|
|
|
|
mqtt_publish_broadcast_stat("id", resp);
|
|
}
|
|
|
|
static void mqtt_cb(struct mg_connection *nc, const char *topic, int topic_len, const char *msg, int msg_len, void *ud) {
|
|
LOG(LL_INFO, ("Received topic='%.*s' msg='%.*s'", topic_len, topic, msg_len, msg));
|
|
|
|
if (topic_len >= (int) strlen(MQTT_TOPIC_BROADCAST_CMD) && 0 == strncmp(MQTT_TOPIC_BROADCAST_CMD, topic, strlen(MQTT_TOPIC_BROADCAST_CMD)))
|
|
mqtt_broadcast_cmd_id();
|
|
(void) nc;
|
|
(void) ud;
|
|
}
|
|
|
|
static void mqtt_ev(struct mg_connection *nc, int ev, void *ev_data, void *user_data) {
|
|
switch (ev) {
|
|
case MG_EV_MQTT_CONNACK:
|
|
mqtt_broadcast_cmd_id();
|
|
break;
|
|
}
|
|
(void) nc;
|
|
(void) ev_data;
|
|
(void) user_data;
|
|
}
|
|
|
|
|
|
void mqtt_publish_stat(const char *stat, const char *msg) {
|
|
char topic[80];
|
|
snprintf(topic, sizeof(topic)-1, "%s%s/stat/%s", MQTT_TOPIC_PREFIX, mgos_sys_config_get_device_id(), stat);
|
|
mgos_mqtt_pub((char*)topic, (char*)msg, strlen(msg), 0, false);
|
|
LOG(LL_INFO, ("Sent topic='%s' msg='%s'", topic, msg));
|
|
}
|
|
|
|
void mqtt_init() {
|
|
char topic[100];
|
|
|
|
mgos_mqtt_add_global_handler(mqtt_ev, NULL);
|
|
|
|
// Subscribe to broadcast for identification purposes
|
|
mgos_mqtt_sub(MQTT_TOPIC_BROADCAST_CMD, mqtt_cb, NULL);
|
|
|
|
// Subscribe to broadcast/appname
|
|
snprintf(topic, sizeof(topic)-1, "%s/%s", MQTT_TOPIC_BROADCAST_CMD, MGOS_APP);
|
|
mgos_mqtt_sub(topic, mqtt_cb, NULL);
|
|
|
|
// Subscribe to Sonoff updates
|
|
mgos_mqtt_sub("/s/#", mqtt_cb, NULL);
|
|
|
|
return;
|
|
}
|