• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Проблемы подключения к mqtt брокеру.

krepton85

Member
Вот собственно написал скетч (собрал с миру по нитке):


MQTT_RF_PIR_LUSTRA.rar
Извиняйте что выложил скетч не так как положено, но он длинный, а форум не позволяет почему то писать сообщения свыше 1000 символов.:(
Суть проблемы такова, если вбить статично в скетч параметры MQTT сервер, порт, логин, пароль mqtt то все отлично подключается к брокеру MQTT если же использовать настраиваемые эти параметры, заполняя через web форму по адресу сервера, который создаетс esp 8266 в режиме Wi-fi клиента или точки доступа, то вроде как параметры обратно после перезагрузки восстанавливаются правильно (в сериал порт выводятся те же что при заполнении web формы), но вот почему то подключатся не хочет к mqtt.
2 вопрос как преоброзовать тип переменной char* в int для восстановления порта для mqtt , брокера.
Для тэста используйте эту : pubsubclient_удлиннитель.rar библиотеку pubsubclient, со стандартной скетч не соберется!!!
 

Юрий Ботов

Moderator
Команда форума
видимо потому что CONST char* это неизменяемый указатель.
присваивать его бесполезно. Единственный способ использовать его динамически это:
- при создании присвоить ему пустой массив байтов
- при изменении записать данные в этот массив байтов, не трогая указатель, не забыв в конце нуль-символ.
 

krepton85

Member
видимо потому что CONST char* это неизменяемый указатель.
присваивать его бесполезно. Единственный способ использовать его динамически это:
- при создании присвоить ему пустой массив байтов
- при изменении записать данные в этот массив байтов, не трогая указатель, не забыв в конце нуль-символ.
Все равно ни чего не понял, покажите на примере пожалуйста. Ведь изначально даже статично если прописать все данные в скетч то они точно такие же типы и указатели переменной имеют
Код:
const char *mqtt_server = "m12.cloudmqtt.com"; // Имя сервера MQTT
const int mqtt_port = 12355; // Порт для подключения к серверу MQTT
const char *mqtt_user = "_____________"; // Логин от сервер
const char *mqtt_pass = "_____________"; // Пароль от сервера
и все четко с ними подключается, но почему не подключается после восстановления тех же данных из eeprom в те же типы переменных, не понятно (я только порт статично прописал пока в скетч, остальное из EEPROM).
 

Юрий Ботов

Moderator
Команда форума
// объявление
const char mqqt_x[20];
// присваиавние
strcpy(mqqt_x,какятострокакороче19символов);
 

krepton85

Member
// объявление
const char mqqt_x[20];
// присваиавние
strcpy(mqqt_x,какятострокакороче19символов);
Вот вроде так сделал
Код:
char* buf_mqtt_server = new char[25];
  char* buf_mqtt_port = new char[6];
  char* buf_mqtt_user = new char[32];
  char* buf_mqtt_pass = new char[32];
 
const int  mqtt_port = 12355;

const char* mqtt_server[25];
strcpy (char* mqqt_server, char* buf_mqtt_server);
const char* mqtt_port_s[6];
strcpy (char* mqtt_port_s, char* buf_mqtt_port);

const char* mqtt_user[32];
strcpy (char* mqtt_user, char* buf_mqtt_user);
const char* mqtt_pass[32];
strcpy (char* mqtt_pass,  char* buf_mqtt_pass); // здесь ошибка
В итоге компилятор выдает ошибку: " expected constructor, destructor, or type conversion before ';' token ".
 

krepton85

Member
1. H-файл вверху подключили для strcpy?
2. - это не вызов функции а ее определение. Вызов будет: strcpy(mqtt_pass,buf_mqtt_pass);
Создал файл string.h, подключил его, прописал в нем следующее :
Код:
#ifndef string_h
#define string_h
char *strcpy (char *mqtt_server, const char *buf_mqtt_server);
char *strcpy (char *mqtt_port_s, const char *buf_mqtt_port);
char *strcpy (char *mqtt_user, const char *buf_mqtt_user);
char *strcpy (char *mqtt_pass, const char *buf_mqtt_pass);
#endif
и все равно ошибка: expected constructor, destructor, or type conversion before '(' token
strcpy - это не Ардуино это C++ , хотя Arduino IDE всеядная. Но С++ для меня это сложно.
 

Юрий Ботов

Moderator
Команда форума
не поняли...

вверху файла должен быть [HASHTAG]#include[/HASHTAG]<string.h>, сам он и так есть не надо его создавать.

Потом надо создать пустые массивы.

  • char* buf_mqtt_server = new char[25];
  • char* buf_mqtt_port = new char[6];
  • char* buf_mqtt_user = new char[32];
  • char* buf_mqtt_pass = new char[32];
А внутри программы, когда уже есть то что нужно записать в эти массивы его туда записать с помощью strcpy

main или другая подпрограмма...
...

sprcpy(buf_mqtt_server,значение)
...
 

krepton85

Member
не поняли...

вверху файла должен быть [HASHTAG]#include[/HASHTAG]<string.h>, сам он и так есть не надо его создавать.

Потом надо создать пустые массивы.



А внутри программы, когда уже есть то что нужно записать в эти массивы его туда записать с помощью strcpy

main или другая подпрограмма...
...

sprcpy(buf_mqtt_server,значение)
...
Кажись понял, одна переменная строка у меня сдесь лишняя. Изначально было созданно копирование из одной строки в др. Сейчас создаем пустой массив (строку) которую сразу же заполняем побайтно из eeprom, я правильно понял? Ладно завтра папробую, сегодня уже выключил комп.
 

krepton85

Member
Ну как то так...
Пиши если что
не получается так, во первых побайтово с помощью strcpy заполнить массив из ячеек eeprom не выходит, а во вторых библиотеке не нравится как инициализирован массив char buf_mqtt_server[25], а для strcpy нужно точно задать объем массива.
Но, я практически сделал тоже самое при помощит объекта класса String:
Код:
String mqtt_server = "                          "; // создаем буфер заданной максимальной длинны (пробелами длину)
это вначале в самом верху
В void setap:
Код:
for (byte i = 0; i < len_mqtt_server; i++)mqtt_server.setCharAt(i, EEPROM.read(i+201)); //заполняем созданный пробелами буфер из ячеек EEprom
    delay(10);
   //mqtt_server += '\0'; //можно добавить в конце символ ноль окончания строки, пробовал и так и так.
   mqtt_server.trim(); // обрезаем лишние пробелы оставшиеся от не полностью заполненного буфера
В итоге получил тоже самое - все восстанавливается из eeprom верно, но подключатся не хочет почему то. Мистика какая та.

Я кажись понял в чем дело: есть такая строка - PubSubClient client(wclient, mqtt_server, mqtt_port); так вот она находится выше, чем идет восстановление данных из EEprom, в самом начале, а нужно после, пробовал перенести ее ниже в void setap но тогда в void loop она не видна.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
бррр... тогда код в студию. Очень трудно догадываться какие еще там у вас "особенности"
 

krepton85

Member
бррр... тогда код в студию. Очень трудно догадываться какие еще там у вас "особенности"
Вот пока так, но вариантов перепробовал массу: MQTT_RF_PIR_LUSTRA_2.zip
Создал пустые строковые переменные класса String :
Код:
String buf_mqtt_server = "                          "; // создаем буфер заданной максимальной длинны (пробелами длину)
int buf_mqtt_port;
String buf_mqtt_port_s = "      ";

String buf_mqtt_user = "                                 ";

String buf_mqtt_pass = "                                 ";
Затем заполнил их (вместо пробелов) из eeprom:
Код:
for (byte i = 0; i < len_mqtt_server; i++)buf_mqtt_server.setCharAt(i, EEPROM.read(i+201));  // заполняем вместо пробелов строковую переменную объекта класса String
    delay(10);
   buf_mqtt_server += '\0'; //добовляем в конце символ нуля, завершающий строку
   
   buf_mqtt_server.toCharArray(mqtt_server, (len_mqtt_server +1)); // вырезвем из буфера часть символов равное длине строки + 1 символ нуля для завершения строки) и однавременно заполняем строку char*
    
  
   
    for (byte i = 0; i < len_mqtt_port; i++)buf_mqtt_port_s.setCharAt(i,EEPROM.read(i+226));
    delay(10);
   buf_mqtt_port_s += '\0';
    
   buf_mqtt_port = buf_mqtt_port_s.toInt();
    buf_mqtt_port_s.toCharArray(mqtt_port_s, len_mqtt_port); // вырезаем из буфера часть символов равное длине строки + 1 символ нуля для завершения строки)
   
   
    for (byte i = 0; i < len_mqtt_user; i++)buf_mqtt_user.setCharAt(i,EEPROM.read(i+242)); 
    delay(10);
  buf_mqtt_user += '\0';
   
  buf_mqtt_user.toCharArray(mqtt_user, (len_mqtt_user +1)); // вырезвем из буфера часть символов равное длине строки + 1 символ нуля для завершения строки)
    
   
    for (byte i = 0; i < len_mqtt_pass; i++)buf_mqtt_pass.setCharAt(i,EEPROM.read(i+274));
    delay(10);
  buf_mqtt_pass += '\0';
 
   buf_mqtt_pass.toCharArray(mqtt_pass, (len_mqtt_pass +1)); // вырезвем из буфера часть символов равное длине строки + 1 символ нуля для завершения строки)
так же вверху создал пустые строки char* нужно длинны:

Код:
char *mqtt_server = new char[25]; //создаем пустую строку длинной 25 символов
char *mqtt_port_s = new char[6];
char  *mqtt_user = new char[33];
char *mqtt_pass = new char[33];
затем преоброзовал их из char* в const char*:

Код:
const char *mqtt_server_c = (const char*)mqtt_server; // преобразуем из строку из char* в const char*
const int mqtt_port_c = (const int)buf_mqtt_port;
//const char *mqtt_port_c = (const char*)mqtt_port_s;
const char *mqtt_user_c = (const char*)mqtt_user;
const char *mqtt_pass_c = (const char*)mqtt_pass;
В архиве полный код, там можно еще увидеть как извращался с им, в закомментированных строках. :)
 
Сверху Снизу