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[edit | edit source]

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

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

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[edit | edit source]

Messages not sent[edit | edit source]

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

See Also[edit | edit source]