Инициализация MQTT
- Войдите на сайт для отправки комментариев
Ср, 20/05/2020 - 19:03
Общий вопрос - как забить адрес 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 сервера споткнулся. Оба варианта компилируются, естественно. Но во втором случае коннекта нет.
charMQTT_SERVER[] ="192.168.21.4";charMQTT_SERVER[] ="192.168.21.4";Не конектит.
Работает только вот так: (((
Ну хз, должон, судя по кишкам. И так должон.
Ну хз, должон, судя по кишкам. И так должон.
Да. Заработало.
Спасибо. Плюс вам в карму.
Общий вопрос - как забить адрес mqtt сервера из переменной? НЕ из константы.
Это работает:
Это не работает:
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);И.... всё.
Да. c_str() отличное решение. Благодарю.
Да. c_str() отличное решение. Благодарю.
Да, только надо учесть, что переменная, которая содержит адрес сервера - должна быть глобальная, потому что при выходе из области видимости переменная уничтожится и указатель, возвращаемый c_str(), будет указывать уже на мусор.
Да. 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)) { //Что-то делаем } } }Как сравнить строки?
strncasecmp_P сравнивает строки, которые лежат одна в ОЗУ, другая во флэш. У тебя обе строки лежат в ОЗУ, используй strncasecmp(), или поставь F("on")
Как сравнить строки?
В вашем примере - просто:
if(cmndTopic1 == topic) { // do }У класса String переопределён оператор ==, который унутре делает strcmp сам.
Как сравнить строки?
В вашем примере - просто:
if(cmndTopic1 == topic) { // do }У класса String переопределён оператор ==, который унутре делает strcmp сам.
Да. Работает. Спасибо.
Как сравнить строки?
В вашем примере - просто:
if(cmndTopic1 == topic) { // do }У класса String переопределён оператор ==, который унутре делает strcmp сам.
Компилируется, но сравнение нифига не видит. If не пускает.
topic - локальная переменная типа char (массив)
cmndTopic - глобальная переменная типа String.
Можно конечно циклы крутить, но может есть красивый способ их сравнить?
Была ошибка при сборке cmndTopic1. Вопрос закрыт.
Всем спасибо за участие.