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?

, 👍1


3 ответа


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

2

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, остается прежним.

,

Спасибо за ответ. Как я могу сообщить wifiMulti (или что-нибудь еще, если это не wifiMulti) мой сертификат? Я имею в виду строку espClient.setCertificate(ca_crt, ca_crt_len); в вопросе выше :-) Или эта часть остается прежней?, @arthur

Вы не говорите Wi-Fi. Вы говорите клиенту. Это совершенно отдельно от WiFi., @Majenko


0

Дополнительная информация по ответу @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);
    }
  }
}
,

0

Если вы используете только безопасное соединение без require_certificate в конфигурации mosquitto, просто измените espClient.setCertificate (ca_crt, ca_crt_len); к espClient.setCACert(ca_crt, ca_crt_len);

setCertiticate используется в основном для взаимной аутентификации.

,