MQTT обработка топиков
- Войдите на сайт для отправки комментариев
Сб, 13/04/2019 - 12:45
Приветствую. Есть две задекларированных переменных float a и float b. Используются в проекте в качестве set point.
В сетапе:
void setup() {
Serial.begin(115200);
setup_wifi();
//Init MQTT Client
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
Есть рабочий код функции callback:
void callback(char* topic, byte* payload, unsigned int length) {
if(strcmp(topic, "a") != 0) return;
String str_a = String();
for (int i = 0; i < length; i++) {
str_a += (char)payload[i];
}
Serial.println("a=" + str_a);
a = str_a.toFloat();
}По отдельности топики а или b в коде работают, но не могу подружить a и b для совместной работы, что бы в итог был такой:
Serial.println("a=" + str_a);
a = str_a.toFloat();
Serial.println("b=" + str_b);
b = str_b.toFloat();
Ну покажите, как вы их "дружите" - выкладывайте полный код. А мы будем вам пальцами с строчки тыкать, ну в которых вы ошиблись. Или вы как себе помощь представляете ?
sadman41, спасибо!
Добился положительного результата. Добавил условие, т.к. с брокера приходит любой топик, вне зависимости изменил ли я "a" или "b". В моём случае у "a" диапазон 0-30, у "b" - 35-65.
char buffer[length + 1]; memcpy(buffer, payload, length); buffer[length] = '\0'; float c = atof((char*)buffer); if (a <= 29) { a = c; } else { b = c; } Serial.println("MQTT, topic = " + String(c)); Serial.println("var_a = " + String(a)); Serial.println("var_b = " + String(b));В предыдущем коде топики "a" и "b" работают, но завися друг от друга по условию. Кому интересно привожу пример как избавиться от этого.
unsigned int send_interval = 10; void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char*)payload); if (strTopic == "example1/send_interval") { int tmp = strPayload.toInt(); if (tmp == 0) { send_interval = 10; } else { send_interval = strPayload.toInt(); } } if (strTopic == "a") { a = strPayload.toFloat(); } if (strTopic == "b") { b = strPayload.toFloat(); } if (strTopic == "c") { c = strPayload.toFloat(); }Ещё раз спасибо откликнувшимся и давшим удочку вместо рыбы :-)
(strTopic == "a") -> (0 == strcmp(strTopic, "a"))
strPayload.toFloat() -> atof((char*)payload)