ESP8266智能家居(2)——8266發布數據到mqtt服務器

1.公共服務器

? ? ? ? 學習物聯網就離不開服務器,如果你資金充足的話,可以自己購買或者租用一個服務器。本次我選擇,使用免費的公共MQTT服務器。它的端口及Broker信息如下:

網址為:

免費的公共 MQTT 服務器 | EMQ (emqx.com)icon-default.png?t=N7T8https://www.emqx.com/zh/mqtt/public-mqtt5-broker

2.MQTT?調試工具

? ? ? ? ?為了弄清楚,你的數據是否成功發送到了對應的服務器上,你需要使用一個mqtt調試工具。你可以設置它的服務器地址,端口號,發布主題,訂閱主題,這樣就能調試了。你在MQTT調試工具上的訂閱主題設置為ESP8266上的發布主題,就可以看到從ESP8266傳輸過來的數據!

? ? ? ? 這里我直接給出我用的mqtt調試工具的安裝包:?【免費】MQTT調試助手物聯網必備資源-CSDN文庫icon-default.png?t=N7T8https://download.csdn.net/download/guangali/88865017

3.代碼設計

????????簡單介紹一下代碼的重要部分吧

首先,前三行是導入頭文件,?緊接著的就是你使用的WIFI名稱和密碼,mqtt服務器地址(我使用的是這個地址,也是一個公共服務器,你可以跟我用一樣的)。第7行是ESP8266的發布主題,8行是ESP8266的訂閱主題。 發布主題的名字和訂閱主題的名字你可以設置為任意的,只要記得如何區分就行。

接下來是WIFI設置,不用改

?

下面是回調函數,當服務器給ESP8266發數據時,8266就執行這里面的函數。這里面使用了json解析的庫函數,所以要安裝json第三方庫。

?這函數里面,我實現的功能是:

發送“led”: 1 時,打印1,發送 “led”: 0 時,打印2.

實現了這個功能以后,稍加修改,就可以實現通過手機APP控制單片機上任意設備的功能!

WIFI重連函數

代碼的主題部分:

?

串口波特率設置的為115200,服務器端口號設置為1883.?這里實現的功能是,每隔兩秒鐘,就給服務器發送自增的數字。

完整代碼如下:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "lig";          //WIFI名稱
const char* password = "1521";      //WIFI密碼   這里改成你自己的WIFI名稱和密碼
const char* mqtt_server = "broker-cn.emqx.io";    //mqtt服務器地址 (IP/域名)這里可以不改
const char *pubTopic="my_pubtopic";
const char *subTopic="my_subtopic";        //訂閱的主題WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE  (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;void setup_wifi() {delay(10);// We start by connecting to a WiFi networkSerial.println();Serial.print("Connecting to ");Serial.println(ssid);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}randomSeed(micros());Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}void callback(char* topic, byte* payload, unsigned int length) {String cmd="";Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");for (int i = 0; i < length; i++) {cmd+=(char)payload[i];}Serial.println(cmd);const size_t capacity = JSON_OBJECT_SIZE(1) + 10;   //計算buffer的大小   ...SIZE(1)表明buffer中只有一個對象DynamicJsonBuffer jsonBuffer(capacity);           //創建動態的jsonbufferJsonObject& root = jsonBuffer.parseObject(cmd);     //解析Json對象字符串if(root.containsKey("led"))      //判斷是否包含某個鍵{int led = root["led"]; if(led){Serial.println("1");}elseSerial.println("2");}if(root.containsKey("beep"))      //判斷是否包含某個鍵{int beep = root["beep"]; if(beep){Serial.println("3");}elseSerial.println("4");}
}void reconnect() {// Loop until we're reconnectedwhile (!client.connected()) {Serial.print("Attempting MQTT connection...");// Create a random client IDString clientId = "ESP8266Client-";clientId += String(random(0xffff), HEX);// Attempt to connectif (client.connect(clientId.c_str())) {Serial.println("connected");// Once connected, publish an announcement...client.publish(pubTopic, "hello world");    //發布的主題// ... and resubscribeclient.subscribe(subTopic);        //設置訂閱的主題} else {Serial.print("failed, rc=");Serial.print(client.state());Serial.println(" try again in 5 seconds");// Wait 5 seconds before retryingdelay(5000);}}
}void setup() {Serial.begin(115200);setup_wifi();client.setServer(mqtt_server, 1883);client.setCallback(callback);
}void loop() {if (!client.connected()) {reconnect();}client.loop();unsigned long now = millis();if (now - lastMsg > 2000) {lastMsg = now;++value;snprintf (msg, MSG_BUFFER_SIZE, "%ld", value);Serial.print("Publish message: ");Serial.println(msg);client.publish(pubTopic, msg);}
}

4.功能驗證

打開MQTT調試助手,進入設置界面

?

服務器地址和端口號很重要,設置為和你8266代碼里面一樣的?

設置成功后點擊連接

將服務器的發布主題設置為8266上的訂閱主題,這樣,只要你一發布內容,服務器就會自動推送給8266,8266就可以接收數據了。

同理,將服務器的訂閱主題設置為8266的發布主題,這樣服務器就能接收到8266上發的數據。

服務器接收的數據如下:

?

?通過服務器發布消息:? (必須為json格式)

8266做出相關反應:

?

可見,8266正確接收并解析了相關消息。

5.總結?

? ? ? ? 至此,已經完成了,8266向服務器發送消息,可解析服務器下發的消息。ESP8266智能家居項目已經完成了將近一半。試想一下,如果你可以開發一款APP,并且APP上訂閱的主題就是8266發布的主題,APP上發布的主題就是8266上訂閱的主題,并且8266通過串口和單片機通訊,這樣就可以讓單片機測量到的溫度、濕度、光照等信息顯示在手機APP上,并且手機給單片機下發的開燈、開蜂鳴器、開窗等指令也能被識別并執行!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLMChain使用 | RouterChain的使用 - 用本地大模型搭建多Agents

單個本地大模型搭建參考博客 單個Chain&#xff1a;面對一個需求&#xff0c;我們需要創建一個llmchain&#xff0c;設置一個prompt模板&#xff0c;這個chain能夠接收一個用戶input&#xff0c;并輸出一個結果&#xff1b;多個Chain&#xff1a;考慮到同時面對多個需求&#x…

動態規劃背包問題

前言 動態規劃背包問題是一類經典的優化問題&#xff0c;涉及到選擇物品以最大化某個目標值&#xff08;通常是價值或利潤&#xff09;&#xff0c;同時受到某種約束&#xff08;如重量、體積或時間&#xff09;。背包問題可以分為多種類型&#xff0c;例如0-1背包問題、完全背…

第三百六十回

文章目錄 1. 概念介紹2. 實現方法2.1 環繞效果2.2 立體效果 3. 示例代碼4. 內容總結 我們在上一章回中介紹了"自定義SlideImageSwitch組件"相關的內容&#xff0c;本章回中將介紹兩種陰影效果.閑話休提&#xff0c;讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本…

設計模式-創建型模式-原型模式

原型模式&#xff08;Prototype Pattern&#xff09;&#xff1a;使用原型實例指定創建對象的種類&#xff0c;并且通過克隆這些原型創建新的對象。原型模式是一種對象創建型模式。原型模式其實就是從一個對象再創建另外一個可定制的對象&#xff0c;而且不需知道任何創建的細節…

微信小程序開發學習筆記——2.8媒體組件image的src三種引入方式

>>跟著b站up主“咸蝦米_”學習微信小程序開發中&#xff0c;把學習記錄存到這方便后續查找。 課程連接&#xff1a; https://www.bilibili.com/video/BV19G4y1K74d?p11 image&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/image.html 一…

如何在Python中執行Shell腳本?

Python執行Shell命令 1、背景概述2、Python集成Shell及數據交互 1、背景概述 Python作為一種強大的腳本語言&#xff0c;其易用性和靈活性使得它成為自動化任務的理想選擇。在Python中執行Shell腳本可以實現一些操作系統級的功能&#xff0c;使程序更加靈活、易理解和易維護 在…

Redis-內存管理

Redis是基于內存存儲的&#xff0c;非關系型&#xff0c;鍵值對數據庫。因此&#xff0c;對Redis來說&#xff0c;內存空間的管理至關重要。那Redis是如何內存管理的呢&#xff1f; 一、最大內存限制 Redis 提供了 maxmemory 參數允許用戶設置 Redis 可以使用的最大內存大小。…

js設計模式:依賴注入模式

作用: 在對象外部完成兩個對象的注入綁定等操作 這樣可以將代碼解耦,方便維護和擴展 vue中使用use注冊其他插件就是在外部創建依賴關系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

Elastic Search:構建語義搜索體驗

當你逐步熟悉 Elastic 時&#xff0c;你將使用 Elasticsearch Relevance Engine? (ESRE)&#xff0c;該引擎旨在為 AI 搜索應用程序提供支持。 借助 ESRE&#xff0c;你可以利用一套開發人員工具&#xff0c;包括 Elastic 的文本搜索、向量數據庫和我們用于語義搜索的專有轉換…

ngnix網站服務詳解

一 Nginx的簡介 1 Nginx&#xff1a; ①Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器&#xff0c;而且支持熱部署&#xff0c;幾乎可以做到 7 * 24 小時不間斷運行&#xff0c;即使運行幾個月也不需要重新啟動&#xff0c;還能在不間斷服務的情況下對軟件版本進行熱…

2月22日作業,按鍵中斷LED燈控制

1.使用GPIO子系統&#xff0c;編寫LED驅動&#xff0c;應用程序測試 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/of.h> …

微軟Azure OpenAI的 GPT 接口使用小結

直接使用OpenAI的 GPT服務&#xff0c;在國內環境使用上會一些相關問題&#xff0c;微軟提供了OpenAI的服務&#xff0c;基本上可以滿足的相關的需要。下面提供一些簡單的使用操作&#xff0c;來讓你快速使用到 GPT 的服務。 前提&#xff1a;注冊Azure的賬戶&#xff0c;并綁…

OpenCV中的normalize函數以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具體應用介紹

在OpenCV中&#xff0c;normalize函數用于將圖像或矩陣的值規范化到一個特定的范圍內。這在圖像處理中非常有用&#xff0c;比如在調整圖像的對比度、準備數據進行機器學習處理時。規范化可以提高不同圖像之間的可比性&#xff0c;或是為了滿足特定算法對數據范圍的要求。 nor…

數的反碼和補碼表示

2.反碼 反碼的表示方法是: 正數的反碼是其本身負數的反碼是在其原碼的基礎上,符號位不變&#xff0c;其余各個位取反 [1][000000011原[000000011反[-1][10000001]原[11111110]反 3.補碼 補碼的表示方法是: 正數的補碼就是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其余各…

36、IO進程線程/進程和線程之間的通信練習

一、使用有名管道完成兩個進程的相互通信(提示&#xff1a;可以使用多進程或多線程完成)。 代碼1&#xff1a;創建兩個有名管道文件 #include<myhead.h>int main(int argc, const char *argv[]) {if(mkfifo("./mingtohua",0664)-1)//創建小明向小華發信息的管…

Stable Diffusion 繪畫入門教程(webui)-ControlNet(深度Depth)

上篇文章介紹了線稿約束&#xff0c;這篇文章介紹下深度Depth 文章目錄 一、選大模型二、寫提示詞三、基礎參數設置四、啟用ControlNet 顧名思義&#xff0c;就是把原圖預處理為深度圖&#xff0c;而深度圖可以區分出圖像中各元素的遠近關系&#xff0c;那么啥事深度圖&#xf…

c/c++ | 字符串函數總結 | 為什么總喜歡糾結sizeof 和strlen 呢?

其實時間長了&#xff0c;稍微研究后&#xff0c;再來品味&#xff0c;別有一番滋味 總是看著混亂&#xff0c;但是靜下來看&#xff0c;還是能琢磨透的&#xff0c;只是看著復雜&#xff0c;本質是兩套風格&#xff0c;然后又要有交集&#xff0c;所以就看起來復雜 // 首先字符…

目標管理SMART原則

SMART原則是一種目標管理方法&#xff0c;它包括以下五個要素&#xff1a; 具體性&#xff08;Specific&#xff09;&#xff1a;目標應該是明確的&#xff0c;具體地說明要達成的行為標準。例如&#xff0c;一個目標可能描述為“減少客戶投訴率”&#xff0c;而不是“增強客戶…

本機防攻擊簡介

定義 在網絡中&#xff0c;存在著大量針對CPU&#xff08;Central Processing Unit&#xff09;的惡意攻擊報文以及需要正常上送CPU的各類報文。針對CPU的惡意攻擊報文會導致CPU長時間繁忙的處理攻擊報文&#xff0c;從而引發其他業務的中斷甚至系統的中斷&#xff1b;大量正常…

惠爾頓 網絡安全審計系統 任意文件讀取漏洞復現

0x01 產品簡介 惠爾頓網絡安全審計產品致力于滿足軍工四證、軍工保密室建設、國家涉密網絡建設的審計要求&#xff0c;規范網絡行為&#xff0c;滿足國家的規范&#xff1b;支持1-3線路的internet接入、1-3對網橋&#xff1b;含強大的上網行為管理、審計、監控模塊&#xff1b…