• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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() {
// все, как в примере или что нужно...
}
Всем спасибо за участие!
 
Последнее редактирование:
Сверху Снизу