Является ли это объявление класса неправильным? Ошибка "Declaration has no storage class or type specifier"

При попытке настроить ESP32 как издателя mqtt я получаю странные ошибки. Вот мой код:

#include "mqttSetup.h"
#include <WiFi.h>
#include <PubSubClient.h>

static byte httpFailCounter = 0;
byte counter = 0;

const char *ssid = "SSID";
// const char *password = "xxxxx";
const char *passphrase = "xxxxx";

WiFiClient espClient;

const char *mqtt_server = "192.168.1.39";
const int mqttPort = 1883;
const char *mqttUser = "xxxx";
const char *mqttPassword = "xxxxx";

PubSubClient pubClient(espClient);

pubClient.setServer(mqtt_server, mqttPort); 

void checkConnection()
{
    if (WiFi.status() == WL_CONNECTED)
    {
        counter = 0; //reset counter
    }
    else if (WiFi.status() != WL_CONNECTED)
    {
        WiFi.begin(ssid, passphrase);
    }
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");

        counter++;
        if (counter >= 60)
        {
            ESP.restart();
        }
    }
}

void reconnect()
{
 
    while (!pubClient.connected())
    {
        Serial.print("Attempting MQTT connection...");
        // Create a random client ID
        const char *clientID = "ESP32D-MQTT";
        // Attempt to connect
        if (pubClient.connect(clientID))
        {
            Serial.println("connected");
            // Once connected, publish an announcement...
            pubClient.publish("outTopic", "Hello from ESP");
            // ... and resubscribe
            //   client.subscribe("inTopic");
        }
        else
        {
            Serial.print("failed, rc=");
            Serial.print(pubClient.state());
            Serial.println(" try again in 5 seconds");
            // Wait 5 seconds before retrying
            delay(5000);
        }
    }
}

Я не понимаю, почему компилятор выплевывает следующие две ошибки:

this declaration has no storage class or type specifier (referring to my pubClient declaration)

expected a ';'

У него нет никаких проблем, когда я объявляю pubClient, но в строке :

pubClient.setServer(mqtt_server, mqttPort);

там, где я использую pubClient, он выдает ошибку.

Кроме того, я не вижу ничего недостающего в коде.

Не могли бы вы помочь мне выяснить источник ошибки?


Заголовочный файл для этого фрагмента кода

#ifndef MQTTSETUP_H
#define MQTTSETUP_H



void checkConnection();
void reconnect();


#endif

------------ Основной скетч - - - - - - - - - -

#include <Arduino.h>
#include "Wire.h"
#include "tempSensor.h"
#include "mqttSetup.h"




void setup()
{
  Wire.begin();

  Serial.begin(115200);
  while (!Serial)
    ;

  shtBegin();
  checkConnection();
}

void loop()
{
  uint32_t newTime = millis();
  static uint32_t oldTime = 0;
  static uint32_t t2 = 0;

  float temp = 0.0;
  float humid = 0.0;

  char senVals[50];

  if (newTime - oldTime >= 10000)
  {
    oldTime = newTime;

    readsht(temp, humid);
    snprintf(senVals, 50, "Temp: %.2f Humid: %.2f", temp, humid);
    Serial.println(senVals);

  }
}

, 👍0


1 ответ


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

0

Код идет в функциях, а не в глобальной области видимости.

Ваша линия

pubClient.setServer(mqtt_server, mqttPort);

должно быть, внутри функции. Скорее всего, setup (), поэтому он вызывается при запуске вашей программы.

Кстати, где setup() и loop() - две функции, которые требуются кодом Arduino?

,

Этот фрагмент кода содержится в отдельном файле .cpp. Я пытался сохранить основной скетч чистым от настроек и определений функций для разных компонентов. Вот почему вы не видите главного скетча. Я намеревался вызвать только функцию публикации (еще не реализованную в моем коде) в основном скетче. Я обновлю свой пост заголовочным файлом и основным скетчем, @Zaffresky

@Zaffresky Тогда вы должны обернуть эту строку в функцию, которую затем можете вызвать из "setup()`., @Majenko

Я обновил свой пост основным скетчем и соответствующим заголовочным файлом. Я не совсем понимаю, почему я должен поместить строку "PubClient.setServer(mqtt_server, mqttPort);" в новую функцию. Насколько я понимаю, функция PubClinet.serServer уже определена в библиотеке PubSubClient и в моем отдельном mqttSetup.cpp файл Я вызывал эту функцию, чтобы этот файл был самодостаточным, и мне не нужно было вызывать какие-либо библиотечные функции PubSubClient непосредственно в главном скетче. Скорее всего, я бы вызвал свою функцию publishMQTT() только в главном скетче. Является ли этот подход неправильным?, @Zaffresky

@Zaffresky Потому что ** код идет в функциях, а не в глобальной области **. Все, что вы вызываете во время последовательности выполнения вашей программы, * должно * идти в функции. Единственное, что может входить в глобальную область видимости, - это объявления переменных (с непосредственным назначением или без него)., @Majenko

Теперь я это вижу. Я не рассматривал область действия в этом отдельном файле .cpp. Я ошибочно предположил, что понятие масштаба применимо только к основному скетчу. Спасибо за разъяснение, @Zaffresky