簡體   English   中英

無法在 Arduino WeMos D1 R32 中使用 PubSubClient.h 接收訂閱的消息

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

我正在使用 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);
}

您需要訂閱一個或多個主題才能接收消息。 通常,您在連接到 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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM