在这节课里,我们一起来对目前所学习的知识进行总结。
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : complete_connect 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20201024 程序目的/Purpose : 本程序旨在演示如何使用PubSubClient库连接MQTT服务器的全部参数选项 ----------------------------------------------------------------------- 修改记录: 20201227 - 添加了用户名和密码内容(替代原来的NULL) ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: 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 = "taichimaker"; 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); const int subQoS = 1; // 客户端订阅主题时使用的QoS级别(截止2020-10-07,仅支持QoS = 1,不支持QoS = 2) const bool cleanSession = false; // 清除会话(如QoS>0必须要设为false) const char* willTopic = "willTopic"; // 遗嘱主题名称 const char* willMsg = "willMsg"; // 遗嘱主题信息 const int willQos = 0; // 遗嘱QoS const int willRetain = false; // 遗嘱保留 const char* mqttUserName = "test-user"; // 服务端连接用户名 const char* mqttPassword = "ranye-iot"; // 服务端连接密码 void setup() { pinMode(LED_BUILTIN, OUTPUT); // 设置板上LED引脚为输出模式 digitalWrite(LED_BUILTIN, HIGH); // 启动后关闭板上LED Serial.begin(9600); // 启动串口通讯 //设置ESP8266工作模式为无线终端模式 WiFi.mode(WIFI_STA); // 连接WiFi connectWifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); mqttClient.setCallback(receiveCallback); // 连接MQTT服务器 connectMQTTserver(); } void loop() { // 如果开发板未能成功连接服务器,则尝试连接服务器 if (!mqttClient.connected()) { connectMQTTserver(); } // 处理信息以及心跳 mqttClient.loop(); } // 连接MQTT服务器并订阅信息 void connectMQTTserver(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = "client-" + WiFi.macAddress(); /* 连接MQTT服务器 boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage, boolean cleanSession); 若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为false */ if (mqttClient.connect(clientId.c_str(), mqttUserName, mqttPassword, willTopic, willQos, willRetain, willMsg, cleanSession)) { Serial.print("MQTT Server Connected. ClientId: "); Serial.println(clientId); Serial.print("MQTT Server: "); Serial.println(mqttServer); subscribeTopic(); // 订阅指定主题 } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(5000); } } // 收到信息后的回调函数 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(BUILTIN_LED, LOW); // 则点亮LED。 } else { digitalWrite(BUILTIN_LED, HIGH); // 否则熄灭LED。 } } // 订阅指定主题 void subscribeTopic(){ // 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同 String topicString = "test-user/Pub-" + WiFi.macAddress(); char subTopic[topicString.length() + 1]; strcpy(subTopic, topicString.c_str()); // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称 // 请注意subscribe函数第二个参数数字为QoS级别。这里为QoS = 1 if(mqttClient.subscribe(subTopic, subQoS)){ Serial.print("Subscribed Topic: "); Serial.println(subTopic); } else { Serial.print("Subscribe Fail..."); } } // 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(""); } |