ESP8266 NodeMCU Module MQTT
MQTT (Message Queuing Telemetry Transport) is a lightweight publish/subscribe messaging protocol widely used in IoT applications. ESP8266 and NodeMCU modules can use MQTT to communicate with brokers over Wi-Fi. The protocol is efficient, requires minimal bandwidth, and supports real-time data transfer between devices. Here will see ESP8266 NodeMCU Module MQTT
Core MQTT Functions in NodeMCU
NodeMCU’s Lua firmware provides several built-in functions for MQTT:
| Function | Description |
|---|---|
mqtt.Client() | Creates a new MQTT client object with client ID, keepalive, username, and password. |
mqtt.client:connect() | Connects the client to the broker using the host, port, and optional security parameters. |
mqtt.client:close() | Closes the connection to the MQTT broker. |
mqtt.client:lwt() | Sets up a Last Will and Testament, a message published if the client disconnects unexpectedly. |
mqtt.client:on() | Registers callback functions for events like message arrival, connect, or offline. |
mqtt.client:publish() | Publishes a message to a topic. |
mqtt.client:subscribe() | Subscribes the client to one or more topics to receive messages. |
mqtt.client:unsubscribe() | Unsubscribes from topics. |
Basic MQTT Example (Publish & Subscribe)
- MQTT subscribe and publish the data to
-- Required Modules :Mqtt,Wifi
-- https://www.aruneworld.com/
-- Tested By : Arun(20170527)
-- Example Name : AEW_Mqtt.lua
---------------------------------------------------------------------------------
station_cfg={}
station_cfg.ssid= "ArunEworld" station_cfg.pwd= "ArunEworld.com" --please change your SSID and Passworld
print("wifi init")
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(station_cfg)
wifi.sta.connect()
--Initializing Mqtt
DEVICE_NAME = "ArunEworld-"..node.chipid()
PUBLISH_TOPIC = "ArunEworld/"..DEVICE_NAME.."-Result"
SUBSCRIBE_TOPIC = "ArunEworld/"..DEVICE_NAME
CLIENT_ID = DEVICE_NAME
USERNAME = "username" -- please change your username
PASSWORD = "Password" -- please change your Password
HOSTNAME = "mqtt.aruneworld.com" -- Please change your port
PORT = "Port_Number" -- Please change your port number
-- Mqtt Setup
m = mqtt.Client(CLIENT_ID, 120, USERNAME, PASSWORD, 0)
m:connect(HOSTNAME, PORT, 0, function(conn)
m:publish(PUBLISH_TOPIC,DEVICE_NAME.." is Online", 1, 0, function(conn) end)
m:subscribe(SUBSCRIBE_TOPIC, 1, function(conn) end)
end)
--Mqtt Receive function
m:on("message", function(client, topic, payload)
if payload ~= nil then
print(payload)
else
print("Mqtt Reccived nill payload message")
end
collectgarbage("collect")
end)
--Mqtt Send function
local function Send_MQTT(strings)
m:publish(PUBLISH_TOPIC,strings, 1, 0, function(conn) end)
end
--Wifi Event Monitoring
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
print("\n\tSTA - CONNECTED".."\n\tSSID: "..T.SSID.."\n\tBSSID: "..T.BSSID.."\n\tChannel: "..T.channel)
end)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
print("\n\tSTA - DISCONNECTED".."\n\tSSID: "..T.SSID.."\n\tBSSID: "..T.BSSID.."\n\treason: "..T.reason)
end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
print("\n\tSTA - GOT IP".."\n\tStation IP: "..T.IP.."\n\tSubnet mask: "..T.netmask.."\n\tGateway IP: "..T.gateway)
end)
- Wi-Fi Setup
Connect NodeMCU to a Wi-Fi network usingwifi.setmode(),wifi.sta.config(), andwifi.sta.connect(). Event monitoring viawifi.eventmon.register()helps track connection status, IP assignment, or disconnection. - MQTT Initialization
m = mqtt.Client(CLIENT_ID, 120, USERNAME, PASSWORD) m:connect(HOSTNAME, PORT, 0, function(conn) m:publish(PUBLISH_TOPIC, DEVICE_NAME.." is Online", 1, 0) m:subscribe(SUBSCRIBE_TOPIC, 1) end)
- Creates a client, connects to the broker, publishes an initial message, and subscribes to a topic.
- Message Handling
m:on("message", function(client, topic, payload) if payload then print(payload) end end)- Executes a callback whenever a message arrives on a subscribed topic.
- Publishing Function
local function Send_MQTT(msg) m:publish(PUBLISH_TOPIC, msg, 1, 0) end
- Can be called anywhere in the code to send messages to the broker.
Read and Write files using MQTT
- transfer files over mqtt
-- For More info :- https://www.aruneworld.com/
-- Tested By : Arun(20170527)
-- Required Modules : CJSON, FILE, MQTT, WiFi,
station_cfg={}
DEVICE_NAME = node.chipid()
station_cfg.ssid= "ArunEworld" station_cfg.pwd= "Arun"
PUBLISH_TOPIC = "MQTT_File_Ex_PUB"
SUBSCRIBE_TOPIC = "MQTT_File_Ex_SUB"
CLIENT_ID = DEVICE_NAME
USERNAME = ""
PASSWORD = ""
HOSTNAME = "iot.eclipse.org"
PORT = 1883
print("wifi init")
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(station_cfg)
wifi.sta.connect()
-- test transfer files over mqtt.
m_dis={} --Created the table and name is m_dis
function dispatch(m,t,pl)
if pl~=nil and m_dis[t] then
m_dis[t](m,pl)
end
end
function pubfile(m,filename)
file.close()
file.open(filename)
repeat
local pl=file.read(1024)
if pl then m:publish("/topic2",pl,0,0) end
until not pl
file.close()
end
-- payload(json): {"cmd":xxx,"content":xxx}
function topic1func(m,pl)
print("get1: "..pl)
local pack = cjson.decode(pl)
if pack.content then
if pack.cmd == "open" then file.open(pack.content,"w+")
elseif pack.cmd == "write" then file.write(pack.content)
elseif pack.cmd == "close" then file.close()
elseif pack.cmd == "remove" then file.remove(pack.content)
elseif pack.cmd == "run" then dofile(pack.content)
elseif pack.cmd == "read" then pubfile(m, pack.content)
end
end
end
m_dis["/topic1"]=topic1func
-- Lua: mqtt.Client(clientid, keepalive, user, pass)
--m=mqtt.Client()
m = mqtt.Client(CLIENT_ID, 20, USERNAME, PASSWORD, 0)
m:on("connect",function(m)
print("connection "..node.heap())
m:subscribe("/topic1",0,function(m) print("sub done") end)
m:publish(PUBLISH_TOPIC,DEVICE_NAME.." is Live", 1, 0, function(m) print("[LOG]:- Mqtt "..DEVICE_NAME.." is Live in Online Mode") end)
end )
m:on("offline", function(conn)
print("disconnect to broker...")
print(node.heap())
end)
m:on("message",dispatch )
-- Lua: mqtt:connect( host, port, secure, auto_reconnect, function(client) )
--m:connect(192.168.18.88,1883,0,1)
--host = "iot.eclipse.org"
m:connect(HOSTNAME,1883,0,1)
-- usage:
-- another client(pc) subscribe to /topic2, will receive the test.lua content.
-- and publish below message to /topic1
-- {"cmd":"open","content":"test.lua"}
-- {"cmd":"write","content":"print([[hello world]])\n"}
-- {"cmd":"write","content":"print(\"hello2 world2\")\n"}
-- {"cmd":"write","content":"test.lua"}
-- {"cmd":"run","content":"test.lua"}
-- {"cmd":"read","content":"test.lua"}
Advanced Use: File Transfer over MQTT
NodeMCU can transfer files using MQTT:
- Publish file in chunks
function pubfile(m, filename) file.open(filename) repeat local pl = file.read(1024) if pl then m:publish("/topic2", pl) end until not pl file.close() end - Receive commands via JSON payload
local pack = cjson.decode(payload) if pack.cmd == "write" then file.write(pack.content) end
This allows opening, writing, reading, executing, or deleting files on NodeMCU remotely.
MQTT to cloud
-- test with cloudmqtt.com
m_dis={}
function dispatch(m,t,pl)
if pl~=nil and m_dis[t] then
m_dis[t](m,pl)
end
end
function topic1func(m,pl)
print("get1: "..pl)
end
function topic2func(m,pl)
print("get2: "..pl)
end
m_dis["/topic1"]=topic1func
m_dis["/topic2"]=topic2func
-- Lua: mqtt.Client(clientid, keepalive, user, pass)
m=mqtt.Client("nodemcu1",60,"test","test123")
m:on("connect",function(m)
print("connection "..node.heap())
m:subscribe("/topic1",0,function(m) print("sub done") end)
m:subscribe("/topic2",0,function(m) print("sub done") end)
m:publish("/topic1","hello",0,0) m:publish("/topic2","world",0,0)
end )
m:on("offline", function(conn)
print("disconnect to broker...")
print(node.heap())
end)
m:on("message",dispatch )
-- Lua: mqtt:connect( host, port, secure, auto_reconnect, function(client) )
m:connect("m11.cloudmqtt.com",11214,0,1)
tmr.alarm(0,10000,1,function() local pl = "time: "..tmr.time()
m:publish("/topic1",pl,0,0)
end)
- NodeMCU can communicate with cloud brokers like CloudMQTT:
- Subscribe to multiple topics (
/topic1,/topic2) - Publish periodic updates using timers:
tmr.alarm(0, 10000, 1, function() m:publish("/topic1", "time: "..tmr.time()) end)
- Subscribe to multiple topics (
- Useful for IoT dashboards, data logging, and remote monitoring. ESP8266 NodeMCU Module MQTT