Облачное соединение Google MQTT с ESP8266

Я пытаюсь отправить данные о температуре из NodeMCU в Google Cloud с помощью Arduino IDE и использую эту библиотеку https://github.com/GoogleCloudPlatform/google-cloud-iot-arduino. Я создал реестр и устройство на ядре Google iot и загрузил туда публичный ключ (ES256). Со своей стороны я загрузил сертификат csa на ESP8266 через SPIFFS и правильно установил все параметры и строку закрытого ключа в ciotc_config.h. Когда я пытаюсь подключиться, я получаю в Serial Monitor следующее:

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);
  }
}

ОБНОВЛЕНИЕ: вывод последовательного монитора с отладкой:

19:16:17.266 -> SDK:3.0.0-dev(c0f7b44)/Core:2.5.0=20500000/lwIP:STABLE-2_1_2_RELEASE/glue:1.1/BearSSL:6778687
19:16:17.266 -> sta config unchangedscandone
19:16:17.313 -> Connecting to WiFi
19:16:17.313 -> wifi evt: 2
19:16:17.406 -> scandone
19:16:17.406 -> state: 0 -> 2 (b0)
19:16:17.406 -> state: 2 -> 3 (0)
19:16:17.406 -> state: 3 -> 5 (10)
19:16:17.406 -> add 0
19:16:17.406 -> aid 14
19:16:17.406 -> cnt 
19:16:17.453 -> 
19:16:17.453 -> connected with Internet, channel 6
19:16:17.453 -> dhcp client start...
19:16:17.453 -> wifi evt: 0
19:16:19.282 -> ip:XX.X.X.X,mask:XXX.XXX.XXX.X,gw:XX.X.X.XXX
19:16:19.282 -> wifi evt: 3
19:16:19.282 -> Waiting on time sync...
19:16:19.751 -> SPIFFSImpl: allocating %zd+%z d+%z  d=%z   d bytes
19:16:19.751 -> SPIFFSImpl: mounting fs @100000, size=2fb000, block=2000, page=100
19:16:19.798 -> SPIFFSImpl: mount rc=0
19:16:19.798 -> Success to open ca file
19:16:19.845 -> loaded
19:16:19.845 -> SPIFFS_close: fd=1
19:16:19.845 -> 
19:16:19.845 -> connecting...Refreshing JWT
19:16:23.255 -> [hostByName] request IP for: mqtt.googleapis.com
19:16:23.301 -> [hostByName] Host: mqtt.googleapis.com IP: XX.XXX.XXX.XXX
19:16:23.301 -> :ref 1
19:16:23.395 -> :wr 224 0
19:16:23.395 -> :wrc 224 224 0
19:16:23.395 -> :ack 224
19:16:23.395 -> :rn 536
19:16:23.395 -> :rd 5, 536, 0
19:16:23.395 -> :rdi 536, 5
19:16:23.442 -> :rd 87, 536, 5
19:16:23.442 -> :rdi 531, 87
19:16:23.442 -> :rd 5, 536, 92
19:16:23.442 -> :rdi 444, 5
19:16:23.442 -> :rd 439, 536, 97
19:16:23.442 -> :rdi 439, 439
19:16:23.442 -> :c0 439, 536
19:16:23.676 -> :rn 536
19:16:23.676 -> :rd 536, 536, 0
19:16:23.676 -> :rdi 536, 536
19:16:23.676 -> :c0 536, 536
19:16:23.770 -> :rn 1072
19:16:23.770 -> :rch 1072, 536
19:16:23.770 -> :rd 1471, 1608, 0
19:16:23.770 -> :rdi 536, 536
19:16:23.770 -> :c 536, 536, 1608
19:16:23.770 -> :rdi 536, 536
19:16:23.770 -> :c 536, 536, 1072
19:16:23.770 -> :rdi 536, 399
19:16:24.086 -> :rch 536, 177
19:16:24.086 -> 
19:16:24.086 -> connected!
19:16:24.086 -> 
19:16:24.086 -> connecting...Refreshing JWT
19:16:27.510 -> [hostByName] request IP for: mqtt.googleapis.com
19:16:27.510 -> [hostByName] Host: mqtt.googleapis.com IP: XX.XXX.XXX.XXX
19:16:27.510 -> pm open,type:2 0
19:16:27.510 -> :close
19:16:27.510 -> :ur 1
19:16:27.510 -> :del
19:16:27.510 -> :ref 1
19:16:27.604 -> :wr 224 0
19:16:27.604 -> :wrc 224 224 0
19:16:27.651 -> :ack 224
19:16:27.651 -> :rn 536
19:16:27.651 -> :rch 536, 536
19:16:27.651 -> :rch 1072, 536
19:16:27.651 -> :rch 1608, 536
19:16:27.651 -> :rd 5, 2144, 0
19:16:27.651 -> :rdi 536, 5
19:16:27.651 -> :rd 87, 2144, 5
19:16:27.651 -> :rdi 531, 87
19:16:27.651 -> :rd 5, 2144, 92
19:16:27.651 -> :rdi 444, 5
19:16:27.651 -> :rd 2047, 2144, 97
19:16:27.651 -> :rdi 439, 439
19:16:27.651 -> :c 439, 536, 2144
19:16:27.651 -> :rdi 536, 536
19:16:27.651 -> :c 536, 536, 1608
19:16:27.651 -> :rdi 536, 536
19:16:27.651 -> :c 536, 536, 1072
19:16:27.651 -> :rdi 536, 536
19:16:27.651 -> :c0 536, 536
19:16:27.885 -> :rn 536
19:16:27.885 -> :rch 536, 177
19:16:27.885 -> :rd 399, 713, 0
19:16:27.885 -> :rdi 536, 399
19:16:28.073 -> 
19:16:28.073 -> connected!
19:16:28.120 -> 
19:16:28.120 -> connecting...Refreshing JWT

ОБНОВЛЕНИЕ 2: проверка JWT и отладка учетных данных

Ниже учетные данные и JWT, полученные от Serial Monitor:

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

Сгенерированный JWT был проверен с помощью PyJWT, как показано ниже:

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'}

person Melvin86    schedule 22.04.2019    source источник
comment
Журнал предполагает, что вы действительно получаете соединение и теряете его. С другими брокерами MQTT это может произойти, если устройство имеет разрешение на подключение, но затем пытается подписаться на другую тему, для которой у него нет разрешения. Так много прошивки устройства находится в библиотеке, поэтому я бы сначала проверил облачную конфигурацию.   -  person MBer    schedule 23.04.2019
comment
Привет @MBer, спасибо за ответ ... Я вижу, что он подключается и отключается, почти сразу ... Я думаю, что на стороне облака я сделал все, что должен был сделать, я активировал биллинг, api и pubsub, затем создал проект , реестр и устройство и прикрепил туда открытый ключ, на самом деле не знаю, что еще мне делать ...   -  person Melvin86    schedule 24.04.2019
comment
Тогда удачи - если кто-то, у кого была такая же проблема, не остановится, решение будет затруднено без журналов из Cloud Pub / Sub.   -  person MBer    schedule 25.04.2019
comment
Несколько вопросов: какая версия библиотеки у вас установлена? Какой SDK у вас есть для 8266? Может быть полезно включить более подробную отладку в Arduino, установив уровень отладки в среде IDE в разделе Инструменты ›Уровень отладки ядра› Подробный.   -  person class    schedule 29.04.2019
comment
Вы ставили на устройство корневой сертификат от гугла? Просто убедитесь, что сертификат csa, о котором вы говорите, является как частной половиной пары ключей SSL, которую вы зарегистрировали в реестре устройства при создании устройства, так и корневым сертификатом, который вы получаете от pki.google.com/roots.pem.   -  person Gabe Weiss    schedule 30.04.2019
comment
Привет @class, SDK должен быть таким: 3.0.0-dev (c0f7b44). Я включил дебуд в среде IDE и получил следующий результат, но на самом деле я не могу его интерпретировать. Я выложил обновление в исходном вопросе.   -  person Melvin86    schedule 03.05.2019
comment
@GabeWeiss да, я скачал оттуда корневой сертификат, преобразовал в файл .crt и прошил на плату. Ключи SSL Я разместил общедоступный в облаке при регистрации устройства и частный в скрипте config.h.   -  person Melvin86    schedule 03.05.2019
comment
Добавьте отладку в эту строку и убедитесь, что конфигурация настроена правильно - github.com/GoogleCloudPlatform/google-cloud-iot-arduino/blob/   -  person class    schedule 04.05.2019
comment
Вам вообще не нужно конвертировать. Просто используйте корневой сертификат как есть.   -  person Gabe Weiss    schedule 04.05.2019
comment
Я просто выполнил инструкции из библиотеки readme, кажется, что для ESP8266 они используют формат DER для корневого сертификата. Но я также могу попробовать использовать его как есть и сообщить вам.   -  person Melvin86    schedule 04.05.2019


Ответы (1)


Обновление. В ветку 2.5.x пакета SDK сообщества ESP8266 были внесены изменения. Библиотеке потребуются обновления для ее поддержки вместе с библиотеками 2.4.x, и они еще не завершены. На данный момент проще всего использовать SDK 2.4.2 или используйте обходной путь, упомянутый в документации библиотеки, пока не будет выпущено исправление.

Предыдущий ответ

Я случайно подтвердил, что версия библиотеки 1.0.5 работает с оборудованием ESP8266. Вы можете попробовать распечатать параметры и убедиться, что они настроены правильно. Вероятно, проще всего это сделать, заменив это:

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

со следующей строкой в ​​вашем основном файле проекта:

  if (!mqttClient->connected()) {
    // Example debug line
    Serial.println(device->getClientId());
    Serial.println(getJwt());
    // End debug line
    connect();
  }

Если конфигурация выглядит правильно, вы можете попробовать проверить JWT с помощью чего-то вроде jwt.io. Для этого есть смысл добавить в библиотеку помощника.

person class    schedule 03.05.2019
comment
Привет, @class, спасибо за ответ. Я уже отлаживал getJwt (), прежде чем задавать этот вопрос, я перепроверил еще раз. Конфигурация выглядит нормально, и сгенерированный JWT выглядит нормально. На этот раз я проверил его с помощью PyJwt, см. Обновление в вопросе. PS: Я использую NodeMCU. Как вы думаете, это имеет какое-то отношение? Спасибо - person Melvin86; 04.05.2019
comment
Обновленный ответ. - person class; 18.05.2019
comment
Привет @class Подтверждаю, что с версией 2.4.2 соединение работает. Спасибо. - person Melvin86; 22.05.2019