您好,我是第一次在 Stackoverflow 上提问,请原谅我这次的错误。我使用带有 PlatformIO 的 VScode IDE 来使用 ESP32-WROOM-32U 连接到 Wi-Fi 并通过 MQTT 协议接收/发送整数到另一个组件。我已确认控制器能够成功连接 wifi。
如果不插入
extern PubSubClient client;
,我的 client.loop()
和 client.setServer(MQTT_SERVER, 1883)
都会出现“客户端未在此范围内声明”错误。插入 extern 让编译器了解“PubSubClient.h”应该可访问以进行声明后,我收到以下错误代码:
c:/users/user/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\esp32dev\src\main.cpp.o:(.literal._Z5setupv+0x2c): undefined reference to `client'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\esp32dev\firmware.elf] Error 1
我尝试过使用我在网上找到的其他东西,但它们没有帮助。这是我的文件:
将由 ESP32 执行的 main.cpp 文件:
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <ArduinoJson.h>
#include <ArduinoJson.hpp>
const char *SSID = "SSID_NAME";
const char *PASSWORD = "PASSWORD_PLACEHOLDER";
const char *MQTT_SERVER = "192.168.1.109"; // Change this to your MQTT broker IP address
//WiFiClient espClient;
//PubSubClient client(espClient);
extern PubSubClient client;
void callback(char* topic, byte* payload, unsigned int length) {
// handle the incoming message here
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
Serial.println(message);
}
void setup() {
Serial.begin(921600);
pinMode(26, OUTPUT);
WiFi.mode(WIFI_AP_STA);
WiFi.disconnect();
int n = WiFi.scanNetworks();
if (n == 0) {
Serial.println("no networks found");
}
else{
Serial.print(n);
Serial.println(" networks found");
}
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.println(WiFi.localIP());
client.setServer(MQTT_SERVER, 1883);
while (!client.connect("ESP32Client")) {
delay(1000);
Serial.println("Connecting to MQTT server...");
}
Serial.println("Connected to MQTT server");
client.subscribe("topic");
client.setCallback(callback);
}
void loop() {
digitalWrite(26, WiFi.status() == WL_CONNECTED);
delay(800);
// Your code here
client.loop();
}
platformio.ini 文件:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 921600
lib_deps =
knolleary/PubSubClient@^2.8
bblanchon/ArduinoJson@^6.20.1
我错误地找到了答案,它被隐藏在众目睽睽之下。
//WiFiClient espClient;
//PubSubClient client(espClient);
extern PubSubClient client;
将这些行更改为
extern PubSubClient client;
WiFiClient espClient;
PubSubClient client(espClient);
解决了问题。