`一 .mqtt服务器安装(emqtt )及mqtt通信演示把emqtt服务软件安装在自己的电脑进行本地测试, 如果安装在云服务器上可以远程控制,提供的客户端上有默认的连接emqtt服务器的信息可以修改程序中连接信息进行远程控制
首先是在本地安装一个emqtt服务器进行测试
1.首先安装补丁:把补丁拷贝到" C:WindowsSystem32 "文件夹下
2. 控制台模式下启动:emqttd console
(1) 控制台下切换到emqtt的bin目录下。如:
快速切换方法:在此目录下按住“Shift”同时点击鼠标右键选择“在此处打开 命令窗口”
(2)启动mqtt服务器 “emqttd console”
3. 通过网页登陆查看链接信息
网址:http://localhost:18083/
用户名:admin
密 码:public
查看本机ip:
打开mqtt客户端 (注意电脑防火墙要关闭)
链接上一个客户端
我们再启动一个客户端让两个客户端通信
我们在查看下链接的客户端
客户端通信演示
上面打开emqtt服务器的方法打开一个窗口,关掉窗口emqtt服务也关闭;
让emqtt服务器一直运行的
(1)控制台先定位到emqtt安装的bin目录下我的是“D:MqttServeremqttdin”
(2)emqttd install
(3)启动emqttd服务:emqttd start
(4)停止emqttd服务:emqttd stop
(5)卸载emqttd服务:emqttd uninstall
第一次启动没成功不要灰心, 再次启动一次就好了
本地emqtt服务测试没有问题就可以编写ESP的控制程序啦
二. 编写控制ESP8266 的lua程序
首先看下原理图ESP8266的GPIO5引脚控制继电器
首先在init.lua文件中初始化继电器引脚
RELAY_Pin = 1 --为什么是1 呢不是GPIO5吗? 其实这是GPIO的索引号,每个io都对应一个索引号
gpio.mode(RELAY_Pin, gpio.OUTPUT)
gpio.write(RELAY_Pin,0)
init.lua文件:
RELAY_Pin = 1
gpio.mode(RELAY_Pin, gpio.OUTPUT)
gpio.write(RELAY_Pin,0)
tmr.alarm(0,4000,0,function()
dofile("mqtt.lua")
end)
init.lua文件结束
mqtt.lua文件: 实现连接路由器去连接mqtt服务器实现控制
MqttServerIP="192.168.0.105"
MqttServerPort=1883
MqttUserName="admin"
MqttUserPassword="public"
MqttLinkStat = 0
UartReceData = ""
UartReceCnt = 0
UartReceTempCnt = 0
wifi.setmode(wifi.STATION)
local stacfg={
ssid="qqqqq",
pwd="11223344"
}
wifi.sta.config(stacfg)
wifi.sta.autoconnect(1)
Clientid = wifi.sta.getmac()
ClientSubscribeTopic = "AAA"
ClientPublishTopic = "111"
MqttClient=mqtt.Client(Clientid,3,MqttUserName,MqttUserPassword)
MqttClient:lwt(ClientPublishTopic,"offline",1,1)
local function ConnectSuccess(client)
print("MqttServer connect sucess")
client:subscribe(ClientSubscribeTopic,0,function(client)print("subscribe sucess")end)
MqttLinkStat = 1
tmr.stop(3)
end
local function ConnectFailed(client, reason)
print("MqttServer connect fail"..reason)
MqttLinkStat = 0
tmr.start(3)
end
tmr.alarm(3, 2000, 1, function()
MqttClient:connect(MqttServerIP, MqttServerPort, 0,ConnectSuccess,ConnectFailed)
end)
MqttClient:on("offline", function(client, topic, data) tmr.start(3) end)
MqttClient:on("message", function(client, topic, data)
if data == "open" then
gpio.write(RELAY_Pin,1)
if gpio.read(RELAY_Pin)==1 then
if MqttClient ~= nil then
MqttClient:publish(ClientPublishTopic,"ON-RELAY",1,1,function(client) end)
end
end
end
if data == "close" then
gpio.write(RELAY_Pin,0)
if gpio.read(RELAY_Pin)==0 then
if MqttClient ~= nil then
MqttClient:publish(ClientPublishTopic,"OFF-RELAY",1,1,function(client) end)
end
end
End
uart.write(0,data)
end)
tmr.alarm(2,10,1,function()
if UartReceCnt ~= 0 then
if UartReceTempCnt == UartReceCnt then
UartReceTempCnt = 0
UartReceCnt = 0
--send to-Mqtt
if MqttClient ~= nil then
MqttClient:publish(ClientPublishTopic,UartReceData,1,1,function(client) end)
end
else
UartReceTempCnt = UartReceCnt
end
end
end)
uart.on("data",0,function(data)
UartReceData = UartReceData..data
UartReceCnt = UartReceCnt + 1
end,0)
printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip = 0
end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
if printip == 0 then
print("+IP "..T.IP)
end
printip = 1
end)
mqtt.lua文件结束
测试模块通过串口发送数据
PC客户端发送”open”开继电器
|