使用nodeMCU平台mqtt协议实现物联网通信

国外有个哥们已经写了一份如何使用nodeMCU平台玩转mqtt协议(链接请看附录),我觉得大部分写的已经算很清楚,不过有些点,没提到,我碰了很多次壁,所以呢,我就基于他的文章,加上一些补充。


前言

nodeMCU, MQTT是什么,本文就不做详细介绍了。

一个最常见的物联网场景:远在家里的硬件,要发一个信息给我的手机。
实现方案是,硬件和手机连接同一个MQTT 代理服务器(mqtt broker),手机根据MQTT协议,注册一个话题A,硬件根据MQTT协议,向代理服务器发送话题A,附上信息。代理服务器,会转发给手机,至此完成物联网通信。

硬件就是NodeMCU了。MQTT 代理服务器,可以自己搭建,也可以用一些免费的(数据量大一般就要收费),比如CloudMQTT。手机嘛,我们就用很棒的MQTT测试工具:mqtt-spy代替。

框架如下:
使用nodeMCU平台mqtt协议实现物联网通信_第1张图片

1. 搭建MQTT代理服务器CloudMQTT

1) 到这个地址 plan,选择Cute Cat,即免费套餐。还没注册的话,先注册一下。

2) 到控制面板,创建一个instance
使用nodeMCU平台mqtt协议实现物联网通信_第2张图片

3) 创建一个用户和对应的密码。mqtt-spy和nodeMCU连接CloudMQTT时要用。
本文,我们设置的用户是nodemcu,密码是nodemcu123
使用nodeMCU平台mqtt协议实现物联网通信_第3张图片

4) 用户有了,还需要设置用户要使用什么话题,以及用户连接时的读写权限。
使用nodeMCU平台mqtt协议实现物联网通信_第4张图片

#号代表任意值,也就是说,以”/nodemcu/”开头就行,后面的是什么都不管,我服务器都接受。
这里在读写权限全部打勾,你自己玩时,可以根据情况再定。

5)点击上图的保存以后,服务器已经跑起来,可以接收MQTT的subscribe/publish了。

2. nodeMCU加载mqtt相关lua代码

代码都写好了,在github,共4个文件。

setup.lua: 连接wifi的模块。无需改动

app.lua : 包含application的逻辑处理。无需改动

init.lua : NodeMCU加载lua的启动入口。无需改动

config.lua : 包含连接到MQTT server的配置信息,包括wifi name password, MQTT server name,MQTT user name (前面设置的用户) and password。这个就需要改了。

我这边改好如下:

local module = {}

module.SSID = {}
module.SSID["fake360"] = "iqiyi123"

module.HOST = "m11.cloudmqtt.com"
module.PORT = 15510
module.USERNAME = "nodemcu"
module.PASSWORD = "nodemcu123"
module.ID = node.chipid()

module.ENDPOINT = "/nodemcu/"..node.chipid()
return module

其中,fake360是我的wifi SSID,iqiyi123是我的wifi密码。
HOST和PORT分别填cloudMQTT给的值:

使用nodeMCU平台mqtt协议实现物联网通信_第5张图片

也就是m11.cloudmqtt.com 和 15510。

USERNAME 和 PASSWORD也是刚才设置的用户/密码。也就是nodemcu 和 nodemcu123。


修改时要注意,别留空格,我就遇到”m11.cloudmqtt.com”的m11前面不小心加了个空格,导致DNS Failed的错误(其实就是找不到网址对应的实际服务器IP)

config.lua 改好以后, 用ESPlorer把4个文件上传到nodeMCU,然后重启。如果没有意外,你将看到如下内容:
使用nodeMCU平台mqtt协议实现物联网通信_第6张图片

记几下Chip ID的值,后面要用。

3. 用mqtt-spy工具,测试CloudMQTT

nodeMCU的通信,全部好了,服务器也好了,就差另一端,手机了,不过本文不实际讨论手机端app的开发,用mqtt-spy工具作为测试工具。

下载地址:https://github.com/eclipse/paho.mqtt-spy/wiki/Downloads

这是一个jar包,要用Java 8 Runtime打开。
工具的使用guide:https://github.com/eclipse/paho.mqtt-spy/wiki/Configuration

这里也简要介绍一下:

1) 打开app,点击第二个item,创建一个连接。
使用nodeMCU平台mqtt协议实现物联网通信_第7张图片

2) 在Connectivity面板,Server URI填MQTT server的地址和端口号。Client Id自己随便写一个。
使用nodeMCU平台mqtt协议实现物联网通信_第8张图片

3) 在Security面板,写上用户密码,也就是nodemcu/nodemcu123
使用nodeMCU平台mqtt协议实现物联网通信_第9张图片

4) Publications面板,填我们想要发送给nodeMCU的话题,这里是/nodemcu/386480/tonode。(386480就是上面获得的Chip ID)
查看lua代码就能知道,nodeMCU会向couldMQTT注册这个话题,所以mqtt-spy发送时,它就能接收到。
使用nodeMCU平台mqtt协议实现物联网通信_第10张图片

5) Subscriptions面板, 写我们要监听的话题,这里是/nodemcu/386480/fromnode。nodeMCU收到我们发的消息后,也会主动发一个ping信息回来,所以我们也得注册了,才能收到。
使用nodeMCU平台mqtt协议实现物联网通信_第11张图片

6) 全部写好了,就点击Open Connection, mqtt-spy会连接cloudMQTT服务器,连接成功,那个标签会变绿色。
使用nodeMCU平台mqtt协议实现物联网通信_第12张图片

7) 点击绿色TAB,可以给nodeMCU发送消息了。

我们就在Data栏,写个“HELLO4”,然后点击Publish按钮。
使用nodeMCU平台mqtt协议实现物联网通信_第13张图片

顺利的话,nodeMCU会打印如下log:

使用nodeMCU平台mqtt协议实现物联网通信_第14张图片

至此,nodeMCU已经可以跑mqtt啦!!哈哈

稍微修改代码,就可以让nodeMCU发送任何信息给任何联网的模块,只要都支持MQTT协议就行!


参考文献

1) Getting started with MQTT using nodeMCU

你可能感兴趣的:(物联网)