在Arduino WeMos D1 R32中无法通过PubSubClient.h接收订阅的消息

时间:2019-12-13 16:16:17

标签: arduino mqtt arduino-ide esp32

我正在使用Arduino Wemos Esp32 D1 R32。 我正在尝试在Arduino板和MQTT代理之间建立MQTT连接。 当我尝试从Arduino发送消息时,它工作正常。 (我使用上拉按钮发送消息。)每当我按下按钮时,就会发送一条消息。 但是,当我尝试读取一条消息并使用回调函数将其写在Serial上时,它根本不起作用。 有人可以帮我解决这个问题吗?

这是我的代码:

[code]
#include <ETH.h>
#include <WiFi.h>
#include <WiFiAP.h>
#include <WiFiClient.h>
#include <WiFiGeneric.h>
#include <WiFiMulti.h>
#include <WiFiScan.h>
#include <WiFiServer.h>
#include <WiFiSTA.h>
#include <WiFiType.h>
#include <WiFiUdp.h>


#include <PubSubClient.h>


#define BUFFER_SIZE 100
#define pinBotao1 25  //input botao pullup
#define led 26        //output acende led
#define pot 4         //input Resistor

//WiFi
const char* SSID = "******";                // SSID / nome da rede WiFi que deseja se conectar
const char* PASSWORD = "******";   // Senha da rede WiFi que deseja se conectar
WiFiClient wifiClient;                        

//MQTT Server
const char* BROKER_MQTT = "mqtt.eclipse.org"; //URL do broker MQTT que se deseja utilizar
int BROKER_PORT = 1883;                      // Porta do Broker MQTT
#define ID_MQTT  "BCI0111"            
#define TOPIC_PUBLISH "BCIBotao111"   



PubSubClient MQTT(wifiClient);        // Instancia o Cliente MQTT passando o objeto espClient

//Declaração das Funções
void mantemConexoes();  //Garante que as conexoes com WiFi e MQTT Broker se mantenham ativas
void conectaWiFi();     //Faz conexão com WiFi
void conectaMQTT();     //Faz conexão com Broker MQTT
void enviaPacote();     //Envia uma mensagem ao Broker.

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Message arrived [");
 Serial.print(topic);
 Serial.print("] ");
 for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
 }
 Serial.println();
 }

void setup() {
  pinMode(pinBotao1, INPUT_PULLUP);
  pinMode(led, OUTPUT);         

  Serial.begin(115200);

  conectaWiFi();
  MQTT.setServer(BROKER_MQTT, BROKER_PORT);   
  MQTT.setCallback(callback);
}

void loop() {
  mantemConexoes();
  enviaValores();
  MQTT.loop();
}

void mantemConexoes() {
    if (!MQTT.connected()) {
       conectaMQTT(); 
    }

    conectaWiFi(); //se não há conexão com o WiFI, a conexão é refeita
}

void conectaWiFi() {

  if (WiFi.status() == WL_CONNECTED) {
     return;
  }

  Serial.print("Conectando-se na rede: ");
  Serial.print(SSID);
  Serial.println("  Aguarde!");

  WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI  
  while (WiFi.status() != WL_CONNECTED) {
      delay(1000);
      Serial.print(".");
      WiFi.begin(SSID, PASSWORD);
  }

  Serial.println();
  Serial.print("Conectado com sucesso, na rede: ");
  Serial.print(SSID);  
  Serial.print("  IP obtido: ");
  Serial.println(WiFi.localIP()); 
}

void conectaMQTT() { 
    while (!MQTT.connected()) {
        Serial.print("Conectando ao Broker MQTT: ");
        Serial.println(BROKER_MQTT);
        //if (MQTT.connect(ID_MQTT,USER_MQTT,PASSWORD_MQTT)) {
        if (MQTT.connect(ID_MQTT)) {
            Serial.println("Conectado ao Broker com sucesso!");
        } 
        else {
            Serial.println("Nao foi possivel se conectar ao broker.");
            Serial.println("Nova tentativa de conexao em 10s");
            delay(10000);
        }
    }
}

void enviaValores() {
  bool estadoBotao1;
  int estadoPot;

  estadoBotao1 = digitalRead(pinBotao1);
  estadoPot = char(analogRead(pot));

  if (estadoBotao1==LOW) {

        //Botao Apertado     
        MQTT.publish(TOPIC_PUBLISH, "estadoPot");
        Serial.println("Botao1 APERTADO. Payload enviado.");

     }
     delay(1000);
}

1 个答案:

答案 0 :(得分:0)

您需要订阅一个或多个主题才能接收消息。通常,您在连接到MQTT后订阅您感兴趣的主题,但也可以根据应用程序的逻辑在其他时间订阅。

在这种情况下,您可以像这样更改conectaMQTT

void conectaMQTT() { 
    while (!MQTT.connected()) {
        Serial.print("Conectando ao Broker MQTT: ");
        Serial.println(BROKER_MQTT);
        //if (MQTT.connect(ID_MQTT,USER_MQTT,PASSWORD_MQTT)) {
        if (MQTT.connect(ID_MQTT)) {
            Serial.println("Conectado ao Broker com sucesso!");
            if (MQTT.subscribe(TOPIC_SUBSCRIBE)) {
                Serial.println("Succesful subscription.");
            } else {
                Serial.println("Subscription failed.");
            }
        } 
        else {
            Serial.println("Nao foi possivel se conectar ao broker.");
            Serial.println("Nova tentativa de conexao em 10s");
            delay(10000);
        }
    }
}