MQTT обработка топиков

tsv_33
Offline
Зарегистрирован: 11.04.2019

Приветствую. Есть две задекларированных переменных 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();

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну покажите, как вы их "дружите" - выкладывайте полный код. А мы будем вам пальцами с строчки тыкать, ну в которых вы ошиблись. Или вы как себе помощь представляете ?

sadman41
Offline
Зарегистрирован: 19.10.2016
char buffer[length+1];
memcpy(buffer, payload, length);
buffer[length]='\0';
float a = atof((char*)buffer);

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

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));

 

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

В предыдущем коде топики "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();
  }

Ещё раз спасибо откликнувшимся и давшим удочку вместо рыбы :-)

sadman41
Offline
Зарегистрирован: 19.10.2016

(strTopic == "a") -> (0 == strcmp(strTopic, "a"))

strPayload.toFloat() -> atof((char*)payload)