第四课 MQTT的使用
写在前面的话:个人学习笔记,抛砖引玉,希望有兴趣的人加入QQ群415469069一起讨论,欢迎有共同爱好的人。
本教程以ESP-12N,CP2102开发板为例进行讲解。
- 代码。下载地址
分为两个文件:mqtt_test.lua和close_mqtt.lua。群文件可以下载。
--mqtt_test.lua myClient = mqtt.Client("test_mqqt_20180123_mcu",120) myClient:connect("iot.eclipse.org", function(client) print("connected") end) myClient:lwt("mcu_to_pc_topic20180123","mcu is closed") myClient:on("connect", function(clinet) if(myClient:publish("mcu_to_pc_topic20180123","online",0,0))then print("pc connected mcu") end if(myClient:subscribe("pc_to_mcu_topic20180123",0))then print("subscribe is success.") end end) myClient:on("offline", function(client) myClient:publish("mcu_to_pc_topic20180123","offline",0,0) end) myClient:on("message", function(client , topic , message) print(“get a message.\n”) print(topic..":"..message) end) |
--mqtt_close.lua if(myClient:close()) then print("mqtt is closed.") else print("closed is failed.") end |
工作流程。
首先我们需要一个broker,这里提供一些免费的服务器供参考。https://github.com/mqtt/mqtt.github.io/wiki/public_brokers。
为了测试效果,我们需要另一个客户端软件,这里我们选择一个电脑端的mqtt客户端(mqtt-spy-1.0.0),可以在群文件(群主教程工具)中下载。打开mqtt-spy-1.0.0.jar(需要安装java环境,参考第一课)。按下图操作。
在打开的窗口中,左侧第一个就是我们要使用的,选择它,在右侧的窗口中红框部分输入我们的客户端名称。最好复杂一点,避免与其他人的重复。然后点击应用设置(Apply),最后点击打开连接。
此时,会在主界面上多出一个选项,点击它
然后就是新建我们要监听的主题(topic)。
至此,我们的电脑端的客户端就配置完成了。然后我们开始建立我们的ESP上的客户端。首先,看一下工作流程图,如下:
然后复制代码,上传到ESP中执行。然后去看一下电脑端的客户端,会监听到一条消息。
接着我们从电脑端的客户端发送一条消息,让ESP去接收。topic的名称要跟ESP订阅的topic的一致。填好Topic和Data之后,点击Publish。然后去看ESP的后台。我们已经成功接收到消息。
如何关闭电脑端和ESP端的客户端与broker的连接,如图:
三、说明。
1、创建一个客户端。
句法:mqtt.Client(clientid, keepalive[, username, password, cleansession]) 参数: clientid 客户端ID keepalive 保持秒 username 用户名 password 用户密码 cleansession 0/1为false/ true。默认值是1(true)。 返回: MQTT client |
2、连接broker。
句法:mqtt:connect(host[, port[, secure[, autoreconnect]]][, function(client)[, function(client, reason)]]) 参数: host 主机,域或IP(字符串) port 经纪人端口(号码),默认1883 secure 0/1 for false/ true,默认为0.注意net模块中记录的约束条件。 autoreconnect 0/1为false/ true,默认为0.此选项已弃用。 function(client) 当连接建立时的回调函数 function(client, reason)当无法建立连接时回调函数。不应该调用进一步的回调。 返回: true,false |
3、监听事件。
句法:mqtt:on(event, function(client[, topic[, message]])) 参数: event 可以是“connect”,“message”或“offline” function(client[, topic[, message]])回调函数。第一个参数是客户端。如果事件是“消息”,则第二和第三参数被接收话题和消息(字符串)。 |
4、发布消息。
句法:mqtt:publish(topic, payload, qos, retain[, function(client)]) 参数: topic要发布的主题(主题字符串) message 要发布的消息(缓冲区或字符串) qos QoS等级 retain 保留标记 function(client)收到PUBACK时触发可选的回调。注意:当多次调用publish()时,定义的最后一个回调函数将被调用用于ALL发布命令。 返回:true,false |
- 订阅主题。
句法:mqtt:subscribe(topic, qos[, function(client)])mqtt:subscribe(table[, function(client)]) 参数: topic一个主题字符串 qos QoS订阅级别,默认为0 table qos'对的数组来订阅 function(client)订阅成功时触发可选的回调。注意:当多次调用subscribe()时,将为所有订阅命令调用定义的最后一个回调函数。 返回: true,false |
- 取消订阅。
句法: mqtt:unsubscribe(topic[, function(client)]) mqtt:unsubscribe(table[, function(client)]) 参数 topic一个主题字符串 table “主题,任何对”的数组成对来取消订阅 function(client)取消订阅成功时触发可选的回调。注意:当多次调用unsubscribe()时,将会为所有取消订阅命令调用定义的最后一个回调函数。 返回: true,false |
7、设置遗嘱lwt。
句法:mqtt:lwt(topic, message[, qos[, retain]]) 参数: topic 将要发布的主题(字符串) message 要发布的消息(缓冲区或字符串) qos QoS级别,默认为0 retain 保留标志,默认为0 |
8、关闭。
句法:mqtt:close() 参数: 无。 返回: true,false |