PubSubClient
PubSubClient is an Arduino library to do simple publish/subscribe commands against a MQTT server. This library works with various hardware including the ESP8266 and ESP32.
Usage
Install the library from the Arduino library manager. The setup code involves setting the servername and port. The loop code ensures that the MQTT connection is kept alive.
#include <PubSubClient.h>
PubSubClient client(espClient);
long lastReconnectAttempt = 0;
void setup() {
client.setServer(mqtt_server, atoi(mqtt_port));
client.setCallback(mqtt_callback);
}
void loop() {
if (!client.connected()) {
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
// Attempt to reconnect
if (mqtt_reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
// Client connected
client.loop();
}
}
bool mqtt_reconnect() {
// use a demo client name for now
if (client.connect("ESPDemo")) {
// send to system a reconnected message.
client.publish("system", "MQTT connection established");
}
return client.connected();
}
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
}
void mqtt_publish(char* message) {
client.publish(mqtt_topic, msg);
}
Troubleshooting
Messages not sent
There is a default maximum packet size of 128 bytes. If you try to publish a message which results in a packet greater than 128 bytes, the message will be silently dropped. To fix this, you will need to edit MQTT_MAX_PACKET_SIZE
value to a sufficiently large value. I tried to define before including the PubSubClient.h
header but it didn't appear to work. You may need tot actually edit the header file directly located at %USERPROFILE%\Documents\Arduino\libraries\PubSubClient\src
.
// MQTT_MAX_PACKET_SIZE : Maximum packet size
#ifndef MQTT_MAX_PACKET_SIZE
#define MQTT_MAX_PACKET_SIZE 512
#endif
See Also