arduino-libraries / ArduinoMqttClient

ArduinoMqttClient Library for Arduino
GNU Lesser General Public License v2.1
187 stars 73 forks source link

onMessage #36

Closed jesawyers closed 4 years ago

jesawyers commented 4 years ago

First Comment…It works great to Publish Topics.

I fought PubSubClient for a week and could not get it to work.

I used ArduinoMQTT for 10 minutes and it worked perfect to Publish Topics.

First my setup…

Sparkfun Redboard (I live in Colorado so shipping is cheap) Sparkfun ESP8266 WiFi shield.

No problem connecting to my WiFi and Publishing a topic. I use MQTT Explorer to Subscribe to the Topic I'm publishing (myHome/heartbeat) and there are no issues.

When I publish a topic from MQTT Explorer (myHome/FrontDoor/open) and subscribe from the Redboard, the onMessage routine is not triggered when I publish the topic from MQTT Explorer.

Here is my current code...

#include <SoftwareSerial.h>
#include <SparkFunESP8266WiFi.h>
#include <ArduinoMqttClient.h>
//*************************************************************************

#define WLAN_SSID   "MAGA2020"
#define WLAN_PASS   "Fido2020"
#define myMQTTID    "MAGA-2a20a1b2"
//*************************************************************************
unsigned long previousMillis = 0;
unsigned int count           = 0;

IPAddress     MQTT_BROKER(192,168,33,201);
ESP8266Client myWiFiClient;
MqttClient    myMQTTClient(myWiFiClient);

// Forward declaration
void OnMQTTMessage(int messageSize);

//*************************************************************************
void setup() {

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

   Serial.print("Initializing ESP8266 WiFi Shield");
   while (!esp8266.begin()) 
      Serial.print(".");

   Serial.print("\nSuccessfully Connected to ESP8266 WiFi Shield");

   Serial.print(" WiFi Mode = ");
   Serial.println(esp8266.getMode());

   Serial.print("\nConnecting to WiFi SSID: ");
   Serial.println(WLAN_SSID);;

   while (esp8266.connect(WLAN_SSID, WLAN_PASS) < 0) { 
      delay(500);
      Serial.print(".");
   } // END WHILE

    delay(2000);

    Serial.print("Connecting to MQTT Broker at IP: ");
    Serial.println(MQTT_BROKER);

    myMQTTClient.setId(myMQTTID);

    if (!myMQTTClient.connect(MQTT_BROKER)) {
       Serial.print("MQTT Connection Failed.  Error Code = ");
       Serial.println(myMQTTClient.connectError());
       while(1);
    }

    Serial.println("\Sucessfully Connected to MQTT Broker.");

    myMQTTClient.onMessage(OnMQTTMessage);

    myMQTTClient.subscribe("myHome/FrontDoor/open", 0);

    Serial.println("Setup Complete");

    delay(2000);
} // END SETUP
//*************************************************************************
void loop() {

    myMQTTClient.poll();

    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= 15000) {

        String payload = "";
        payload+= count;

        previousMillis = currentMillis;
        if (count < 5)
             Serial.println("Publishing Topic");
        myMQTTClient.beginMessage("myHome/heartbeat",payload.length(),false,1,false);
        myMQTTClient.print(payload);
        myMQTTClient.endMessage();

        count++;
    }

} // END MAIN LOOP

//*************************************************************************
//*********************************************************************
void OnMQTTMessage(int messageSize) {

    Serial.print("Got Message from Broker ");
    Serial.println(myMQTTClient.messageTopic());
}
jesawyers commented 4 years ago

Going to use Arduino Forums

bryantamayo1 commented 1 month ago

Hi! Nowadays , I work with ESP32 and ArduinoMqttClient 0.1.8 by Arduino library and WiFi.h library that comes with ESP32 core for Arduino. If you just want to create a publisher from ESP32 this code works for me:

// File main.ino
#include <WiFi.h>
#include <ArduinoMqttClient.h>

// WIFI
WiFiClient wifiClient;
const char *ssid = "WIFI_SSID";         // WiFi ssid
const char *password = "WIFI_PASSWORD"; // WiFi password

// MQTT
MqttClient mqttClient(wifiClient);
const char mqtt_username[] = "MQTT_USERNAME";
const char mqtt_password[] = "MQTT_PASSWORD";
char mqtt_client_id[] = "MQTT_CLIENT_ID";
const char mqtt_broker_url[] = "MQTT_BROKER_URL";
int mqtt_broker_port = "MQTT_BROKER_PORT";

void setupWifi()
{
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("Connecting to WiFi ...");
  }

  Serial.println("WiFi connected");
  Serial.println("IP address set: ");
  Serial.println(WiFi.localIP());
  Serial.println("[wifi] is ok");
}

void setupMqtt()
{
  mqttClient.setId(mqtt_client_id);
  mqttClient.setUsernamePassword(mqtt_username, mqtt_password);
  while (!mqttClient.connect(mqtt_broker_url, mqtt_broker_port))
  {
     delay(1000);
     Serial.print("[mqtt] connection failed! Error code = ");
     Serial.println(mqttClient.connectError());
  }
  Serial.println("[mqtt] is ok");
}

void setup()
{
 setupWifi();
 setupMqtt();
}

void loop()
{
  // To avoid being disconnected by the broker and keep the
  // connection alive
  mqttClient.poll();
  mqttClient.beginMessage("topic");
  mqttClient.print("your_msg");
  mqttClient.endMessage();
  delay(2000);
}