Странное поведение 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 не мигает при перезапуске, но добавление этих линий заставляет их мерцать. Любое решение или предложение по решению этой проблемы будет очень полезно.

, 👍1


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. Хотя это обходной путь, я все еще не понимаю основную проблему и хотел бы ее понять.

,