google-cloud-platform - 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);
}
}
有人知道是否有任何其他模块没有同样的问题?
解决方案
您面临的问题是恕我直言,不是您的代码或您使用的 MQTT-lib 的问题。ESP32核心包似乎有问题(1.04仍然存在)。从 github 看到这个问题集合和一些建议的解决方法,最终延迟了问题但没有解决它。从 2018 年至今的
MQTT问题集合问题
这些是关于 WiFi 重新/连接问题的未解决问题 引发错误
的测试用例链接自其中一篇文章。我使用带有 MQTT 连接的 esp8266 上的相同程序来识别 ESP32 特定问题,并在那里运行数月。
ESP32 的人有一个坏习惯,就是将未评论的问题留待一个月,希望过时的机器人将它们关闭。所以我只是引用了未解决的问题,如果您搜索已关闭的问题,您会发现更多)由陈旧的机器人而不是解决方案关闭!
推荐阅读
- typescript - 尝试使用 tsyringe 和 typeorm 进行依赖注入时遇到问题
- class - 为什么嵌套类使包含类可以访问子类的受保护数据?
- python - 使用 Pandas 为靠得太近的数字添加缓冲区
- vb.net - 使用时间跨度值更改日期的时间部分
- excel - INDEX MATCH 基于多个标准。一个是 FIND,另一个是 Max date
- python - 基于groovy代码生成HmacSHA256到Python中
- c++ - 无法从 decltype 中获取指向成员函数的指针
- android - 有线问题,RecyclerView 在某些特定的三星 Galaxy 设备上不显示项目
- matlab - 从 MATLAB 中的 2D 地图绘制体积 3D 数据?
- python - 使用 Regex 从“1. hello”中获取“hello”