在开始本节课以前请确保您的电脑已经成功安装了MQTTfx软件。另外我们还将使用PubSubClient库。您可以通过以下链接获取此库。
官网地址:https://pubsubclient.knolleary.net/
GitHub:https://github.com/knolleary/pubsubclient/
百度网盘下载: https://pan.baidu.com/s/12MHGbdfiOdwOGip5RMSSEQ 提取码: sizy
当您将PubSubClient库安装后,我们就可以使用该库进行开发了。
示例1:MQTT遗嘱基本应用
本示例程序将实现ESP8266的最基本MQTT遗嘱应用。程序使用connect函数对遗嘱消息实现设置。
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
|
#include <ESP8266WiFi.h> #include <PubSubClient.h>
const char* ssid = "taichi-maker"; const char* password = "12345678"; const char* mqttServer = "test.ranye-iot.net";
WiFiClient wifiClient; PubSubClient mqttClient(wifiClient);
const char* willMsg = "CLIENT-OFFLINE"; const int willQoS = 0; const bool willRetain = false;
void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); connectWifi(); mqttClient.setServer(mqttServer, 1883); mqttClient.setKeepAlive(10); connectMQTTserver(); }
void loop() { if (!mqttClient.connected()) { connectMQTTserver(); } mqttClient.loop(); }
void connectMQTTserver(){ String clientId = "esp8266-" + WiFi.macAddress(); String willString = "Taichi-Maker-" + WiFi.macAddress() + "-Will"; char willTopic[willString.length() + 1]; strcpy(willTopic, willString.c_str()); if (mqttClient.connect(clientId.c_str(), willTopic, willQoS, willRetain, willMsg)){ Serial.println("MQTT Server Connected."); Serial.print("Server Address: ");Serial.println(mqttServer); Serial.print("ClientId: ");Serial.println(clientId); Serial.print("Will Topic: ");Serial.println(willTopic); } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(5000); } }
void connectWifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); }
|
示例2:利用MQTT遗嘱实现设备在线状态发布
本实例将实现本教程2-6 MQTT遗嘱这节课中的“MQTT遗嘱使用建议”示例。通过以下程序,ESP8266客户端可以利用遗嘱机制来实时的将当前在线与否状态通过服务端进行发布。也就是说,其它客户端只要订阅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
|
#include <ESP8266WiFi.h> #include <PubSubClient.h>
const char* ssid = "taichimaker"; const char* password = "12345678"; const char* mqttServer = "test.ranye-iot.net";
WiFiClient wifiClient; PubSubClient mqttClient(wifiClient);
const char* willMsg = "CLIENT-OFFLINE"; const int willQoS = 0; const bool willRetain = true;
void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); connectWifi(); mqttClient.setServer(mqttServer, 1883); mqttClient.setKeepAlive(10); connectMQTTserver(); }
void loop() { if (!mqttClient.connected()) { connectMQTTserver(); } mqttClient.loop(); }
void connectMQTTserver(){ String clientId = "esp8266-" + WiFi.macAddress(); String willString = "Taichi-Maker-" + WiFi.macAddress() + "-Will"; char willTopic[willString.length() + 1]; strcpy(willTopic, willString.c_str()); if (mqttClient.connect(clientId.c_str(), willTopic, willQoS, willRetain, willMsg)){ Serial.println("MQTT Server Connected."); Serial.print("Server Address: ");Serial.println(mqttServer); Serial.print("ClientId: ");Serial.println(clientId); Serial.print("Will Topic: ");Serial.println(willTopic); publishOnlineStatus(); } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(5000); } }
void publishOnlineStatus(){ String willString = "Taichi-Maker-" + WiFi.macAddress() + "-Will"; char willTopic[willString.length() + 1]; strcpy(willTopic, willString.c_str()); String onlineMessageString = "CLIENT-ONLINE"; char onlineMsg[onlineMessageString.length() + 1]; strcpy(onlineMsg, onlineMessageString.c_str()); if(mqttClient.publish(willTopic, onlineMsg, true)){ Serial.print("Published Online Message: "); Serial.println(onlineMsg); } else { Serial.println("Online Message Publish Failed."); } }
void connectWifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); }
|
Gitalk 加载中 ...