Странное поведение BearSSL на GPIO ESP8266
Я использую GPIO 5 для запуска реле, мой код также подключается через безопасное соединение MQTT, для которого мне нужно использовать определения сертификата BearSSL. Без сертификатов BearSSL, когда esp перезапускается, он не повторно запускает реле, и GPIO сохраняет свое состояние между перезагрузками, но когда я использую сертификаты BearSSL, поведение меняется, и GPIO 5 переходит в низкий уровень при перезапуске. Есть какие-нибудь объяснения, почему и как это смягчить?
Я на 100% уверен, что это из-за импорта, поскольку я удалял компоненты своего кода до тех пор, пока не нашел фрагмент кода, вызвавший это, и это произошло из-за объявлений.
#include <WiFiClientSecure.h>
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
aws root)EOF";
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
device cert)KEY";
static const char AWS_CERT_KEY[] PROGMEM = R"KEY(
device key )KEY";
BearSSL::X509List cert(AWS_CERT_CA);
BearSSL::X509List client_crt(AWS_CERT_CRT);
BearSSL::PrivateKey key(AWS_CERT_KEY);
WiFiClientSecure espClient;
void setup() {
pinMode(5, OUTPUT);
delay(2000);
digitalWrite(5, HIGH);
delay(2000);
ESP.restart();
}
void loop() {}
Без следующих трёх строк
BearSSL::X509List cert(AWS_CERT_CA);
BearSSL::X509List client_crt(AWS_CERT_CRT);
BearSSL::PrivateKey key(AWS_CERT_KEY);
Светодиод на GPIO 5 не мигает при перезапуске, но добавление этих линий заставляет их мерцать. Любое решение или предложение по решению этой проблемы будет очень полезно.
@Shreyansh Jain, 👍1
1 ответ
Что мне помогло, так это переместить объявление и использование BearSSL после настройки pinMode GPIO. Поэтому мне пришлось сделать сертификат и ключи локальными переменными и обернуть всю настройку Wi-Fi, подключение к нему, настройку и подключение к ядру AWS в одной функции.
void setupWiFiAndConnectAWS() {
BearSSL::X509List cert(AWS_CERT_CA);
BearSSL::X509List client_crt(AWS_CERT_CRT);
BearSSL::PrivateKey key(AWS_CERT_KEY);
WiFi.persistent(false);
DEBUG_MSG("[setupWiFi] Setting host name\n");
WiFi.hostname(deviceId);
DEBUG_MSG("[setupWiFi] Setting station mode\n");
WiFi.mode(WIFI_STA);
if (WiFi.getMode() & WIFI_AP) {
WiFi.softAPdisconnect(true);
}
WiFi.persistent(false);
DEBUG_MSG("[setupWiFi] Loading certificates\n");
net.setTrustAnchors(&cert);
net.setClientRSACert(&client_crt, &key);
loadCredentials();
connectWiFi();
attachInputInterrupts(false);
setupNTP();
connectAWS();
}
после настройки контактов GPIO. Хотя это обходной путь, я все еще не понимаю основную проблему и хотел бы ее понять.
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как подключиться к MQTT брокеру с помощью TLS?
- Преобразование byte* в int в Arduino
- esp32-cam публикует изображение в mqtt
- ESP8266 глубокий сон и MQTT
- ESP-01 неправильно просыпается после глубокого сна
- Какие входные контакты я могу использовать на ESP8266 NodeMCU
- ESP 12 непригодных контактов