IoT Controll ESP32 | EMQX | Over VPS Guide

EMQX & ESP32 LED Setup

EMQX & ESP32 LED Control — Setup Guide

# Host EMQX

  1. Image name
    • emqx/emqx
  2. 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:

  1. Use MQTT over WebSocket:
    • Broker URL: ws://185.199.53.184:8083/mqtt
    • Username: dashboard
    • Password: 12345678
  2. Use the npm package mqtt
  3. Create a simple page with:
    • Connection status (Connected / Disconnected)
    • LED status (ON / OFF)
    • Two buttons: Turn ON, Turn OFF
  4. Topics:
    • Publish to: devices/device1/led/set
    • Subscribe to: devices/device1/led/status
  5. When the page loads: connect to MQTT, subscribe to devices/device1/led/status, update LED status when message arrives
  6. Use a client component ("use client") because MQTT runs in browser
  7. Keep it minimal and clean
  8. No backend required
  9. Provide full working file structure and code

# If You Want It Production-Ready (Secure)

Use secure WebSocket:

wss://185.199.53.184:8084/mqtt




Post a Comment

If you have any doubts, please let me know

Previous Post Next Post