ESP8266学习之路 十一 (Mqtt通信)

lua开发8266API手册:https://nodemcu.readthedocs.io/en/master/​​​​​​​

了解MQTT数据包形成 参考 :http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718027

Windows 下 MQTT 服务器搭建之Apollo

(1)下载 Apollo

目录

Windows 下 MQTT 服务器搭建之Apollo

(1)下载 Apollo

(2)安装

(3)安装 JDK

(4)创建服务器实例

三、MQTT 客户端测试

在本地Windows上安装MQTT服务器测试通信

下面是esp8266模块连接mqtt服务器的测试程序:

模块与另一个客户端通信状态


下载:Download it today!

ESP8266学习之路 十一 (Mqtt通信)_第1张图片ESP8266学习之路 十一 (Mqtt通信)_第2张图片

(2)安装

解压得到如下文件。

这里需要注意了,解压 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格,后面会提到出现什么错误。

ESP8266学习之路 十一 (Mqtt通信)_第3张图片

进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹

按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。

 

ESP8266学习之路 十一 (Mqtt通信)_第4张图片

然后在 cmd 窗口执行 apollo.cmd。然后就可以看到发生错误。上面Ubuntu下安装时已经提到,还需要安装 JDK。

ESP8266学习之路 十一 (Mqtt通信)_第5张图片

(3)安装 JDK

WIN7 64位系统安装JDK并配置环境变量:https://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html

下载:Java SE Development Kit 8 Downloads

ESP8266学习之路 十一 (Mqtt通信)_第6张图片

Windows 系统是多少位的,这个应该很清楚吧。查看 我的电脑->属性,查看有关计算机的基本信息。

ESP8266学习之路 十一 (Mqtt通信)_第7张图片

我的电脑为 win 10 64位,下载并安装 jdk-8u144-windows-x64.exe

然后配置 JDK 环境变量

我的电脑->属性->高级系统设置->高级->环境变量

ESP8266学习之路 十一 (Mqtt通信)_第8张图片

 

这部分我们之前将 FFmpeg 的Windows安装说明时有提到过的。可看到有用户变量和系统变量。

修改“用户变量”为当前用户使用,其他 Windows 用户不能够使用。如果要使每个用户都能够使用,你需要修改 "系统变量" 。

ESP8266学习之路 十一 (Mqtt通信)_第9张图片

注意,不要够删除在变量中原来已有的内容。如果之前已存在变量,则在其之后用分号“;”分隔,然后添加。

ESP8266学习之路 十一 (Mqtt通信)_第10张图片

 

我们只让当前用户可用,修改用户变量即可。

在用户环境变量中新建变量 JAVA_HOME,设置变量值 F:\Program Files\Java\jdk1.8.0_144

ESP8266学习之路 十一 (Mqtt通信)_第11张图片

新建PATH,设置变量值%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

ESP8266学习之路 十一 (Mqtt通信)_第12张图片

新建CLASSPATH,设置变量值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar注意前面的.表示当前目录。然后点击“确定”按钮。

ESP8266学习之路 十一 (Mqtt通信)_第13张图片

到此,配置完成。打开 cmd 测试一下配置是否成功。

输入java -version,显示版本java version "1.8.0_144",输入javac -version,也显示javac 1.8.0_144,说明JDK安装及环境变量配置成功。

ESP8266学习之路 十一 (Mqtt通信)_第14张图片

 

然后接着上面来讲。进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹

按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。

再次在 cmd 窗口执行 apollo.cmd,可以看到如下的信息。

ESP8266学习之路 十一 (Mqtt通信)_第15张图片

(4)创建服务器实例

参看:Getting Started Guide

在 CMD 命令窗口输入 apollo create mybroker ,当然 mybroker 这个名字可以随便起。

ESP8266学习之路 十一 (Mqtt通信)_第16张图片

 

然后查看 mybroker 可以发现里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,可以修改原始的admin=password,可以接着换行添加新的用户名密码。

ESP8266学习之路 十一 (Mqtt通信)_第17张图片

bin:保存与该实例关联的执行脚本。
etc:保存实例配置文件
data:保存用于存储持久消息的数据文件
日志:保存旋转日志文件
tmp:保存在代理运行之间安全删除的临时文件

 

打开cmd,运行 apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 开启服务器,如下图所示:

ESP8266学习之路 十一 (Mqtt通信)_第18张图片

 

这里需要注意了,所在 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格。因为我上面的是存放在 360安全浏览下载 这个目录下了。导致出现系统找不到指定的路径。

ESP8266学习之路 十一 (Mqtt通信)_第19张图片

 

然后打开浏览器上,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/

即可进入 Apollo Console 窗口。

ESP8266学习之路 十一 (Mqtt通信)_第20张图片

默认的登录id和密码是 admin 和 password 

ESP8266学习之路 十一 (Mqtt通信)_第21张图片

三、MQTT 客户端测试

Apollo 服务器安装已经讲完,接下来简单测试一下发布订阅。

这里面网上有 MQTT协议之Apache Apollo 安装使用 这种文章用的是 java,在Android上测试的。

这就不太适合我了,不懂 Android 蓝瘦香菇啊!

 

再有一种是用 谷歌浏览器上的 扩展程序 mqttlens

首先添加该插件

ESP8266学习之路 十一 (Mqtt通信)_第22张图片

 

点击 获取更多扩展程序

ESP8266学习之路 十一 (Mqtt通信)_第23张图片

 

搜索 mqttlens ,最后添加至 CHROME

ESP8266学习之路 十一 (Mqtt通信)_第24张图片

 

安装完成!!

下面进行测试

先运行 Apollo 服务器

ESP8266学习之路 十一 (Mqtt通信)_第25张图片

ESP8266学习之路 十一 (Mqtt通信)_第26张图片

 

然后启动 mqttlens 

ESP8266学习之路 十一 (Mqtt通信)_第27张图片

 

然后点击 Connections+

ESP8266学习之路 十一 (Mqtt通信)_第28张图片

 

出现下图,并填写好相关的信息

ESP8266学习之路 十一 (Mqtt通信)_第29张图片

然后就进入了,订阅发布界面

ESP8266学习之路 十一 (Mqtt通信)_第30张图片

Windows安装MQTT服务器,到此结束.

在本地电脑端安装MQTT服务器参考:    https://blog.csdn.net/qq_29350001/article/details/76680646

 

 

在本地Windows上安装MQTT服务器测试通信

ESP8266学习之路 十一 (Mqtt通信)_第31张图片

ESP8266学习之路 十一 (Mqtt通信)_第32张图片

我使用我电脑测试mqtt服务器,则mqtt服务器ip是本机的ip, 端口是创建mqtt服务器时,建立tcp连接的那个端口

用户名和密码在安装mqtt服务器时建立的,在文件  "\apache-apollo-1.7.1\bin\mybroker\etc"下  "users.properties"“groups.properties”文件中修改

ESP8266学习之路 十一 (Mqtt通信)_第33张图片

ESP8266学习之路 十一 (Mqtt通信)_第34张图片

ESP8266学习之路 十一 (Mqtt通信)_第35张图片

ESP8266学习之路 十一 (Mqtt通信)_第36张图片

ESP8266学习之路 十一 (Mqtt通信)_第37张图片

本地mqtt服务器测试结果:

ESP8266学习之路 十一 (Mqtt通信)_第38张图片

 

下面是esp8266模块连接本地mqtt服务器的测试程序:

设置ESP8266模块连接路由器后创建mqtt客户端连接mqtt服务器

连接远程服务器时需要知道远程服务器ip和本地连接相同

通过smart绑定连接路由器时,模块开始并不知道路由器的连接信息,通过广播让模块知道连接那个网络

mqttclient.lua文件: 再次声明不要在mqttclient.lua文件中添加注释, 在笔记中添加注释只是为了更好的去理解 ,当需要上传该程序到模块时, 要注意把注释全部删掉

MqttServerIP="192.168.0.102"      --Mqtt服务器ip 此处是本地电脑ip
MqttServerPort=61613              --Mqtt服务器端口 
MqttUserName="admin"              --Mqtt服务器用户名
MqttUserPassword="password"       --Mqtt服务器用户名密码
MqttLinkStat = 0             	  --Mqtt服务器连接状态

UartReceData = ""                 --串口接收数据缓存
UartReceCnt = 0                   --串口接收数据计数
UartReceTempCnt = 0               --串口接收数据临时计数


wifi.setmode(wifi.STATION)       --模块工作在station模式
local stacfg={
    ssid="TP-Link",      
    pwd="12345678"  
}
wifi.sta.config(stacfg)          --设置模块station模式参数
wifi.sta.autoconnect(1)          --模块自动连接wifi

Clientid = wifi.sta.getmac()     --获取模块mac设置为mqtt客户端ID

ClientSubscribeTopic = "AAA"    --订阅主题
ClientPublishTopic = "111"      --发布主题

MqttClient=mqtt.Client(Clientid,3,MqttUserName,MqttUserPassword)  --创建mqtt客户端
MqttClient:lwt(ClientPublishTopic,"offline",1,1)   --设置遗嘱

local function ConnectSuccess(client)  --连接mqtt服务器成功后的回调函数
    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) --连接mqtt服务器失败后的回调函数
    print("MqttServer connect fail")
    MqttLinkStat = 0 
    tmr.start(3)
    
end


tmr.alarm(3, 2000, 1, function() --用定时器3连接mqtt服务器 回调函数中 断 / 开 服务器
         MqttClient:connect(MqttServerIP, MqttServerPort, 0,ConnectSuccess,ConnectFailed)
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)

--与mqtt服务器断线处理
MqttClient:on("offline", function(client, topic, data) tmr.start(3) end)
--接收mqtt服务器事件
MqttClient:on("message", function(client, topic, data)
        if data == "switch;relay=1" then 
            gpio.write(2,1)  
            if gpio.read(2)==1 then 
                if MqttClient ~= nil then 
                    MqttClient:publish(ClientPublishTopic,"ON-RELAY",1,1,function(client)  end)
                end
            end  
        end 
            
        if data == "switch;relay=0" then 
            gpio.write(2,0) 
            if gpio.read(2)==0 then 
                if MqttClient ~= nil then 
                    MqttClient:publish(ClientPublishTopic,"OFF-RELAY",1,1,function(client)  end)
                end
            end
        end
        
end)


--串口接收事件
uart.on("data",0,function(data) 
            UartReceData = UartReceData..data 
            UartReceCnt = UartReceCnt + 1 	 
end,0)    


--打印连接wifi后获取的ip
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)

 

模块与另一个客户端通信状态

ESP8266学习之路 十一 (Mqtt通信)_第39张图片

ESP8266学习之路 十一 (Mqtt通信)_第40张图片

ESP8266学习之路 十一 (Mqtt通信)_第41张图片

ESP8266学习之路 十一 (Mqtt通信)_第42张图片

 

 

你可能感兴趣的:(ESP8266学习)