diff -r 37e1704fd11f -r 9472106a3143 bmsd/nodes.c --- a/bmsd/nodes.c Wed Jul 06 09:28:41 2022 +0200 +++ b/bmsd/nodes.c Mon Jul 11 15:46:18 2022 +0200 @@ -26,6 +26,7 @@ #include "bms.h" #include "xutil.h" #include "nodes.h" +#include "mqtt.h" #include "mysql.h" #include "websocket.h" @@ -412,4 +413,55 @@ } +void node_ws_receive(char *payload) +{ + struct json_object *jobj, *val; + char *node = NULL, *group = NULL, *control = NULL, *topic = NULL, *pay = NULL, buf[33]; + syslog(LOG_NOTICE, "node_ws %s", payload); + /* + * Process the JSON formatted payload. + */ + jobj = json_tokener_parse(payload); + if (json_object_object_get_ex(jobj, "node", &val)) + node = xstrcpy((char *)json_object_get_string(val)); + if (json_object_object_get_ex(jobj, "group_id", &val)) + group = xstrcpy((char *)json_object_get_string(val)); + if (json_object_object_get_ex(jobj, "control", &val)) + control = xstrcpy((char *)json_object_get_string(val)); + + if (node && group && control) { + + /* + * Prepare MQTT topic + */ + topic = xstrcpy((char *)"mbv1.0/"); + topic = xstrcat(topic, group); + topic = xstrcat(topic, (char *)"/NCMD/"); + topic = xstrcat(topic, node); + + pay = xstrcpy((char *)"{\"timestamp\":"); + snprintf(buf, 32, "%ld", time(NULL)); + pay = xstrcat(pay, buf); + pay = xstrcat(pay, (char *)",\"metric\":"); + + if (strcmp(control, (char *)"reboot") == 0) { + pay = xstrcat(pay, (char *)"{\"Node Control/Reboot\":true}}"); + } else if (strcmp(control, (char *)"rebirth") == 0) { + pay = xstrcat(pay, (char *)"{\"Node Control/Rebirth\":true}}"); + } + syslog(LOG_NOTICE, "%s %s", topic, pay); + mqtt_publish(topic, pay); + } + + if (node) + free(node); + if (group) + free(group); + if (control) + free(control); + if (topic) + free(topic); + if (pay) + free(pay); +}