我正在尝试按照这个 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