EMQX & ESP32 LED Control — Setup Guide
# Host EMQX
-
Image name
emqx/emqx
-
Network
- Ports exposed: 18083
Port mappings: 1883:1883,8083:8083
Deploy it.
Also, open the firewall:
sudo ufw allow 1883
sudo ufw allow 8083
sudo ufw allow 18083
# Access Dashboard
STEP 1 — Log in to EMQX
User: admin
Pass: public
Change password after login.
STEP 2 — Enable Authentication
Access Control → Authentication
Create → Password-Based → Built-in Database
STEP 3 — Create Users
Authentication → User Management
User 1 (ESP32)
- Username: device1
- Password: strongpassword
- Superuser: NO
User 2 (Browser / Dashboard)
- Username: dashboard
- Password: strongpassword2
- Superuser: NO
STEP 4 — Enable Authorization (ACL)
Access Control → Authorization
Create → Built-in Database → Permissions
STEP 5 — Add Rules
- Rule 1 — ESP32 Subscribe
Username: device1 · Action: Subscribe · Topic:devices/device1/led/set - Rule 2 — ESP32 Publish
Username: device1 · Action: Publish · Topic:devices/device1/led/status - Rule 3 — Browser Publish
Username: dashboard · Action: Publish · Topic:devices/device1/led/set - Rule 4 — Browser Subscribe
Username: dashboard · Action: Subscribe · Topic:devices/device1/led/status
What We Just Built
Secure flow:
Browser → publish → devices/device1/led/set
ESP32 → subscribe → devices/device1/led/set
ESP32 → publish → devices/device1/led/status
Browser → subscribe → devices/device1/led/status
# ESP32 Connect Settings
client.setServer("YOUR_SERVER_IP", 1883);
client.connect("device1", "device1", "strongpassword");
client.subscribe("devices/device1/led/set");
# Complete ESP32 Code
#include <WiFi.h>
#include <PubSubClient.h>
/* ---------- WIFI CONFIG ---------- */
const char* ssid = "Code_2.4Ghz";
const char* wifi_password = "code95187";
/* ---------- MQTT CONFIG ---------- */
const char* mqtt_server = "185.199.53.184"; // Example: 123.45.67.89
const int mqtt_port = 1883;
const char* mqtt_username = "device1";
const char* mqtt_password = "12345678";
/* ---------- LED ---------- */
#define LED_PIN 2 // Built-in LED (usually GPIO2)
/* ---------- CLIENTS ---------- */
WiFiClient espClient;
PubSubClient client(espClient);
/* ---------- MQTT CALLBACK ---------- */
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received: ");
Serial.println(message);
if (message == "ON") {
digitalWrite(LED_PIN, HIGH);
client.publish("devices/device1/led/status", "ON");
}
else if (message == "OFF") {
digitalWrite(LED_PIN, LOW);
client.publish("devices/device1/led/status", "OFF");
}
}
/* ---------- WIFI CONNECT ---------- */
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
/* ---------- MQTT RECONNECT ---------- */
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("device1", mqtt_username, mqtt_password)) {
Serial.println("MQTT Connected");
client.subscribe("devices/device1/led/set");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
/* ---------- SETUP ---------- */
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
/* ---------- LOOP ---------- */
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
# Prompt To Generate Simple Next.js MQTT Test App
Create a simple Next.js 14 (App Router) application that connects to an MQTT broker via WebSocket and controls an ESP32 built-in LED.
Requirements:
- Use MQTT over WebSocket:
- Broker URL:
ws://185.199.53.184:8083/mqtt - Username: dashboard
- Password: 12345678
- Broker URL:
- Use the npm package
mqtt - Create a simple page with:
- Connection status (Connected / Disconnected)
- LED status (ON / OFF)
- Two buttons: Turn ON, Turn OFF
- Topics:
- Publish to:
devices/device1/led/set - Subscribe to:
devices/device1/led/status
- Publish to:
- When the page loads: connect to MQTT, subscribe to
devices/device1/led/status, update LED status when message arrives - Use a client component (
"use client") because MQTT runs in browser - Keep it minimal and clean
- No backend required
- Provide full working file structure and code
# If You Want It Production-Ready (Secure)
Use secure WebSocket:
wss://185.199.53.184:8084/mqtt

