MQTT esp8266 node.js mqtt-spy broker
闲言碎语
MQTT是一个由IBM整出来的基于tcp/IP的轻量级的发布/订阅的通信协议,特别适用于M2M,有可能成为IOT方面一个重要通信协议。这里不提mqtt协议的细节内容,只来说说如何用,想了解更多MQTT的内容,可以看看其wiki或者在线doc。配合node.js的mqtt模块,可以玩出不少好玩的东西来,这里有个例子。
nodeMCU提供了一个mqtt模块,可以用来创建mqtt的客户端,以连接到mqtt的broker。需确保broker支持3.1.1。
模块函数
mqtt模块的函数也是比较少,十只手指都能数过来。
序号 | 函数名 | 参数 | 返回值 |
---|---|---|---|
1 | mqtt.Client() | clientid, keepalive, username, password[, cleansession] | client |
2 | mqtt.client:close() | 空 | true / false |
3 | mqtt.client:connect() | host[, port[, secure[, autoreconnect]]][, function(client)[, function(client, reason)]] | true / false |
4 | mqtt.client:lwt() | topic, message[, qos[, retain] | 空 |
5 | mqtt.client:on() | event, function(client[, topic[, message]]) | 空 |
6 | mqtt.client:publish() | topic, payload, qos, retain[, function(client)] | true / false |
7 | mqtt.client:subscribe() | topic, qos[, function(client)] / table[, function(client)] | true / false |
8 | mqtt.client:unsubscribe() | topic[, function(client)] / table[, function(client)] | true / false |
经过前面的几篇文章对nodemcu其他模块的介绍后,我们已经可以从模块的函数名窥探到上面这8个函数都有什么用了吧。创建客户、连接、绑定事件回调、发布消息、订阅/取消订阅,套路就这么简单。
实践一下
直接动手码几行代码感受一下怎么用吧。不过,在这之前,你还需要一个broker。你可以选择用node.js自己实现一个(看这里),亦或者选择下载一个,这里找咯。当然,还有一个在线的可以选择点我。如果你选择在线的broker,我选了列表中的第一个 iot.eclipse.org,你可能需要两个客户端才能看到好的通信效果,这里推荐MQTT-SPY。
mqtt-spy默认有3个broker。选择那个iot.eclipse.com。可能需要输入你的名字。
接着,添加一个订阅。点击 new,随便输入一个你想要的topic,最好复杂一点,免得和别人重复了。
准备工作都做好后,就可以开始实践了。先来看一个简单的例子。
m = mqtt.Client("Node_MM", 120)
m:connect("iot.eclipse.org",
function(client)
print("connected")
m:publish("MyNode", "Hello World", 0, 0)
end,
function(client, reason)
print("fail reason" .. reason)
end
)
首先,创建一个客户端,超时120秒,用户名密码,这里放空,函数的最后一个参数如果传入0,client和server会保留对话,或者重新创建一个对话,默认为1。
然后,连接到iot.eclipse.com,端口号不填,默认1883,不加密,不自动连接。凡是不知道干嘛用的可选参数,那就默认吧。:connect函数还有两个回调函数,一个是连接成功的时候回调;一个是失败的时候回调,此时会传入失败原因,具体失败原因看这里。
当连接成功的时候,publish一条topic为MyNode,内容为Hello World的消息出去。
赶紧send到nodeMCU里面看看吧。正常的话,mqtt-spy会收到一条消息。也有可能因为网络问题,导致没有收到信息。如果这样的话,那就自己手动publish一条吧~
再来看一个小例子,
m = mqtt.Client("Node_MM", 30)
m:lwt("node_mm", "lwt", 0, 0)
m:on("connect", function(client)
m:publish("node_mm", "online", 0, 0)
m:subscribe("pc_mm", 0, function(client)
print("subscribe success")
end)
end)
m:on("offline", function(client)
print("offline")
end)
m:on("message", function(client, topic, data)
print(topic .. ": ")
if data ~= nil then
print(data)
end
end)
m:connect("iot.eclipse.org")
函数:lwt可以让broker在设备掉线后广播一条消息告诉其他客户端,比如说设备没电了后掉线。实验的时候,可以先断开nodemcu的wifi连接。
然后用:on绑定事件,这里有"connect"、"offline"、"message"。这里在"connect"事件回调中发布一条上线的消息,并订阅topic。:on的"connect"和:connect函数的"connect"是指向同一个回调函数的,如果后面使用了:connect并设置了回调函数,会使前面的回调失效。
"offline"是设备掉线时候的回调。"message"则是接收到topic时的回调。
send或者save到nodeMCU,看看mqtt-spy有什么反应吧~
一点扩展思路
上面的两个例子也许并不能很好的展示MQTT的魅力。不过,我们可以在"message"的回调中根据topic执行一个不同的操作,比如说点亮一盏灯。或者有多个设备的时候,可以来做设备间的联动,例如说另一个设备上线后点亮一盏灯,或者说根据另一个设备上的光敏电阻值来点亮一盏灯怎么来来去去都是灯o(╯□╰)o,总之,发挥自己的脑洞吧。
更多内容
1、nodeMCU学习笔记–快速上手
2、nodeMCU学习笔记–tmr模块
3、nodeMCU学习笔记–gpio模块
4、nodeMCU学习笔记–pwm模块
5、nodeMCU学习笔记–uart(附透传例子)
6、nodeMCU学习笔记–wifi模块·上
7、nodeMCU学习笔记–wifi模块·中
8、nodeMCU学习笔记–wifi模块·下
9、nodeMCU学习笔记–net模块
10、nodeMCU学习笔记--ws2812模块