Google cloud platform MQTT与ESP8266的谷歌云连接

Google cloud platform MQTT与ESP8266的谷歌云连接,google-cloud-platform,mqtt,iot,arduino-esp8266,Google Cloud Platform,Mqtt,Iot,Arduino Esp8266,我正试图用Arduino IDE将温度数据从一个NodeMCU发送到谷歌云,并使用这个库。我在google iot core上创建了一个注册表和一个设备,并在那里上传了公钥(ES256)。在我这方面,我通过SPIFFS在ESP8266上上传了csa证书,并在“ciotc\u config.h”中正确设置了所有参数和私钥字符串。当我尝试连接时,我进入串行监视器,以下输出会自动重复: 14:11:14.342 -> Connecting to WiFi 14:11:15.725 -> W

我正试图用Arduino IDE将温度数据从一个NodeMCU发送到谷歌云,并使用这个库。我在google iot core上创建了一个注册表和一个设备,并在那里上传了公钥(ES256)。在我这方面,我通过SPIFFS在ESP8266上上传了csa证书,并在“ciotc\u config.h”中正确设置了所有参数和私钥字符串。当我尝试连接时,我进入串行监视器,以下输出会自动重复:

14:11:14.342 -> Connecting to WiFi
14:11:15.725 -> Waiting on time sync...
14:11:15.866 -> Success to open ca file
14:11:15.913 -> loaded
14:11:15.913 -> 
14:11:15.913 -> connecting...Refreshing JWT
14:11:19.797 -> 
14:11:19.797 -> connected!
14:11:19.843 -> 
14:11:19.843 -> connecting...Refreshing JWT
14:11:23.727 -> 
14:11:23.727 -> connected!
14:11:23.774 -> 
14:11:23.774 -> connecting...Refreshing JWT
等等

在设备>配置和状态历史记录下的云仪表板中未接收数据,我可以看到黄色警告“设备尚未确认”

似乎我无法连接MQTT,因为数据没有发送,我不知道如何真正理解错误在哪里。你们知道吗

多谢各位

#include "DHT.h"
#include <CloudIoTCore.h>
#include "esp8266_mqtt.h"

#define DHTPIN 2 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11
unsigned long lastMillis = 0;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  setupCloudIoT(); // Creates globals for MQTT
  dht.begin();
}

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

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

  if (millis() - lastMillis > 20000) {
    lastMillis = millis();
  String payload =
      String("{\"timestamp\":") + time(nullptr) +
      String(",\"temperature\":") + dht.readTemperature() +
      String(",\"humidity\":") + dht.readHumidity() +
      String("}");
    publishTelemetry(payload);
  }
}
UPDATE2:JWT验证和凭据调试

下面是从串行监视器获得的凭证和JWT:

18:54:41.890 -> Waiting on time sync...
18:54:42.904 -> Success to open ca file
18:54:42.938 -> loaded
18:54:42.971 -> projects/iot-esp8266-new/locations/us-central1/registries/iotcore-registry/devices/esp8266
18:54:42.971 -> Refreshing JWT
18:54:46.318 -> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
18:54:46.351 -> 
18:54:46.351 -> connecting...Refreshing JWT
已使用PyJWT验证生成的JWT,如下所示:

import jwt
public_key =  open('ec_public.pem').read()
token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'
payload = jwt.decode(token, public_key, algorithms=['ES256'], audience="iot-esp8266-new")
payload
{'iat': 1556988880, 'exp': 1556992480, 'aud': 'iot-esp8266-new'}

更新ESP8266社区SDK的2.5.x分支发生了变化。该库需要更新才能与2.4.x库一起支持它,但它们尚未完成。目前,只使用2.4.2 SDK是最简单的方法,也可以在发布修复程序之前使用

先前的响应

我已经轶事般地验证了该库的1.0.5版本是否与ESP8266硬件一起工作。您可能需要尝试打印参数,并确保参数设置正确。更换以下部件可能是最容易做到的:

if(!mqttClient->connected()){
connect();
}
在主项目文件中,使用以下行:

if(!mqttClient->connected()){
//示例调试行
Serial.println(设备->getClientId());
Serial.println(getJwt());
//结束调试行
connect();
}

如果配置看起来正确,您可能希望尝试使用类似JWT.io的东西来验证JWT。为此,向库中添加一个帮助程序是有意义的。

日志表明,您实际上正在获得连接并将其丢失。对于其他MQTT代理,如果设备具有连接权限,但随后尝试订阅另一个缺少权限的主题,则可能发生这种情况。这里的大部分设备固件都在库中,所以我会首先检查云配置。嗨@MBer,谢谢你的回答…我看到它正在连接和断开连接,几乎立即…我认为在云端,我做了我必须做的一切,我激活了计费、api和pubsub,然后创建了项目,注册表和设备以及附加的公钥,实际上不知道我还应该做什么…祝你好运-除非有人遇到同样的问题,否则如果没有来自云发布/订阅的日志,解决将很困难。几个问题:你安装了哪个版本的库?8266有哪些SDK?通过在IDE中的“工具”>“核心调试级别”>“详细”下设置调试级别,在Arduino中启用更详细的调试可能会有所帮助。您是否在设备上放置了来自Google的根证书?只需确保您所说的csa证书是您创建设备时在设备注册表中注册的SSL密钥对的私有部分,以及您从中获得的根证书。Hi@class感谢您的回答。在提出这个问题之前,我已经用getJwt()进行了调试,我再次进行了检查。配置看起来不错,生成的JWT也不错。这次我用PyJwt验证了它,请参见问题中的更新。附言:我正在使用NodeMCU。你认为这与此有关吗?感谢更新的答案。Hi@class I确认版本2.4.2的连接正常。谢谢
import jwt
public_key =  open('ec_public.pem').read()
token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'
payload = jwt.decode(token, public_key, algorithms=['ES256'], audience="iot-esp8266-new")
payload
{'iat': 1556988880, 'exp': 1556992480, 'aud': 'iot-esp8266-new'}