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!

(2)安装

解压得到如下文件。

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

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

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

 

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

(3)安装 JDK

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

下载:Java SE Development Kit 8 Downloads

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

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

然后配置 JDK 环境变量

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

 

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

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

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

 

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

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

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

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

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

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

 

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

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

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

(4)创建服务器实例

参看:Getting Started Guide

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

 

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

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

 

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

 

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

 

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

即可进入 Apollo Console 窗口。

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

三、MQTT 客户端测试

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

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

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

 

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

首先添加该插件

 

点击 获取更多扩展程序

 

搜索 mqttlens ,最后添加至 CHROME

 

安装完成!!

下面进行测试

先运行 Apollo 服务器

 

然后启动 mqttlens 

 

然后点击 Connections+

 

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

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

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

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

 

 

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

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

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

本地mqtt服务器测试结果:

 

下面是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)

 

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

 

 

展开阅读全文

没有更多推荐了,返回首页