EspMQTTClient внутри класса

Я пытаюсь использовать EspMQTTClient внутри класса с именем myIOT32.

Выдается ошибка, причину которой я не нахожу.

/home/guy/Documents/git/Arduino/libraries/myIOTesp32/myIOTesp32.cpp: In lambda function:
/home/guy/Documents/git/Arduino/libraries/myIOTesp32/myIOTesp32.cpp:25:5: error: 'this' was not captured for this lambda function
     client.publish("mytopic/test", "This is a message sent 5 seconds later");
     ^
/home/guy/Documents/git/Arduino/libraries/myIOTesp32/myIOTesp32.cpp:25:5: error: invalid use of non-static data member 'myIOT32::client'
In file included from /home/guy/Documents/git/Arduino/libraries/myIOTesp32/myIOTesp32.cpp:1:0:
/home/guy/Documents/git/Arduino/libraries/myIOTesp32/myIOTesp32.h:20:19: note: declared here
     EspMQTTClient client;
                   ^
Multiple libraries were found for "WiFi.h"
 Used: /home/guy/.arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFi
 Not used: /home/guy/arduino-1.8.12/libraries/WiFi
exit status 1
Error compiling for board LOLIN D32.
Файл

.h:

#ifndef myIOT32_h
#define myIOT32_h

// ОТА-библиотеки
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

#include "secrets.h"
#include "EspMQTTClient.h"
#include "Arduino.h"

class myIOT32
{
private:
    void onConnectionEstablished();  // <--- это обязательная функция (взято как есть из встроенного примера lib

public:
    EspMQTTClient client;
    myIOT32(char *ssid, char *wifi_p, char *mqtt_broker, char *mqttU, char *mqttP, char *devTopic, int port = 1883);
};

#endif
Файл

.cpp:

#include "myIOTesp32.h"

myIOT32::myIOT32(char *ssid, char *wifi_p, char *mqtt_broker, char *mqttU, char *mqttP, char *devTopic, int port)
    : client(ssid, wifi_p, mqtt_broker, mqttU, mqttP, devTopic, port)
{
}

void myIOT32::onConnectionEstablished()
{
  // Подписка на "mytopic/test" и отображение полученного сообщения в Serial
  client.subscribe("mytopic/test", [](const String & payload) {
    Serial.println(payload);
  });

  // Подписка на "mytopic/wildcardtest/#" и отображение полученного сообщения в Serial
  client.subscribe("mytopic/wildcardtest/#", [](const String & topic, const String & payload) {
    Serial.println(topic + ": " + payload);
  });

  // Публикуем сообщение в "mytopic/test"
  client.publish("mytopic/test", "This is a message"); // Вы можете активировать флаг сохранения, установив для третьего параметра значение true

  // Выполнение отложенных инструкций
  client.executeDelayed(5 * 1000, []() {
    client.publish("mytopic/test", "This is a message sent 5 seconds later");
  });
}

Будем признательны за любую помощь в создании такого класса

, 👍0

Обсуждение

переупорядочивание Arduino.h не помогло., @Guy . D


1 ответ


1

Для исправления просто добавьте эталонный захват, и он должен нормально скомпилироваться:

   // Выполнение отложенных инструкций
  client.executeDelayed(5 * 1000, [&]() {   // [&] вместо []
    client.publish("mytopic/test", "This is a message sent 5 seconds later");
  });

Я не смог проверить, но вам придется применить и к другим функциям.

[] Capture nothing 
[&] Capture any referenced variable by reference 
[=] Capture any referenced variable by making a copy
,