mlesniew / PicoMQTT

ESP MQTT client and broker library
GNU Lesser General Public License v3.0
236 stars 25 forks source link

EspHome MQTT and PubSubClient clients do not connect to PicoMQTT running on ESP32-S3 #27

Closed agozie closed 7 months ago

agozie commented 7 months ago

Great project, I am able to connect and send data to the PicoMQTT broker from node-red and from mosquito-cli clients on my mac. But EspHome MQTT and PubSubClient running on an ESP8266 and ESP32-C3 could not connect. I know that I can use PicoMQTT as a client too but I have existing projects using PubSubClient and EspHome that I want to use PicoMQTT as their broker. Here is my PubSubClient client code:

`#include

define BUILTIN_LED 12

define MQTT_VERSION 4

include

include

include

const char *ssid = ""; const char password = ""; const char *mqtt_server = "192.168.1.207";

WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0;

define MSG_BUFFER_SIZE (80)

char msg[MSG_BUFFER_SIZE]; int value = 0;

void setup_wifi() {

delay(1000); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);

WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }

randomSeed(micros());

Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); }

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();

// Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH } }

void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "hubtest"; // clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }

void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); // client.setSocketTimeout(20000); client.setServer(mqtt_server, 1883); client.setCallback(callback); }

void loop() {

if (!client.connected()) { reconnect(); } client.loop();

// delay(100);

unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf(msg, MSG_BUFFER_SIZE, "{\"hello\":\"#%ld\"}", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } }`

I get Attempting MQTT connection...failed, rc=-2 try again in 5 seconds with PubSubClient. I've spent 3 days already, trying to solve this.

agozie commented 7 months ago

This worked after restarting my router and wifi.