通過免費的mqtt服務器實作mqtt控制
一、添加所需要的庫檔案
- 代碼使用到PubSubClient.h第三方庫檔案,下載地址
https://github.com/knolleary/pubsubclient/archive/refs/heads/master.zip - 解壓復制到arduino的安裝路徑下的libraries檔案夾下

二、程式下載運行
- 代碼使用的是太極創客的一個代碼例子
/**********************************************************************
專案名稱/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(LED_BUILTIN)){
messageString = "off";
} else {
messageString = "on";
}
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("");
}
-
復制代碼到arduino中運行,別忘了修改代碼這里

-
串口觀察輸出資訊


按下開發板上的RST復位鍵,讓程式重新執行,觀察輸出資訊,觀察是否成功

三、MQTT.fx軟體測驗是否實作功能
-
下載MQTT.fx軟體
下載鏈接
通過百度云下載
Windows版(64位) https://pan.baidu.com/s/13v0ROf1dOzu2tXqmw3iBMg 提取碼:r9f7 -
配置軟體





我這里實驗已經可以正常根據命令進行回應開關,
四、了解代碼
- 了解代碼
實作功能不是最終的目的,我們還要能夠看懂代碼,進行開發,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294296.html
標籤:其他
