Как проверить, активно ли соединение MQTT?
Мне интересно, есть ли способ проверить, активно ли соединение 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
намного сложнее, и я не могу точно сказать.
@Kody Rogers, 👍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;
...
...
Пока работает!
,
@Kody Rogers
Смотрите также:
- Проблема с получением SMS - GSM-модуль Arduino Uno и SIM900A
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Мини-модем SIM900a, IMEI 0, помощь с контактами TX RX
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- SIM800L не регистрируется в сети
- Как отправлять сообщения на несколько номеров с помощью модуля Arduino uno и SIM800?
- Модуль SIM808 GSM работает нормально, GPS не работает (нет сообщения о готовности GPS при включении питания)