Инициализация MQTT

workpage
Offline
Зарегистрирован: 17.05.2020

Общий вопрос - как забить адрес mqtt сервера из переменной? НЕ из константы.

Это работает:

const char *MQTT_SERVER ="192.168.21.4";
#define MQTT_PORT 1883
client.setServer(MQTT_SERVER, MQTT_PORT);

Это не работает:

  temp14=(int)mqtt1;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt2;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt3;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt4;
  Serial.print("mqtt address=");
  Serial.println(temp14);
  unsigned char* buf = new unsigned char[32];
  temp14.getBytes(buf, 32, 0);
  const char *MQTT_SERVER = (const char*)buf;
  client.setServer(MQTT_SERVER, MQTT_PORT);

Причём во всех остальных конструкциях с константами всё работает. А вот с IP MQTT сервера споткнулся. Оба варианта компилируются, естественно. Но во втором случае коннекта нет.

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

char MQTT_SERVER[] ="192.168.21.4";

workpage
Offline
Зарегистрирован: 17.05.2020

sadman41 пишет:

char MQTT_SERVER[] ="192.168.21.4";

Не конектит.

Работает только вот так: (((

const char *MQTT_SERVER ="192.168.21.4";

 

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

Ну хз, должон, судя по кишкам. И так должон.

IPAddress MQTT_SERVER(192,168,21,4);
client.setServer(MQTT_SERVER, MQTT_PORT);

 

workpage
Offline
Зарегистрирован: 17.05.2020

sadman41 пишет:

Ну хз, должон, судя по кишкам. И так должон.

IPAddress MQTT_SERVER(192,168,21,4);
client.setServer(MQTT_SERVER, MQTT_PORT);

 

Да. Заработало.

Спасибо. Плюс вам в карму. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

workpage пишет:

Общий вопрос - как забить адрес mqtt сервера из переменной? НЕ из константы.

Это работает:

const char *MQTT_SERVER ="192.168.21.4";
#define MQTT_PORT 1883
client.setServer(MQTT_SERVER, MQTT_PORT);

Это не работает:

  temp14=(int)mqtt1;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt2;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt3;
  temp14=temp14+".";
  temp14=temp14+(int)mqtt4;
  Serial.print("mqtt address=");
  Serial.println(temp14);
  unsigned char* buf = new unsigned char[32];
  temp14.getBytes(buf, 32, 0);
  const char *MQTT_SERVER = (const char*)buf;
  client.setServer(MQTT_SERVER, MQTT_PORT);

Причём во всех остальных конструкциях с константами всё работает. А вот с IP MQTT сервера споткнулся. Оба варианта компилируются, естественно. Но во втором случае коннекта нет.

Нафига столько извращений с getBytes и т.п.? Достаточно:

String MQTT_SERVER = F("192.168.21.4");
#define MQTT_PORT 1883
client.setServer(MQTT_SERVER.c_str(), MQTT_PORT);

// или собираем по частям, хоть откуда:

MQTT_SERVER  = "192.168."
MQTT_SERVER += "21.4";

client.setServer(MQTT_SERVER.c_str(), MQTT_PORT);

И.... всё.

workpage
Offline
Зарегистрирован: 17.05.2020

Да. c_str() отличное решение. Благодарю.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

workpage пишет:

Да. c_str() отличное решение. Благодарю.

Да, только надо учесть, что переменная, которая содержит адрес сервера - должна быть глобальная, потому что при выходе из области видимости переменная уничтожится и указатель, возвращаемый c_str(), будет указывать уже на мусор.

workpage
Offline
Зарегистрирован: 17.05.2020

DIYMan пишет:

workpage пишет:

Да. c_str() отличное решение. Благодарю.

Да, только надо учесть, что переменная, которая содержит адрес сервера - должна быть глобальная, потому что при выходе из области видимости переменная уничтожится и указатель, возвращаемый c_str(), будет указывать уже на мусор.

Напоролся на эти грабли. Не могу что-то победить.

Слушаем эфир callback

String cmndTopic1; //Глобальная переменная.
cmndTopic1 = "blablabla"; //Определяем топик, который будем слушать. 
client.subscribe(cmndTopic1.c_str()/*cmndTopic2*/); //Это работает, кстати!

void MQTTcallback(char* topic, byte* payload, unsigned int length) 
{
  if (!strcmp(topic, (cmndTopic1.c_str())/*cmndTopic2*/)) //Если cmndTopic2 определён заранее, всё работает.
    {
       if ((char)payload[0] == '1' || ! strncasecmp_P((char *)payload, "on", length)) 
         {
         //Что-то делаем
         }
    }
}

Как сравнить строки?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

strncasecmp_P  сравнивает строки, которые лежат одна в ОЗУ, другая во флэш. У тебя обе строки лежат в ОЗУ, используй strncasecmp(), или поставь F("on")

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

workpage пишет:

Как сравнить строки?

В вашем примере - просто:

if(cmndTopic1 == topic) {
// do 
}

У класса String переопределён оператор ==, который унутре делает strcmp сам.

 

workpage
Offline
Зарегистрирован: 17.05.2020

DIYMan пишет:

workpage пишет:

Как сравнить строки?

В вашем примере - просто:

if(cmndTopic1 == topic) {
// do 
}

У класса String переопределён оператор ==, который унутре делает strcmp сам.

 

Да. Работает. Спасибо.

workpage
Offline
Зарегистрирован: 17.05.2020

DIYMan пишет:

workpage пишет:

Как сравнить строки?

В вашем примере - просто:

if(cmndTopic1 == topic) {
// do 
}

У класса String переопределён оператор ==, который унутре делает strcmp сам.

 

Компилируется, но сравнение нифига не видит. If не пускает.

workpage
Offline
Зарегистрирован: 17.05.2020

topic - локальная переменная типа char (массив)

cmndTopic - глобальная переменная типа String.

Можно конечно циклы крутить, но может есть красивый способ их сравнить?

workpage
Offline
Зарегистрирован: 17.05.2020

Была ошибка при сборке cmndTopic1. Вопрос закрыт.

Всем спасибо за участие.