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

Проверка наличия соединения с MQTT брокером

Tartuffe

New member
Однако, возвращаясь к теме...
Последняя редакция библиотеки PubSubClient (v2.6) устраняет тот косяк, о котором я вопрошал почтенную публику. То есть void loop() при потере связи продолжает работать - ура!, то что нужно... НО! Пример, приложенный к архиву библиотеки, демонстрирует подключение к broker.mqtt-dashboard.com без настройки порта, имени пользователя и пароля (пароль и ssid относятся к Wi-Fi). Для подключения к cloudmqtt.com всё это нужно. При этом, на сколько я понял, сама библиотека предполагает разные варианты подключений к разным брокерам... но только не такой какой нужно. Что же делать? :(
 

shuraf

Member
Однако, возвращаясь к теме...
Последняя редакция библиотеки PubSubClient (v2.6) устраняет тот косяк, о котором я вопрошал почтенную публику. То есть void loop() при потере связи продолжает работать - ура!, то что нужно... НО! Пример, приложенный к архиву библиотеки, демонстрирует подключение к broker.mqtt-dashboard.com без настройки порта, имени пользователя и пароля (пароль и ssid относятся к Wi-Fi). Для подключения к cloudmqtt.com всё это нужно. При этом, на сколько я понял, сама библиотека предполагает разные варианты подключений к разным брокерам... но только не такой какой нужно. Что же делать? :(
Смотреть все примеры к библиотеке.
Ну немного поиска в гугле.
Ну, а я подглядел в исходниках, что и куда можно передать
PubSubClient::connect(const char *id, const char *user, const char *pass)
PubSubClient::setServer(uint8_t * ip, uint16_t port)
 

Tartuffe

New member
Смотреть все примеры к библиотеке.
Ну немного поиска в гугле.
Засмотрел до дыр все примеры, изгуглил весь инет и ничего...

Ну, а я подглядел в исходниках, что и куда можно передать
PubSubClient::connect(const char *id, const char *user, const char *pass)
PubSubClient::setServer(uint8_t * ip, uint16_t port)
Из Вашего примера непонятно, что за id? user, pass, port, даже ip сервера узнать не хитрое дело, но id клиента на cloudmqtt.com нет... или я не вижу...

Если не трудно, выложите полный фрагмент кода, касающийся подключения к cloudmqtt.com.
 

shuraf

Member
Засмотрел до дыр все примеры, изгуглил весь инет и ничего...



Из Вашего примера непонятно, что за id? user, pass, port, даже ip сервера узнать не хитрое дело, но id клиента на cloudmqtt.com нет... или я не вижу...

Если не трудно, выложите полный фрагмент кода, касающийся подключения к cloudmqtt.com.
Id - Это как вы своего клиента называете (Например, "ESPclient", "Datchik", testBoard"....)
*Это не мой пример, это заголовок из библиотеки.
 

Tartuffe

New member
shuraf, и все-таки, если не трудно, выложите полный фрагмент кода, касающийся подключения к cloudmqtt.com.
 

Tartuffe

New member
Ну, разобрался с горем пополам. Может кому-нибудь пригодится, фрагмент кода касающегося подключения к cloudmqtt.com. За основу взят пример из папки с библиотекой PubSubClient v2.6 (mqtt_esp8266.ino):

Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "........."; // имя Wi-Fi
const char* password = ".........."; // пароль от Wi-Fi
const char* mqtt_server = "m23.cloudmqtt.com";
uint16_t port = ..........; // порт из настроек cloudmqtt.com
const char *id = "esp07"; // пофиг что будет написано
const char *user = "............"; // имя пользователя, сгенерированное cloudmqtt.com
const char *pass ="..........."; // пароль, выданный cloudmqtt.com

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  setup_wifi();
  client.setServer(mqtt_server, port);
  client.connect(id, user, pass);
  client.setCallback(callback);
}
void setup_wifi() {
// все, как в примере
}
void callback(char* topic, byte* payload, unsigned int length) {
// все, как в примере.
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {      // reconnect до победного конца. Основной цикл выполняться не будет пока не подключится.
// Если нужно, чтобы основной цикл продолжал работать, там же есть пример mqtt_reconnect_nonblocking.ino
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(id, user, pass)) { // единственная строка претерпевшая изменения
      Serial.println("connected");
      // Once connected, publish an announcement...
      // ... and resubscribe
      client.subscribe("......"); // названия топиков
      client.subscribe("....."); // названия топиков
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
// все, как в примере или что нужно...
}
Всем спасибо за участие!
 
Последнее редактирование:
Сверху Снизу