mqtt.ping () в библиотеке Adafruit mqtt - PullRequest
0 голосов
/ 27 января 2020

Следующий код поставляется из документации Adafruit Mqtt:

// Adjust as necessary, in seconds.  Default to 5 minutes (300 seconds).
#define MQTT_CONN_KEEPALIVE 300

// ping the server to keep the mqtt connection alive
// NOT required if you are publishing once every KEEPALIVE seconds
if(! mqtt.ping()) {
   mqtt.disconnect();
}

Что на самом деле делает "MQTT_CONN_KEEPALIVE"? Я не могу понять ... Если я напишу код, показанный выше, и вставлю его в мой l oop, тогда пинг будет выполняться постоянно, и все пакеты будут отклонены ... Я ожидал, что используется переменная MQTT_CONN_KEEPALIVE в функции ping () выполнить ping, только если прошло 300 секунд, но id, похоже, не такой. Как я должен написать код, чтобы пинг только один раз каждые несколько минут?

1 Ответ

1 голос
/ 28 января 2020

MQTT Keep Alive является частью протокола MQTT для поддержания связи между брокером и клиентами. Подробнее об этом вы можете прочитать в документации .

. MQTT использует TCP / IP-соединение, которое обычно остается открытым клиентом, что позволяет отправлять и получать данные в любое время. Чтобы обнаружить сбой соединения, MQTT использует систему проверки связи, где он отправляет сообщения брокеру с заранее определенным интервалом, если по истечении определенного периода не было отправлено сообщений (KeepAlive).

Спецификация c для реализации Adafruit_MQTT , если вы опубликуете sh данные и уверены, что вы опубликуете sh данные в течение периода времени, установленного MQTT_CONN_KEEPALIVE, тогда вам подойдет go.

Если сервер / брокер не получил данные или PINGREQ от клиента в MQTT_CONN_KEEPALIVE + дополнительно 50% от MQTT_CONN_KEEPALIVE, брокер отключится от сети (время ожидания), и клиенту придется повторно установить sh соединение.

Таким образом, если клиент MQTT подписывается только на топи c без публикации, клиент должен затем посылать ping (PINGREQ) брокеру хотя бы один раз в каждом наборе MQTT_CONN_KEEPALIVE c. Однако вы не хотите постоянно пинговать сервер. Один из способов сделать это - отправлять mutt.ping () каждый MQTT_CONN_KEEPALIVE se c.

#define MQTT_KEEP_ALIVE 60
unsigned long previousTime;

loop() {
  unsigned long currentTime = millis();

  if((currentTime - previousTime) > MQTT_KEEP_ALIVE * 1000) {
    previousTime = currentTime;   
    if(! mqtt.ping()) {
      mqtt.disconnect();
    }
  }

  // delay(10) or do something else
}
...