国外有个哥们已经写了一份如何使用nodeMCU平台玩转mqtt协议(链接请看附录),我觉得大部分写的已经算很清楚,不过有些点,没提到,我碰了很多次壁,所以呢,我就基于他的文章,加上一些补充。
nodeMCU, MQTT是什么,本文就不做详细介绍了。
一个最常见的物联网场景:远在家里的硬件,要发一个信息给我的手机。
实现方案是,硬件和手机连接同一个MQTT 代理服务器(mqtt broker),手机根据MQTT协议,注册一个话题A,硬件根据MQTT协议,向代理服务器发送话题A,附上信息。代理服务器,会转发给手机,至此完成物联网通信。
硬件就是NodeMCU了。MQTT 代理服务器,可以自己搭建,也可以用一些免费的(数据量大一般就要收费),比如CloudMQTT。手机嘛,我们就用很棒的MQTT测试工具:mqtt-spy代替。
1) 到这个地址 plan,选择Cute Cat,即免费套餐。还没注册的话,先注册一下。
3) 创建一个用户和对应的密码。mqtt-spy和nodeMCU连接CloudMQTT时要用。
本文,我们设置的用户是nodemcu,密码是nodemcu123
4) 用户有了,还需要设置用户要使用什么话题,以及用户连接时的读写权限。
#号代表任意值,也就是说,以”/nodemcu/”开头就行,后面的是什么都不管,我服务器都接受。
这里在读写权限全部打勾,你自己玩时,可以根据情况再定。
5)点击上图的保存以后,服务器已经跑起来,可以接收MQTT的subscribe/publish了。
代码都写好了,在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给的值:
也就是m11.cloudmqtt.com 和 15510。
USERNAME 和 PASSWORD也是刚才设置的用户/密码。也就是nodemcu 和 nodemcu123。
修改时要注意,别留空格,我就遇到”m11.cloudmqtt.com”的m11前面不小心加了个空格,导致DNS Failed的错误(其实就是找不到网址对应的实际服务器IP)
config.lua 改好以后, 用ESPlorer把4个文件上传到nodeMCU,然后重启。如果没有意外,你将看到如下内容:
记几下Chip ID的值,后面要用。
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
这里也简要介绍一下:
2) 在Connectivity面板,Server URI填MQTT server的地址和端口号。Client Id自己随便写一个。
3) 在Security面板,写上用户密码,也就是nodemcu/nodemcu123
4) Publications面板,填我们想要发送给nodeMCU的话题,这里是/nodemcu/386480/tonode。(386480就是上面获得的Chip ID)
查看lua代码就能知道,nodeMCU会向couldMQTT注册这个话题,所以mqtt-spy发送时,它就能接收到。
5) Subscriptions面板, 写我们要监听的话题,这里是/nodemcu/386480/fromnode。nodeMCU收到我们发的消息后,也会主动发一个ping信息回来,所以我们也得注册了,才能收到。
6) 全部写好了,就点击Open Connection, mqtt-spy会连接cloudMQTT服务器,连接成功,那个标签会变绿色。
7) 点击绿色TAB,可以给nodeMCU发送消息了。
我们就在Data栏,写个“HELLO4”,然后点击Publish按钮。
顺利的话,nodeMCU会打印如下log:
至此,nodeMCU已经可以跑mqtt啦!!哈哈
稍微修改代码,就可以让nodeMCU发送任何信息给任何联网的模块,只要都支持MQTT协议就行!
1) Getting started with MQTT using nodeMCU