位置导航: 首页 / 零基础入门学用物联网总目录 / MQTT篇目录 /本页
本节课将主要讲解两个示例程序。这两个程序中,第一个程序使用PubSubClient库发布保留消息,第二个程序使用PubSubClient库删除保留消息。如需了解这两个示例程序的具体使用方法和说明,请观看本文首部的视频教程。
在开始本节课以前请确保您的电脑已经成功安装了MQTTfx软件。另外我们还将使用PubSubClient库。您可以通过以下链接获取此库。
官网地址:https://pubsubclient.knolleary.net/
GitHub:https://github.com/knolleary/pubsubclient/
百度网盘下载: https://pan.baidu.com/s/12MHGbdfiOdwOGip5RMSSEQ 提取码: sizy
当您将PubSubClient库安装后,我们就可以使用该库进行开发了。假如您不知道如何安装该库,可以参考本站的这篇教程文章。
示例1 – 发布保留消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : publish_retained_msg 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20201014 程序目的/Purpose : 本程序旨在演示如何使用PubSubClient库使用ESP8266向MQTT服务器发布保留信息。 此程序在a_publish_ranye_url程序基础上修改。重点修改内容是publish函数添加了 第三个参数,用于设置发布信息是否是保留信息(retained msg) ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <PubSubClient.h> // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char* ssid = "taichi-maker"; const char* password = "12345678"; const char* mqttServer = "test.ranye-iot.net"; // 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案 // http://www.taichi-maker.com/public-mqtt-broker/ WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(9600); //设置ESP8266工作模式为无线终端模式 WiFi.mode(WIFI_STA); // 连接WiFi connectWifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); // 连接MQTT服务器 connectMQTTServer(); if (mqttClient.connected()) { // 如果开发板成功连接服务器 pubRetMQTTmsg(); // 发布信息 } } void loop() { mqttClient.loop(); // 保持心跳 } void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = "esp8266-" + WiFi.macAddress(); // 连接MQTT服务器 if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected."); Serial.println("Server Address: "); Serial.println(mqttServer); Serial.println("ClientId:"); Serial.println(clientId); } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(3000); } } // 发布信息 void pubRetMQTTmsg(){ // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同, String topicString = "Taichi-Maker-Ret-" + WiFi.macAddress(); char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str()); // 建立即将发布的保留消息。消息内容为"Retained Msg"。 String messageString = "Retained Msg"; char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); // 实现ESP8266向主题发布retained信息 // 以下publish函数第三个参数用于设置保留信息(retained message) if(mqttClient.publish(publishTopic, publishMsg, true)){ Serial.println("Publish Topic:");Serial.println(publishTopic); Serial.println("Publish Retained message:");Serial.println(publishMsg); } else { Serial.println("Message Publish Failed."); } } // ESP8266连接wifi void connectWifi(){ WiFi.begin(ssid, password); //等待WiFi连接,成功连接后输出成功信息 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); } |
示例2 – 删除保留消息
通过以下示例程序,您将可以清除上面示例程序所发布的保留消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : clear_retained_msg 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20201015 程序目的/Purpose : 本程序演示使用PubSubClient库清除保留消息(retained message)。 如果要删除主题的“保留消息”,可以通过向该主题发布一条空的“保留消息”, 也就是发送一条0字节payload的“保留消息”。 ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <PubSubClient.h> // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char* ssid = "taichi-maker"; const char* password = "12345678"; const char* mqttServer = "test.ranye-iot.net"; // 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案 // http://www.taichi-maker.com/public-mqtt-broker/ WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(9600); //设置ESP8266工作模式为无线终端模式 WiFi.mode(WIFI_STA); // 连接WiFi connectWifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); // 连接MQTT服务器 connectMQTTServer(); if (mqttClient.connected()) { // 如果开发板成功连接服务器 pubRetMQTTmsg(); // 发布信息 } } void loop() { mqttClient.loop(); // 保持心跳 } void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = "esp8266-" + WiFi.macAddress(); // 连接MQTT服务器 if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected."); Serial.println("Server Address: "); Serial.println(mqttServer); Serial.println("ClientId:"); Serial.println(clientId); } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(3000); } } // 发布信息 void pubRetMQTTmsg(){ // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同, String topicString = "Taichi-Maker-Ret-" + WiFi.macAddress(); char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str()); // 如果要删除主题的“保留消息”,可以通过向该主题发布一条空的“保留消息”, // 也就是发送一条0字节payload的“保留消息”。 String messageString = ""; char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); // 实现ESP8266向主题发布retained信息 // 以下publish函数第三个参数用于设置保留信息(retained message) if(mqttClient.publish(publishTopic, publishMsg, true)){ Serial.println("Cleared retained message for topic:"); Serial.println(publishTopic); } else { Serial.println("Message Publish Failed."); } } // ESP8266连接wifi void connectWifi(){ WiFi.begin(ssid, password); //等待WiFi连接,成功连接后输出成功信息 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); } |