Как проверить, активно ли соединение MQTT?

gsm mqtt mkr-gsm-1400

Мне интересно, есть ли способ проверить, активно ли соединение MQTT.

Причина в том, что у меня возникла проблема с разрывом соединения через некоторое время и отсутствием повторного подключения.

/*
ArduinoMqttClient — простой отправитель WiFi

В этом примере подключается к брокеру MQTT и публикуется сообщение
тема раз в секунду.

Схема:
- Плата Arduino MKR 1000, MKR 1010 или Uno WiFi Rev2

Этот пример кода находится в свободном доступе.
*/

#include <ArduinoMqttClient.h>
#include <MKRGSM.h>

#include "arduino_secrets.h"
// Введите свои конфиденциальные данные на вкладке «Секрет» или в arduino_secrets.h.
// Пин код
const char PINNUMBER[]     = SECRET_PINNUMBER;
// данные APN
const char GPRS_APN[]      = SECRET_GPRS_APN;
const char GPRS_LOGIN[]    = SECRET_GPRS_LOGIN;
const char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;

GSMClient client;
GPRS gprs;
GSM gsmAccess;
MqttClient mqttClient(client);

const char broker[] = "*****";
int        port     = 1883;
const char topic[]  = "Tempdata";

const long interval = 500000;
unsigned long previousMillis = 0;

float SERIESRESISTOR = 9.87;
float TEMPERATURENOMINAL = 25.0;
float BCOEFFICIENT = 3540.0;
float thermistor = 0.0;
float THERMISTORNOMINAL = 10;

int count = 0;

void setup() {
  // Инициализируем последовательный порт и ждем открытия порта:
  Serial.begin(9600);

  Serial.println("Starting Arduino web client.");
  // состояние соединения
  bool connected = false;

  // После запуска модема с помощью GSM.begin()
  // подключаем шилд к сети GPRS с указанием APN, логина и пароля
  while (!connected) {
    if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &&
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("You're connected to the network");
  Serial.println();

  // Вы можете указать уникальный идентификатор клиента, если он не установлен, библиотека использует Arduino-millis()
  // Каждый клиент должен иметь уникальный идентификатор клиента
  mqttClient.setId("pump-house-gsm");

  // Вы можете указать имя пользователя и пароль для аутентификации
  //mqttClient.setUsernamePassword("****", "****");

  Serial.print("Attempting to connect to the MQTT broker: ");
  Serial.println(broker);

  if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());

    while (1);
  }

  Serial.println("You're connected to the MQTT broker!");
  Serial.println();

  // устанавливаем аналоговое разрешение на 12
  analogReadResolution(12);
}

void loop() {
  // регулярно вызываем poll(), чтобы библиотека могла отправлять сообщения поддержки MQTT, которые
  // позволяет избежать отключения брокером
  mqttClient.poll();

  // чтобы избежать задержек в цикле, мы будем использовать стратегию из BlinkWithoutDelay
  // смотрим: Файл -> Примеры -> 02.Цифровой -> BlinkWithoutDelay для получения дополнительной информации
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    /*Read analog outputof NTC module,
     i.e the voltage across the thermistor */
    float average = ((float)analogRead(A0) / 4095.0) * 3.3;

    average = (average * SERIESRESISTOR) / (3.3 - average);

    float steinhart;
    steinhart = average / THERMISTORNOMINAL;     // (Р/Ро)
    steinhart = log(steinhart);                  // Ин(Р/Ро)
    steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
    steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/К)
    steinhart = 1.0 / steinhart;                 // Инвертировать
    steinhart -= 273.15;                         // конвертируем абсолютную температуру в C

    // сохраняем последний раз, когда было отправлено сообщение
    previousMillis = currentMillis;

    // Отслеживаем время отправки сообщения
    // это переподключение каждый час.
    count = count + 1;

    // отправляем сообщение, интерфейс печати можно использовать для установки содержимого сообщения
    mqttClient.beginMessage(topic);
    mqttClient.print("The temperature is ");
    mqttClient.print(steinhart);
    mqttClient.endMessage();
  }
}

Может быть, endMessage, beginMessage или poll имеет возврат, в котором говорится, что не удалось отправить сообщение?

Я посмотрел на endMessage и beginMessage, и мне это не показалось, но poll намного сложнее, и я не могу точно сказать.

, 👍0


1 ответ


1

Я нашел решение с помощью функции connected, включенной в ArduinoMqttClient (нашел ее, просматривая код библиотеки).

Вот фрагмент кода, показывающий, что я добавил:

...
...
if (currentMillis - previousMillis >= interval) {
  if (!mqttClient.connected()) {
    if (mqttClient.connect(broker, port)) {
        Serial.println("reconnected");
    }
  }

  /*Read analog outputof NTC module,
  i.e the voltage across the thermistor */
  float average = ((float)analogRead(A0) / 4095.0) * 3.3;
...
...

Пока работает!

,