Mosquitto TLS через WifiMulti на ESP8266
С помощью этих нескольких строк я могу прикрепить свой сертификат, передать его WifiClientSecure
сертификату, запустить wifi
, а также mosquito pubsubclient
:
WiFiClientSecure espClient;
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
PubSubClient mqtt_client(espClient);
mqtt_client.setServer(mqtt_server, 8883);
mqtt_client.setCallback(mqtt_callback);
espClient.setCertificate(ca_crt, ca_crt_len);
if (!mqtt_client.connected()) {
mqtt_reconnect();
}
mqtt_client.loop();
С помощью этих строк я могу подключиться к Wi-Fi, в зависимости от ближайшей станции:
ESP8266WiFiMulti wifiMulti;
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
wifiMulti.run();
Как я могу совместить оба? Т.е. меня интересует отправка данных для защиты MQTT по набору возможных сетей Wi-Fi?
@arthur, 👍1
3 ответа
Лучший ответ:
WiFiMulti вообще не имеет ничего общего с MQTT и TLS. Это имеет какое-то отношение только к Wi-Fi. Таким образом, он просто заменяет код, напрямую взаимодействующий с WiFi.
То есть этот код:
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
заменяется этим в глобальном масштабе:
ESP8266WiFiMulti wifiMulti;
Это в setup():
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
и это в loop()
:
wifiMulti.run();
Все, что касается MQTT, остается прежним.
Дополнительная информация по ответу @Majenko.
#include <WiFiClientSecure.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
WiFiClientSecure espClient;
#include <PubSubClient.h>
PubSubClient mqtt_client(espClient);
Serial.println("setup_wifi_multi_addAP()");
wifiMulti.addAP("ap1", "pass1");
wifiMulti.addAP("ap2", "pass2");
wifiMulti.addAP("ap3", "pass3");
while (wifiMulti.run() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
mqtt_client.setServer(mqtt_server, 8883);
mqtt_client.setCallback(mqtt_callback);
espClient.setCertificate(ca_crt, ca_crt_len);
if (!mqtt_client.connected()) {
mqtt_reconnect();
}
mqtt_client.loop();
void mqtt_reconnect() {
Serial.println("mqtt_reconnect()");
// Цикл, пока мы снова не подключимся
while (!mqtt_client.connected()) {
Serial.print("Attempting MQTT connection...");
if (mqtt_client.connect("ESP8266mqtt_client-1")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(mqtt_client.state());
Serial.println(" try again in 5 seconds");
// Подождите 5 секунд перед повторной попыткой
delay(5000);
}
}
}
Если вы используете только безопасное соединение без require_certificate в конфигурации mosquitto, просто измените espClient.setCertificate (ca_crt, ca_crt_len); к espClient.setCACert(ca_crt, ca_crt_len);
setCertiticate используется в основном для взаимной аутентификации.
- Можно ли загрузить частный корневой сертификат в Arduino Nano33?
- Как подключиться к Arduino с помощью WiFi?
- ESP8266 не подключается к Wi-Fi
- В чем разница между вариантами RF (wifi, xbee, NRF24L01)
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
- WebSocketsServer.h: No such file or directory
- Как отключить или остановить точку доступа в ESP8266?
Спасибо за ответ. Как я могу сообщить
wifiMulti
(или что-нибудь еще, если это неwifiMulti
) мой сертификат? Я имею в виду строкуespClient.setCertificate(ca_crt, ca_crt_len);
в вопросе выше :-) Или эта часть остается прежней?, @arthurВы не говорите Wi-Fi. Вы говорите клиенту. Это совершенно отдельно от WiFi., @Majenko