Решение, необходимое для отправки HTTP-запросов с нескольких модулей Arduino в полевых условиях.

Я использую библиотеку Arduino Wifi Nina для подключения Arduino Uno Wifi Rev2 к Wi-Fi, а затем с помощью Библиотека HTTP-клиента Arduino для выполнения HTTP-вызовов в Интернет. Это работает. Однако, когда я переключаюсь с HTTP на HTTPs (т.е. переключаю порт на 443 с 80), приведенный ниже код дает сбой. Я понимаю, это потому, что у меня нет сертификата на Arduino. Мне нужно купить/получить сертификат и загрузить его в Arduino.

Мне нужно найти решение этой проблемы, отвечающее следующим моим ограничениям:

  1. Я буду отправлять HTTPS-запросы только на один URL: https://api.mailgun.net
  2. Объем памяти, доступный на ардуино, строго ограничен
  3. Я планирую использовать этот Arduino в полевых условиях. После того, как я разверну его, я больше не смогу физически получить к нему доступ, чтобы вручную обновить любые сертификаты с истекшим сроком действия. Но модуль Arduino должен иметь возможность отправлять HTTP-запросы на https://api.mailgun.net на неограниченный срок.
  4. Я планирую развернуть не только этот модуль Arduino, но и целую группу устройств Arduino с аналогичным функционированием и той же функциональностью. И мне нужно свести стоимость любых сертификатов к абсолютному минимуму.
    #include <WiFiNINA.h>
    #include <ArduinoHttpClient.h>

    #define REMOTE_SERVER_DOMAIN "api.mailgun.net"
    #define REMOTE_SERVER_PORT 443
    #define MAILGUN_USER "my-user"
    #define MAILGUN_PASSWORD "my-secret"

    bool sendEmailViaHTTPS()
    {
        WiFiClient wifiClient;
        HttpClient httpClient = HttpClient(wifiClient, REMOTE_SERVER_DOMAIN, REMOTE_SERVER_PORT);
        httpClient.beginRequest();
        httpClient.post("/v3/sandbox7d1aaf2f157f42d8844b1ac4c38a0ef7.mailgun.org/messages");
        httpClient.sendHeader("Content-Type", "application/x-www-form-urlencoded");
        httpClient.sendBasicAuth(MAILGUN_USER, MAILGUN_PASSWORD);
        String postData = String("from=Mailgun%20Sandbox%20%3Cpostmaster%40sandbox7d1aaf2f157f42d8844b1ac4c38a0ef7.mailgun.org%3E&to=Me%20%3Cmyemail%40gmail.com%3E&subject=Hello%20World1&text=Hello%20World2");
        httpClient.sendHeader("Content-Length", postData.length());
        httpClient.beginBody();
        httpClient.print(postData);
        httpClient.endRequest();
        int statusCode = httpClient.responseStatusCode();
        String response = httpClient.responseBody();
        Serial.print("Status code: ");
        Serial.println(statusCode);
        Serial.print("Response: ");
        Serial.println(response);
        return statusCode == 200;
    }

Как лучше всего разрешить моему Arduino отправлять HTTP-запросы, как указано выше, с наименьшими затратами и трудностями?

, 👍0

Обсуждение

Никаких сертификатов покупать не нужно. Только сервер (mailgun.net) требует купить сертификат, а не клиент (ваш Arduino). Чтобы проверить, действителен ли сертификат, который использует сервер, вам необходимо сохранить корневые сертификаты ЦС. Многие проекты Arduino пропускают этот шаг, так как он слишком сложен, или у Arduino недостаточно памяти/вычислительной мощности, чтобы справиться с этим., @Gerben


1 ответ


Лучший ответ:

1

Для безопасного TCP-соединения с библиотекой WiFiNINA используйте WiFiSSLClient вместо WiFiClient.

Прошивка Arduino в модуле NINA ESP32 имеет сертификаты известных центров сертификации, поэтому проверка сертификата сервера должна работать. При необходимости вы можете добавить открытые ключи сертификатов сервера в NINA.

,

Работал! Мне пришлось добавить корневой сертификат, соответствующий серверу, к которому я хотел получить доступ. Спасибо!, @Saqib Ali