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");
});
}
Будем признательны за любую помощь в создании такого класса
@Guy . D, 👍0
Обсуждение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
,
@Codebreaker007
Смотрите также:
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Массив динамического размера в качестве члена класса
- Как перебрать объекты или передать объект функции?
- Прерывания внутри класса, связанные с функцией класса
- Присоедините функцию Arduino ISR к члену класса
- Недопустимое использование нестатической функции-члена
- Передача HardwareSerial и SoftwareSerial как свойства класса
переупорядочивание
Arduino.h
не помогло., @Guy . D