首页 > 解决方案 > Google iot MQTT - ESP32 第一次连接,仅在 30m 后重新连接

问题描述

我正在使用带有 ESP32 的谷歌物联网云,我发送假值只是为了用 MQTT 数据 PUB/SUB 进行测试,显然我成功地发布了这些值,有时,我无法重新连接到谷歌物联网。我不知道为什么它一直在检查 wifi ......发布并且不检查 JWT 密钥。

我注意到,如果我连接一次谷歌物联网,然后我从我的电脑上拔下 esp32(断开电源),然后重新插入并尝试连接,我将进入这个“检查 wifi”大约 30m,直到我可以连接回谷歌物联网。如何解决这个问题?

我相信有一些事情可以解决:

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

当我设法获得向服务器发送信息的良好响应时,我得到了这个+:

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

有时我在大约 30m 的时间内得到一个不好的响应,使用相同的代码,它似乎正在发送恒定的数据,这不应该是恒定的。(不应该发生):

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__

这是main.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);
}
}

有人知道是否有任何其他模块没有同样的问题?

标签: google-cloud-platformmqttesp32google-cloud-iot

解决方案


您面临的问题是恕我直言,不是您的代码或您使用的 MQTT-lib 的问题。ESP32核心包似乎有问题(1.04仍然存在)。从 github 看到这个问题集合和一些建议的解决方法,最终延迟了问题但没有解决它。从 2018 年至今的
MQTT问题集合问题 这些是关于 WiFi 重新/连接问题的未解决问题 引发错误 的测试用例链接自其中一篇文章。我使用带有 MQTT 连接的 esp8266 上的相同程序来识别 ESP32 特定问题,并在那里运行数月。



ESP32 的人有一个坏习惯,就是将未评论的问题留待一个月,希望过时的机器人将它们关闭。所以我只是引用了未解决的问题,如果您搜索已关闭的问题,您会发现更多)由陈旧的机器人而不是解决方案关闭!


推荐阅读