diff --git a/src/widget_default.c b/src/widget_default.c index 56cc33b..1ed1ed2 100644 --- a/src/widget_default.c +++ b/src/widget_default.c @@ -124,30 +124,23 @@ static void widget_default_mqtt_send(struct widget_t *w, void *ev_data) { // LOG(LL_DEBUG, ("MQTT string: '%s'", (char *)w->user_data)); // Traverse Array for (idx = 0; json_scanf_array_elem(w->user_data, strlen(w->user_data), "", idx, &val) > 0; idx++) { - char *t=NULL, *m=NULL; - uint16_t t_len=0, m_len=0; - char *topic; + char *topic, *message; LOG(LL_DEBUG, ("Index %d, token [%.*s]", idx, val.len, val.ptr)); - t=(char*)val.ptr; - m=strstr(val.ptr, " "); - if (m-val.ptr <= val.len) { - t_len=m-t; - m++; - m_len=val.len-t_len-1; - } else { - t_len=val.len; - m_len=0; - m=NULL; + if (val.len==0) { + LOG(LL_ERROR, ("mqtt element %d is empty token", idx)); + continue; } - if ((topic=malloc(t_len+1))) { - memcpy(topic, t, t_len); - topic[t_len]=0; - LOG(LL_INFO, ("Sending topic='%s', message='%.*s'", topic, m_len, m)); - mgos_mqtt_pub(topic, m, m_len, 0, false); - free(topic); - widget_network_send(); + if (json_scanf(val.ptr, val.len, "{topic:%Q, message:%Q}", &topic, &message) != 2) { + LOG(LL_ERROR, ("mqtt element %d ('%.*s'), required fields 'topic' and 'message'", idx, val.len, val.ptr)); + continue; } + LOG(LL_INFO, ("Sending topic='%s', message='%s'", topic, message)); + mgos_mqtt_pub(topic, message, strlen(message), 0, false); + widget_network_send(); + + if (topic) free(topic); + if (message) free(message); } (void) ev_data; }