简体   繁体   English

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

[英]Not able to Receive subscribed Message with PubSubClient.h in Arduino WeMos D1 R32

I'm using Arduino Wemos Esp32 D1 R32.我正在使用 Arduino Wemos Esp32 D1 R32。 I'm trying to make an MQTT connection between My Arduino board and a MQTT Broker.我正在尝试在我的 Arduino 板和 MQTT 代理之间建立 MQTT 连接。 When I try to send messages from my Arduino, It works just fine.当我尝试从我的 Arduino 发送消息时,它工作得很好。 (I'm using a pullup button to send a message.) Whenever I press the button a message is sent. (我正在使用上拉按钮发送消息。)每当我按下按钮时,就会发送一条消息。 But when I try to read a message and write it on the Serial with the callback function it just doesn't work.但是当我尝试读取一条消息并使用回调函数将其写入 Serial 时,它就不起作用了。 Could someone please help me with that issue?有人可以帮我解决这个问题吗?

Here is my code:这是我的代码:

[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);
}

You need to subscribe to one or more topics to receive messages.您需要订阅一个或多个主题才能接收消息。 Typically you subscribe to the topic(s) you are interested in after connecting to MQTT, but you may also subscribe at other times based on your app's logic.通常,您在连接到 MQTT 后订阅您感兴趣的主题,但您也可以根据应用程序的逻辑在其他时间订阅。

In this case you can change conectaMQTT like this:在这种情况下,您可以像这样更改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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM