位置导航: 首页 / 零基础入门学用物联网总目录 / MQTT篇目录 /本页
到目前为止,我们已经掌握了MQTT通讯的基本流程以及如何使用ESP8266来发布和订阅MQTT消息。这节课我们来进行以下自我测试。
以下示例程序可以让ESP8266同时订阅和发布MQTT消息。请将本程序上传到ESP8266开发板并且仔细阅读程序内容,假如您对程序的所有内容全部理解,那么恭喜您,目前我们所教授的知识您已经完全掌握了。
假如您对程序有任何不理解的地方,那么请务必将整个程序搞清楚,然后再继续后面的学习。
目前我们所学的都是基础知识,因此一定要牢固掌握所有程序内容,这样才能让我们后续的学习更加顺利。
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : pub_and_sub 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200719 程序目的/Purpose : 利用PubSubClient同时订阅和发布信息。 定时向主题发布D3按键的状态 通过订阅主题收到信息是数字1则打开LED,否则关闭LED。 ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Ticker.h> // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char* ssid = "taichimaker"; const char* password = "ZAQ1xsw2cde3VFR4"; const char* mqttServer = "test.ranye-iot.net"; // 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案 // http://www.taichi-maker.com/public-mqtt-broker/ Ticker ticker; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); int count; // Ticker计数用变量 void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); // Ticker定时对象 ticker.attach(1, tickerCount); //设置ESP8266工作模式为无线终端模式 WiFi.mode(WIFI_STA); // 连接WiFi connectWifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); mqttClient.setCallback(receiveCallback); // 连接MQTT服务器 connectMQTTServer(); } void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器 // 每隔3秒钟发布一次信息 if (count >= 3){ pubMQTTmsg(); count = 0; } // 保持心跳 mqttClient.loop(); } else { // 如果开发板未能成功连接服务器 connectMQTTServer(); // 则尝试连接服务器 } } void tickerCount(){ count++; } 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); subscribeTopic(); // 订阅指定主题 } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(3000); } } // 发布信息 void pubMQTTmsg(){ // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同, String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress(); char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str()); // 定时向服务器主题发布当前D3引脚状态 String messageString; if(digitalRead(D3)){ messageString = "on"; } else { messageString = "off"; } char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); // 实现ESP8266向主题发布信息 if(mqttClient.publish(publishTopic, publishMsg)){ Serial.println("Publish Topic:");Serial.println(publishTopic); Serial.println("Publish message:");Serial.println(publishMsg); } else { Serial.println("Message Publish Failed."); } } // 订阅指定主题 void subscribeTopic(){ // 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同 String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress(); char subTopic[topicString.length() + 1]; strcpy(subTopic, topicString.c_str()); // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称 if(mqttClient.subscribe(subTopic)){ Serial.println("Subscribe Topic:"); Serial.println(subTopic); } else { Serial.print("Subscribe Fail..."); } } // 收到信息后的回调函数 void receiveCallback(char* topic, byte* payload, unsigned int length) { Serial.print("Message Received ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(""); Serial.print("Message Length(Bytes) "); Serial.println(length); if ((char)payload[0] == '1') { // 如果收到的信息以“1”为开始 digitalWrite(LED_BUILTIN, LOW); // 则点亮LED。 } else { digitalWrite(LED_BUILTIN, HIGH); // 否则熄灭LED。 } } // 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(""); } |