Google iot MQTT - ESP32 подключается в первый раз и повторно подключается только через 30 минут - PullRequest
1 голос
/ 06 мая 2020

Я работаю с облаком google Iot с ESP32, я отправляю фальшивые значения, чтобы провести тест с данными MQTT PUB / SUB, по-видимому, мне удается опубликовать значения, иногда я не могу повторно подключиться к Google iot. Я не знаю, почему он продолжает проверять Wi-Fi ... публикует и проверяет ключ JWT.

Я заметил, что если я один раз подключусь к google iot, а затем отключу esp32 от своего p c (не отключаю питание), снова подключу его и попытаюсь подключиться, я войдет в эту «проверку Wi-Fi» около 30 м, пока я не смогу снова подключиться к Google iot. Как это исправить?

Я полагал, что с этим можно было справиться:

// Time (seconds) to expire token += 20 minutes for drift
const int jwt_exp_secs = 3600; // Maximum 24H (3600*24)

Когда мне удается получить хороший ответ, отправляющий информацию на серверы, я получаю this +:

entry 0x400806b8
Setup.....
Starting wifi
Connecting to WiFi
Connected
Waiting on time sync...
checking wifi...
connecting...Refreshing JWT
connected

Library connected!
incoming: /devices/esp32-device/config - 
incoming: /devices/esp32-device/config - 
Publishing value
Publishing value
Publishing value
Publishing value
Publishing value

Бывают случаи, когда я получаю плохой ответ в течение примерно 30 минут, используя тот же код, кажется, что он отправляет постоянные данные, которые не должны быть постоянными. (предполагалось, что происходит):

ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Setup.....
Starting wifi
Connecting to WiFi
Connected
Waiting on time sync...
checking wifi...Publishing value
checking wifi...checking wifi...checking wifi...Publishing value
(Just keeps repeating)

Это основное подключение к коду MQTT, с попытками исправить проблемы, но не сработало:

// This file contains static methods for API requests using Wifi / MQTT
#ifndef __ESP32_MQTT_H__
#define __ESP32_MQTT_H__
#include <Client.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <MQTT.h>
#include <CloudIoTCore.h> 
#include <CloudIoTCoreMqtt.h>
#include "ciotc_config.h" // Update this file with your configuration

void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
}


// Initialize WiFi and MQTT for this board
Client *netClient;
CloudIoTCoreDevice *device;
CloudIoTCoreMqtt *mqtt;
MQTTClient *mqttClient;
unsigned long iat = 0;
String jwt;

String getDefaultSensor() {
return  "Wifi: " + String(WiFi.RSSI()) + "db";
}

String getJwt() {
Serial.println("Entered JWT");
delay(5000);
iat = time(nullptr);
Serial.println("Refreshing JWT");
jwt = device->createJWT(iat, jwt_exp_secs);
return jwt;
}

void setupWifi() { 
Serial.println("Starting wifi");

Serial.print("WIFI status = ");
Serial.println(WiFi.getMode());
WiFi.disconnect(true);
delay(3000);
WiFi.mode(WIFI_STA);
delay(3000);
Serial.print("WIFI status = ");
Serial.println(WiFi.getMode());

WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
  delay(100);
 }
Serial.println("Connected");
delay(5000);

configTime(0, 0, ntp_primary, ntp_secondary);
Serial.println("Waiting on time sync...");
while (time(nullptr) < 1510644967) {
  delay(10);
}
}


void connectWifi() {
Serial.print("checking wifi...");
while (WiFi.status() != WL_CONNECTED) {
 Serial.print(".");
}
delay(5000);
}


bool publishTelemetry(String data) {
return mqtt->publishTelemetry(data);
}

 bool publishTelemetry(const char* data, int length) {
 return mqtt->publishTelemetry(data, length);
 }

 bool publishTelemetry(String subfolder, String data) {
 return mqtt->publishTelemetry(subfolder, data);
 } 

 bool publishTelemetry(String subfolder, const char* data, int length) {
 return mqtt->publishTelemetry(subfolder, data, length);
 }

 void connect() {
 connectWifi();
  mqtt->mqttConnect();

  delay(5000);
 }

 void setupCloudIoT() {
 device = new CloudIoTCoreDevice(
  project_id, location, registry_id, device_id,
  private_key_str);

 setupWifi();
 netClient = new WiFiClientSecure();
 mqttClient = new MQTTClient(512);
 mqttClient->setOptions(180, true, 1000); // keepAlive, cleanSession, timeout
 mqtt = new CloudIoTCoreMqtt(mqttClient, netClient, device);
 mqtt->setUseLts(true);
 mqtt->startMQTT();

 delay(5000);
 }
 #endif //__ESP32_MQTT_H__

Это основное. cpp:

#include <Arduino.h>
#include <WiFiClientSecure.h>
#include "esp32-mqtt.h"
#include <ArduinoJson.h>
#define led 14

char buffer[100];
float counter = 0;
float counter1 = 0;

void setup() {
Serial.begin(115200);

Serial.println("Setup.....");
pinMode(led, OUTPUT);

setupCloudIoT();
}

unsigned long lastMillis = 0;

void loop() {
mqtt->loop();
delay(10);  // <- fixes some issues with WiFi stability

if (!mqttClient->connected()) {
connect();
}

counter++;
counter1++;

if (millis() - lastMillis > 1000) {
Serial.println("Publishing value");
lastMillis = millis();
float temp = counter;
float hum = counter1;
StaticJsonDocument<100> doc;
doc["temp"] = temp;
doc["humidity"] = hum;
serializeJson(doc, buffer);
publishTelemetry(buffer);
}
}

Кто-нибудь знает, есть ли какой-либо другой модуль, у которого нет такой же проблемы?

1 Ответ

0 голосов
/ 06 мая 2020

Проблема, с которой вы сталкиваетесь, - ИМХО, это не проблема вашего кода или MQTT-библиотеки, которую вы используете. Кажется, проблема в основном пакете ESP32 (в 1.04 он все еще есть). См. Этот сборник проблем с github и некоторые предлагаемые решения, которые в конечном итоге задерживают проблему, но не решают ее.
Проблема с MQTT Коллекция проблем с 2018 года по сегодняшний день
Это открытые вопросы относительно проблем с подключением / подключением WiFi
Тестовый пример для спровоцирования ошибки связан с одним из постов.
Я использую для идентификации спецификаций ESP32 c проблемы с идентичной программой на esp8266 с подключением MQTT, и там она работает месяцами.
У ESP32 людей есть дурная привычка оставлять проблемы без комментариев открытыми в течение месяца, надеясь, что устаревший бот их закроет. Итак, я только что процитировал открытые проблемы, если вы ищете закрытые проблемы, вы найдете еще несколько) закрытых устаревшим ботом, а не решением!

...