如何附加证书并将 ESP8266 连接到 AWS IoT?

问题描述 投票:0回答:0

我正在尝试按照这个 tutorial 将 esp8266-12f 连接到 aws iot core。下面是我的代码。

main.cpp

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "config.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

#define wifi_status_led_pin 14
#define server_status_led_pin 12

using string = std::string;

#define AWS_IOT_MQTT_PORT 8883

WiFiClientSecure net;
BearSSL::X509List cert(AWS_CERT_CA);
BearSSL::X509List client_crt(AWS_CERT_CRT);
BearSSL::PrivateKey key(AWS_CERT_PRIVATE);
PubSubClient client(net);


void configAWS()
{
  // net.setInsecure();
  net.setTrustAnchors(&cert);
  net.setClientRSACert(&client_crt, &key);
  client.setServer(AWS_IOT_ENDPOINT, AWS_IOT_MQTT_PORT);

  while (!client.connected(THINGNAME))
  {
    Serial.println("Connecting to AWS");
    digitalWrite(server_status_led_pin, HIGH);
    delay(500);
    digitalWrite(server_status_led_pin, LOW);
    delay(500);
  }

  if (client.connected() && client.connect(THINGNAME))
  {
    client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
    client.setCallback(messageHandler);
    Serial.println("AWS IoT connected!");
    digitalWrite(server_status_led_pin, HIGH);
  }
}

void setup() {
  Serial.println("setup");
  pinMode(wifi_status_led_pin, OUTPUT);
  pinMode(server_status_led_pin, OUTPUT);
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("wifi connecting");
    digitalWrite(wifi_status_led_pin, HIGH);
    delay(300);
    digitalWrite(wifi_status_led_pin, LOW);
    delay(300);
  }
  digitalWrite(wifi_status_led_pin, HIGH);
  Serial.println("connected network");
  configAWS();
  pinMode(door1_open_pin, OUTPUT);
  pinMode(door1_status_pin, INPUT);
  door1_previous_state = digitalRead(door1_status_pin);
}

void loop() {
}

config.h

#include <pgmspace.h>

#define SECRET
#define THINGNAME "THINGNAME " // change this

const char WIFI_SSID[] = "mywifi";     // change this
const char WIFI_PASSWORD[] = "password"; // change this
const char AWS_IOT_ENDPOINT[] = "XXXXXXXXX-ats.iot.us-east-2.amazonaws.com";

// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
ca cert
-----END CERTIFICATE-----
)EOF";

// Device Certificate                                               
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
my cert
-----END CERTIFICATE-----
)KEY";

// Device Private Key                                               
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
mykey
-----END RSA PRIVATE KEY-----
)KEY";

证书应该没有问题,因为我也用相同的证书和东西尝试过 esp32,并且它成功了。但是在 esp8266 中,我无法连接到 aws 并继续记录“连接到 AWS”。

我不确定这是否重要,但我使用的是 platformio,并且只能使用 esp12e 而不是 12f 板。

下面是我的ini文件,

[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
lib_deps = 
    bblanchon/ArduinoJson@^6.20.1
    knolleary/PubSubClient@^2.8
    ESP8266WiFi @ ^1.0
c++ amazon-web-services ssl ssl-certificate esp8266
© www.soinside.com 2019 - 2024. All rights reserved.