Решение, необходимое для отправки HTTP-запросов с нескольких модулей Arduino в полевых условиях.
Я использую библиотеку Arduino Wifi Nina для подключения Arduino Uno Wifi Rev2 к Wi-Fi, а затем с помощью Библиотека HTTP-клиента Arduino для выполнения HTTP-вызовов в Интернет. Это работает. Однако, когда я переключаюсь с HTTP на HTTPs (т.е. переключаю порт на 443 с 80), приведенный ниже код дает сбой. Я понимаю, это потому, что у меня нет сертификата на Arduino. Мне нужно купить/получить сертификат и загрузить его в Arduino.
Мне нужно найти решение этой проблемы, отвечающее следующим моим ограничениям:
- Я буду отправлять HTTPS-запросы только на один URL: https://api.mailgun.net
- Объем памяти, доступный на ардуино, строго ограничен
- Я планирую использовать этот Arduino в полевых условиях. После того, как я разверну его, я больше не смогу физически получить к нему доступ, чтобы вручную обновить любые сертификаты с истекшим сроком действия. Но модуль Arduino должен иметь возможность отправлять HTTP-запросы на https://api.mailgun.net на неограниченный срок.
- Я планирую развернуть не только этот модуль 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-запросы, как указано выше, с наименьшими затратами и трудностями?
@Saqib Ali, 👍0
Обсуждение1 ответ
Лучший ответ:
Для безопасного TCP-соединения с библиотекой WiFiNINA используйте WiFiSSLClient вместо WiFiClient.
Прошивка Arduino в модуле NINA ESP32 имеет сертификаты известных центров сертификации, поэтому проверка сертификата сервера должна работать. При необходимости вы можете добавить открытые ключи сертификатов сервера в NINA.
Работал! Мне пришлось добавить корневой сертификат, соответствующий серверу, к которому я хотел получить доступ. Спасибо!, @Saqib Ali
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- TCCR1B' не был объявлен в этой области
- avrdude: usbdev_open(): невозможно открыть устройство: в доступе отказано
- Пароль MD5 в Sketch
- Строка JSON для Arduino WiFi версии 2
- Могу ли я обойти очень долгое время, чтобы настроить WIFI-соединение WPA2 Personal?
- Отправка значений из arduino uno в wemos d1 r1
- Ошибка Udp.endPacket
Никаких сертификатов покупать не нужно. Только сервер (mailgun.net) требует купить сертификат, а не клиент (ваш Arduino). Чтобы проверить, действителен ли сертификат, который использует сервер, вам необходимо сохранить корневые сертификаты ЦС. Многие проекты Arduino пропускают этот шаг, так как он слишком сложен, или у Arduino недостаточно памяти/вычислительной мощности, чтобы справиться с этим., @Gerben