一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用一個ESP8266加上STM32單片機做一個小產(chǎn)品?

GReq_mcu168 ? 來源:果果小師弟 ? 作者:果果小師弟 ? 2022-07-05 15:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【一】

說起學(xué)習(xí)物聯(lián)網(wǎng),相信大家最先想到的應(yīng)該就是ESP8266了吧?這個模塊可以連網(wǎng)(就是連接你家中的路由器),也可以作為一個熱點來讓你的手機連接它,是不是很奇妙?

雖然ESP8266程序和相關(guān)的產(chǎn)品已經(jīng)十分成熟了,但還是有一些剛?cè)腴T的小伙伴不知道怎么學(xué)。比如,如何用一個ESP8266加上STM32單片機做一個小產(chǎn)品?這個學(xué)習(xí)的路線又是怎樣的?我們應(yīng)該如何入門?對此,我建議:1、先單獨學(xué)習(xí)ESP8266模塊,搞懂他的AT指令集,通過串口調(diào)試助手和網(wǎng)絡(luò)調(diào)試助手單獨把這個模塊搞明白。2、學(xué)習(xí)mqtt協(xié)議,為啥第二步要學(xué)習(xí)mqtt協(xié)議呢?因為我們esp8266是要連接服務(wù)器的,簡單地說mqtt就是ESP8266與服務(wù)器之間的通信協(xié)議,這個協(xié)議不難,我已經(jīng)寫好了筆記到時候在這個公眾號直接發(fā)布就可以了。3、就是要學(xué)習(xí)android studio自己做一個app。既然是物聯(lián)網(wǎng)控制,當(dāng)然有app了,雖然阿里云還有機智云有直接可以用的app,但作為一個電子愛好者,不能僅限于云智能今天,就帶你用STM32和ESP8266一個比如溫濕度顯示,并在手機app上實時。

學(xué)習(xí)方法:
1、多去各大論壇查資料去B站找相關(guān)的視頻
2、學(xué)會舉一反三,讓你點亮一個LED,就要會滅一個led;
3、多動手,程序不是寫出來的,是調(diào)出來和改出來的。

ESP8266 01S簡介:

使用AT功能之前,模塊內(nèi)必須有AT的固件,每個模塊的生產(chǎn)廠商都會對樂鑫官方的AT固件做一些修改和刪減,但是其最核心的AT指令功能都是相同的。我們買的ESP8826模塊一般都有刷好的固件,所以不用自己刷固件。

ESP-01S WiFi模塊是一款低功耗高性價比的嵌入式無線網(wǎng)絡(luò)控制模塊。可滿足智能電網(wǎng)、樓宇自動化、安防、智能家居、遠(yuǎn)程醫(yī)療等物聯(lián)網(wǎng)應(yīng)用的需求。該模塊核心處理器ESP8266在較小尺寸封裝中集成了業(yè)界領(lǐng)先的Tensilica L106超低功耗32位微型MCU,帶有16位精簡模式,主頻支持80MHz和160MHz,支持RTOS,板載天線。該模塊支持完整的TCP/IP協(xié)議棧。用戶可以使用該模塊為現(xiàn)有的設(shè)備添加聯(lián)網(wǎng)功能,也可以構(gòu)建獨立的網(wǎng)絡(luò)控制器。

(1)模塊供電電壓為直流3.3V、電流為500mA以上。

(2Wi-Fi模塊IO最大輸出電流為12mA。

(3)Wi-Fi模塊NRST管腳低電平有效;EN使能管腳高電平有效。

(4)Wi-Fi模塊進(jìn)入升級模式:GPIO0處于低電平,然后模塊復(fù)位上電;Wi-Fi模塊進(jìn)入正常工作模式:GPIO0處于高電平,模塊復(fù)位上電。

(5)Wi-Fi模塊的RXD接外部MCU的TXD,Wi-Fi模塊的TXD接外部MCU的RXD。

e1737458-fc34-11ec-ba43-dac502259ad0.png

e18c2b74-fc34-11ec-ba43-dac502259ad0.png ?e1a138e8-fc34-11ec-ba43-dac502259ad0.png

ESP8266刷固件:

刷固件可以用杜邦線,也可以用刷固件的模塊(淘寶上幾塊錢就可以買到),如下圖所示:e1bc817a-fc34-11ec-ba43-dac502259ad0.png

AT指令控制ESP8266模組:

樂鑫官方的AT指令有將近100條,但常用的就十幾條,理解起來也非常簡單,現(xiàn)在舉例一些常用指令,并使用這些指令一步一步的通過TCP連接到遠(yuǎn)程的服務(wù)器實現(xiàn)收發(fā)數(shù)據(jù),更多AT指令可以查閱《ESP8266 AT指令集手冊》。

e1d2f126-fc34-11ec-ba43-dac502259ad0.png總結(jié)AT指令的構(gòu)成就是,每條指令要以AT開始,后面跟要查詢(讀)或者要設(shè)置寫)的參數(shù),例如查詢WIFI模式對應(yīng)的指令為AT+CWMODE?,設(shè)置WIFI模式為AT+CWMODE=3。另外,要求的回車換行符結(jié)尾是說要在待發(fā)送的數(shù)據(jù)后面追加 ,即十六進(jìn)制的0x0D 0x0A。注意:在使用串口調(diào)試助手發(fā)送AT指令時,只需要在待發(fā)送指令后面加回車即可,大家可以勾選“按十六進(jìn)制發(fā)送”,觀察數(shù)據(jù)后面是否追加了0x0D 0x0A。

1、測試模塊是否正常

e1f3ed36-fc34-11ec-ba43-dac502259ad0.gif該指令通常在開機后查詢模塊是否正常啟動,如果回復(fù)OK,則表示為正常啟動。

2、開啟/關(guān)閉回顯

從上圖可以看出,我們發(fā)送了一個AT,模塊回復(fù)了AT OK,即模塊將發(fā)送過來的指令原封不動的先復(fù)述了一遍后接著發(fā)送有效回復(fù),我們稱這種復(fù)述為回顯,關(guān)閉回顯(發(fā)送ATE0)后如再次發(fā)送AT,則只回復(fù)OK。如下圖所示:

e2241452-fc34-11ec-ba43-dac502259ad0.gif

3、設(shè)置AP模式及AP參數(shù)

WIFI模式有兩種,一種叫AP模式,一種叫Station模式,AP就是我們平時所說的熱點,如WIFI路由器,開了熱點的手機,或者是公共熱點等,這些AP設(shè)備可以允許其他設(shè)備(如手機,筆記本電腦等)輸入熱點名和密碼(也可不設(shè)置密碼)后接入,Station則是前面說的連接AP的設(shè)備,如:手機,筆記本電腦等,當(dāng)ESP8266設(shè)置為AP模式時,其他設(shè)備可以接入該熱點,最多支持4臺Station設(shè)備接入。AP模式也是ESP8266默認(rèn)的模式。

設(shè)置ESP8266流程如下:

1、首先發(fā)送AT+CWMODE?查詢模塊當(dāng)前處于哪一種模式,下圖可以知道AT+CWMODE=2就是熱點模式。

e23c8e2e-fc34-11ec-ba43-dac502259ad0.gif2、然后我們發(fā)送AT+CWMODE=2,讓模塊處于熱點模式下,同時我們的電腦上也會顯示熱點名稱。e24c3f18-fc34-11ec-ba43-dac502259ad0.png

3、我們現(xiàn)在自定義設(shè)置我們ESP8266的熱點名和密碼,來看看我們電腦能不能連接我們所設(shè)置的好的ESP8266模塊。

1、設(shè)置WIFI模式為AP模式

2、設(shè)置AP熱點屬性

AT+CWSAP=AT+CWSAP_DEF="ESP8266-XSD","12345678",5,3

其含義為:熱點名為ESP8266-XSD,密碼為12345678,使用通道5,加密方式為 WPA2_PSK,這里的通道對應(yīng)的就是不同的射頻頻率,如果同一空間內(nèi)存在相同通道的WIFI信號,將會產(chǎn)生干擾,影響上網(wǎng)質(zhì)量,因此可以設(shè)置通道來避免這種干擾,常用的通道有1 6 11,因為這三個通道互不產(chǎn)生干擾。設(shè)置效果如下圖所示:

e2676e46-fc34-11ec-ba43-dac502259ad0.gif

連接數(shù)量可以限制Station設(shè)備的接入數(shù)量,廣播或者不廣播SSID就是指是否隱藏?zé)狳c名,使熱點更加安全。此外,AT+CWSAP=AT+CWSAP_DEF表示設(shè)置的參數(shù)會存儲的flash,還有另外一個類似指令A(yù)T+CWSAP=AT+CWSAP_ CUR,該條指令表示設(shè)置的參數(shù)重啟后失效,即不保存到flash中。其他的AT指令也有類似的后綴。

4、設(shè)置為Station模式

該模式是平時應(yīng)用最多的模式,因為物聯(lián)網(wǎng)設(shè)備需要連接到家中路由才可以接入外網(wǎng),此時設(shè)備就作為Station連接到AP熱點。設(shè)置Station并連接AP流程如下:

1、設(shè)置WIFI模式為Station
2、連接到家中路由器

AT+CWJAP="liuyao","liuyao1001"

下圖為連接過程的串口輸出:

e27f46d8-fc34-11ec-ba43-dac502259ad0.gif這時候我們進(jìn)入家中的路由器,就能看到我們的ESP8266模塊連接到了家中的路由器。如果想要斷開連接,可以使用AT+CWQAP,就可以斷開ESP8266與路由器的連接。e2931d02-fc34-11ec-ba43-dac502259ad0.png

現(xiàn)在我們的ESP8266已經(jīng)與家中的路由器連接上了,現(xiàn)在我們?nèi)绻氆@取連接的這個ESP8266的IP可以使用AT+CIPSTA?指令,返回的是路由器分配給ESP8266的局域網(wǎng)IP以及網(wǎng)關(guān)地址和子網(wǎng)掩碼。

e29ee09c-fc34-11ec-ba43-dac502259ad0.png

5、使用TCP實現(xiàn)局域網(wǎng)內(nèi)的設(shè)備通信

建立TCP連接(AT+CIPSTART)

TCP實現(xiàn)局域網(wǎng)內(nèi)的設(shè)備通信時先要讓ESP8266連接到家中的熱點。該條指令可以指定建立連接的協(xié)議類型,通常使用的有兩種:TCP和UDP。

我們先打開網(wǎng)絡(luò)調(diào)試助手,并將其設(shè)置為TCP Server端,具體設(shè)置如下:e2ae8e70-fc34-11ec-ba43-dac502259ad0.png

接下來,發(fā)送AT指令建立TCP連接,成功連接會提示CONNECT,接著使用發(fā)送指令:AT+CIPSEND=14,其中15是發(fā)送數(shù)據(jù)的長度,該指令發(fā)送完成后,接收窗口會顯示 > ,我們接著在發(fā)送窗口發(fā)送"I m TCP Client",TCP Server端會收到該信息,接著再通過TCP Server發(fā)送"I m TCP Server",串口接收端會打印Client收到的數(shù)據(jù)。

下面就是ESP8266連接當(dāng)前環(huán)境的熱點,與服務(wù)器建立TCP連接,傳輸數(shù)據(jù)的過程,所有的字符和標(biāo)點必須是英。(1)設(shè)置WIFI模式為Station:AT+CWMODE=1(2)連家中路由器:AT+CWJAP="liuyao","liuyao1001"(3)TCP:AT+CIPSTART="TCP","192.168.0.103",8080(4)提示發(fā)送數(shù)據(jù)長度為14:AT+CIPSEND=14(5)串口調(diào)試助手發(fā)送:I m TCP Client(6)網(wǎng)絡(luò)調(diào)試助手發(fā)送:I m TCP Server

e2cccfc0-fc34-11ec-ba43-dac502259ad0.png

這一步很多人可能很懵,不知道為啥要這樣做,你這個搞的串口調(diào)試助手還有網(wǎng)絡(luò)調(diào)試助手還有啥TCP Server到底是啥意思???

哈哈,我相信很多初學(xué)者學(xué)到這里也不是很清楚。我這里簡單說一下,我們的用ESP8266是不是要讓它連到家中的網(wǎng)啊,那在這里我們的網(wǎng)絡(luò)調(diào)試助手的TCP Server就是我們要連接的網(wǎng)絡(luò)。

有人又要說了,我要連家中路由器的網(wǎng)啊,為啥要連網(wǎng)絡(luò)調(diào)試助手的網(wǎng)啊?這是因為如果你連家中的網(wǎng),請問你如何給你家的路由器發(fā)送數(shù)據(jù)?。∧阍趺粗缆酚善鹘邮盏搅藬?shù)據(jù)??!路由器又咋給你發(fā)送數(shù)據(jù)啊!你又咋接收數(shù)據(jù)啊!我們這里用網(wǎng)絡(luò)調(diào)試助手的目的就是讓網(wǎng)絡(luò)調(diào)試助手來代替路由器局域網(wǎng)。TCP Server就是服務(wù)端的意思也是就是服務(wù)器。至于為啥用串口調(diào)試助手我就不用說了吧,只有你在串口助手上調(diào)試好了,我們才用單片機的串口結(jié)合ESP8266共同代替客服端,也就不需要調(diào)試助手了。

所以說,我們一定要在串口調(diào)試助手上把相關(guān)的數(shù)據(jù)調(diào)通了,把原理過程搞懂了之后我們再去搞單片機程序,再去搭建你的服務(wù)器而不是用網(wǎng)絡(luò)調(diào)試助手代替了。怎么樣現(xiàn)在明白了吧!

開啟透傳傳輸(AT+CIPMODE=1)

前面在使用TCP進(jìn)行數(shù)據(jù)發(fā)送時,在每次發(fā)送數(shù)據(jù)之前都要指定發(fā)送數(shù)據(jù)的長度,而且在接收到數(shù)據(jù)之后,還會有+IPD,< len >的前綴,這樣很不方便進(jìn)行數(shù)據(jù)的處理,因此我們可以使用AT+CIPMODE=1指令開啟透傳模式,開啟透傳模式后只需要在第一次發(fā)送數(shù)據(jù)時使用ATD+CIPSEND指令來告訴ESP8266開始透傳發(fā)送,隨后我們直接發(fā)送想要的數(shù)據(jù)即可,在接收到數(shù)據(jù)時,也沒有了+IPD,< len >前綴。

下面就是ESP8266連接當(dāng)前環(huán)境的熱點,與服務(wù)器建立TCP連接,開啟透傳模式傳輸數(shù)據(jù)的過程,所有的字符和標(biāo)點必須是英。

(1)設(shè)置WIFI模式為Station:AT+CWMODE=1

(2)連家中路由器:AT+CWJAP="liuyao","liuyao1001"

(3)TCP:AT+CIPSTART="TCP","192.168.0.103",8080

(4)開啟透傳模式:AT+CIPMODE=1

(5)開始透傳發(fā)送:AT+CIPSEND

(6)串口調(diào)試助手發(fā)送:hello I m TCP Client!

(7)網(wǎng)絡(luò)調(diào)試助手發(fā)送:hello I m TCP Server!

e2e0bdd2-fc34-11ec-ba43-dac502259ad0.png

如果想要退出透傳發(fā)送模式,先發(fā)送+++(0x2B 0x2B 0x2B),注意沒有換行符,接著使用AT+CIPMODE=0指令退出透傳模式,恢復(fù)到默認(rèn)傳輸模式。如果不退出透傳模式,那么在透傳模式下就不能發(fā)送AT指令了,它會默認(rèn)為字符串發(fā)送。

6、使用SmartConfig為設(shè)備配網(wǎng)

前面使用了AT+CWJAP指令來主動連接家中的WIFI,但是在大多數(shù)的物聯(lián)網(wǎng)產(chǎn)品中,缺少輸入WIFI密碼的輸入設(shè)備,如:鍵盤,更不能將程序交給用戶去修改家中的WIFI熱點名和密碼,在真正的項目開發(fā)中使用最多的方法就是通過一顆按鍵來使設(shè)備進(jìn)入某種模式,并使用手機將當(dāng)前WIFI的密碼告知該設(shè)備來實現(xiàn)WIFI配網(wǎng),這種模式就是SmartConfig。在該模式下,ESP8266會監(jiān)聽指定端口的UDP廣播包,如果收到符合規(guī)定格式的廣播包后會對其進(jìn)行解析并獲得WIFI的SSID和PWD,然后自動連接獲取到的WIFI熱點,從而實現(xiàn)WIFI配網(wǎng)。

e2fd4a7e-fc34-11ec-ba43-dac502259ad0.jpg

智能配網(wǎng)需要三個設(shè)備:家中的路由器、WIFI模塊、手機。模塊處于station模式,手機連接好家中的wifi。這個具體的工作的原理是:我們需要將wifi配置為station模式。因為默認(rèn)的是ap模式,然后要保證手機連接到家中的路由器熱點。手機上面的第一行是我們手機此時連接的這個熱點名,下面第一行需要用戶去手動的輸入路由器熱點對應(yīng)的密碼,下面會有一個按鍵就寫著叫配網(wǎng)(連接),那么當(dāng)我們點擊這個配網(wǎng)之后,手機則會以UDP的這種傳輸?shù)姆绞?。向某個端口號或某個IP地址當(dāng)中去廣播。廣播內(nèi)容是廠商自己封裝的一個數(shù)據(jù)幀結(jié)構(gòu),廣播的時候就不用去指定具體的IP地址,每個模組可能默認(rèn)是不同的。只要指定賬號,當(dāng)我按下配網(wǎng)的這個按鈕之后,此時它會UDP廣播的形式向外連續(xù)的去發(fā)送一串兒廠商約定好的一個數(shù)據(jù)幀結(jié)構(gòu),比如說前面對應(yīng)的是廠商的這個ID,后面跟的是這個熱點名,后面跟著的是這個熱點密碼等。當(dāng)然,也可以對它進(jìn)行一些加密處理,如果此時我們通過按下這個。用點上面的某個按鍵,比如說是配置了我們這個wifi模組,進(jìn)入了smartconfig這個配網(wǎng)模式。這個時候wifi模塊會處于一個監(jiān)聽的狀態(tài)。比如udp的協(xié)議監(jiān)聽8080端口上面這個數(shù)據(jù)。如果我收到了這一塊兒有效的數(shù)據(jù),那么他會將這里面有用的熱點名和密碼摘出來,然后使用類似透傳模式這種功能,內(nèi)部的將它連接到指定的熱點上面,就實現(xiàn)了一鍵配網(wǎng)的過程。知道了ESP8266模塊如何用了之后,接下來我們就要用STM32和ESP8266來實現(xiàn)與服務(wù)器的之間的數(shù)據(jù)收發(fā)!

我們說到了ESP8266的AT指令集的使用。本來今天要講一下MQTT協(xié)議的,但考慮到物聯(lián)網(wǎng)知識體系的完整性,決定還是先說一下物聯(lián)網(wǎng)智能家居的控制過程和流程,以及關(guān)于MQTT協(xié)議中的訂閱和發(fā)布是什么意思。就算是下一章的前奏吧,請大家耐心看完

簡單地說,我們最終實現(xiàn)的目的,是要用STM32+ESP8266外加傳感器和繼電器來控制家中的開關(guān),以及得到家中的各個電器的運行狀態(tài)。其原理是家里的電器先接帶STM32+ESP8266+繼電器的智能插座,智能插座再接家里的插座,這樣只要控制ESP8266的這個插座(類似中介)就能控制家里的任何電器。

下面這張圖就是控制方式,通過家用的路由器將各個電器和手機聯(lián)系起來了,手機可以通過路由器控制各個掛載在路由器上的器件,這是比較常用的模式。

【二】 e3187510-fc34-11ec-ba43-dac502259ad0.png

一般來說,把手機叫做上位機,控制器叫做下位機,難道這就是我們常說的物聯(lián)網(wǎng)嗎?準(zhǔn)確地說,這是不對的。畢竟只能圍繞著這個路由器,有一定的局限性。

比如,你到公司才想起忘了關(guān)家里的燈,那么只能跑回家,運氣好的話,在樓下就能連到家里的路由器,然后再通過手機app關(guān)燈。這時候你想,如果能在任何地方控制家里的電器該多好,要是真有這樣的功能,比如你冬天回家前可以先把家里的空凋打開……

我們這個項目就是ESP8266連接家中的路由器的網(wǎng),手機連接的是4/5G網(wǎng),這樣你就能在家中設(shè)備不斷電、不斷網(wǎng)的情況下,在任意地方來控制你家中的用電器設(shè)備了。

一、理論知識

那么,怎么樣才能讓你在任何地方控制家里的電器(當(dāng)然提前還是要有網(wǎng))?

我們先來看下面這張圖,跟原來不一樣的地方是用云服務(wù)器代替了家里的路由器,就這么簡單!

那么,什么是云服務(wù)器?云服務(wù)器又在哪?你就把它當(dāng)作天上的一朵云就好了(阿里云、騰訊云),反正就是不管你的手機,還是別的什么設(shè)備,只要能連網(wǎng)就可以連接云服務(wù)器。

e32489b8-fc34-11ec-ba43-dac502259ad0.png

那么,連上服務(wù)器后,是不是就能直接控制了?當(dāng)然可以!

剛學(xué)單片機的小伙伴肯定玩過串口實驗,從單片機發(fā)送字母xiaoshidi,串口調(diào)試助手就收到字母xiaoshidi,覺得很有趣。但有時候你會發(fā)現(xiàn),如果你的串口通信的函數(shù)寫的不好,或者有誤的時候,就會出現(xiàn)通信錯誤,比如接收的數(shù)據(jù)是亂碼等,那么它的可靠性就不是很好了。

到底什么叫可靠性不好呢?比如這邊發(fā)過去的時候是xiaoshidi,運氣不好的話,那邊只可能收到的是shidi,這樣就會出事。所以,我們也不能直接向云服務(wù)器發(fā)送個簡單指令去控制下位機,需要有一定的約定。

比如,事先告訴服務(wù)器我要發(fā)送9個字母過來了,云服務(wù)器收到后就知道了,如果接收xiaoshidi,一般來說是正確接收了;如果只收到shidi,說明丟了4個字母,這就是我們常說的丟包。那么,這樣的約定就是我們常說的協(xié)議!

有句話叫“沒有物聯(lián)網(wǎng)協(xié)議就沒有智能安全”,其實關(guān)鍵就是協(xié)議,在物聯(lián)網(wǎng)中常用的就是MQTT協(xié)議。那么,為什么不用我們常見的http協(xié)議呢?只能自己百度了。這邊簡單介紹一下MQTT協(xié)議的原理,因為只要會MQTT,就能玩轉(zhuǎn)物聯(lián)網(wǎng)。

我們先來看個例子:

e33f7f3e-fc34-11ec-ba43-dac502259ad0.png比如,我在微博里關(guān)注了“曉艷考研”,那么當(dāng)“曉艷考研”發(fā)了一條微博后,我就能收到。

為什么能收到呢?是因為我關(guān)注它了,我想這些玩微博的小伙伴都知道。

下面,我再用圖表示一下:

e36a687a-fc34-11ec-ba43-dac502259ad0.png

好了,到這邊其實已經(jīng)把MQTT協(xié)議的原理講清楚了。“曉艷考研”相當(dāng)于手機,我相當(dāng)于單片機(控制器),如下圖所示:e38c0142-fc34-11ec-ba43-dac502259ad0.png這樣的話,就實現(xiàn)了手機控制單片機的功能!在微博中,只有我關(guān)注“曉艷考研”這個號,才能收到對方發(fā)來的微博,那么在MQTT中,單片機訂閱手機的這個主題才能收到手機發(fā)送的指令!這樣一來,如果單片機再通過繼電器接家里的電器,手機就可以控制家里任何電器的開關(guān)了!

通過這樣的控制方式,就可以解決在單位也能開/關(guān)家里電燈的問題了。不過前提是,手機和單片機都能連上云服務(wù)器(手機可以用家里的網(wǎng)或者4G就可以連到云服務(wù)器,單片機可以通過家里的WIFI就可以連到云服務(wù)器)。

這時可能有人會問,在微博里像“曉艷考研”那么有名,有很多人都會關(guān)注,比如小雅、小李等等,只要“曉艷考研”發(fā)布消息了,關(guān)注的人都能收到。

e39a1ab6-fc34-11ec-ba43-dac502259ad0.png在MQTT協(xié)議中也是如此,只要單片機1、單片機2、單片機3等都訂閱了手機這個主題,那么只要手機發(fā)指令,就能控制各個單片機,那么也就是能控制家里的各個電器。

有的小伙伴腦子轉(zhuǎn)的溜,感覺這樣控制是有問題的。因為這樣的話,手機是統(tǒng)一控制了家里的電器,總不能都一起開、一起關(guān)吧?

e3b72746-fc34-11ec-ba43-dac502259ad0.png在微博有個功能,叫@。雖然我、小雅、小李都關(guān)注了“曉艷考研”,但“曉艷考研”在發(fā)布消息的時候還能@我,那么在MQTT協(xié)議中也是一樣,也能@某個控制器。這樣的話,就能單獨控制某個功能了。

關(guān)于MQTT理論,我們先說到這兒,其實還有很多玩法,比如在微博里“曉艷考研”也關(guān)注了我呢?這個有什么用?這樣可以用控制器采集信息上傳到我們的手機了!那就可以采集家中的環(huán)境數(shù)據(jù)上發(fā)到你的手機。

二、實現(xiàn)部分

根據(jù)下面這張圖,我們要做三部分:單片機、云服務(wù)器、手機。

e3bd9e00-fc34-11ec-ba43-dac502259ad0.png ?

1、單片機

一般來說,單片機也叫作控制器,或者下位機。我們這里用的是STM32單片機。

這時有人會問,為什么不用51單片機,或者arduino?因為現(xiàn)在用STM32的人太多了,arduino又體現(xiàn)不出你是一個電子信息專業(yè)的,51就不用說了。

可能又有人說,你為啥不用esp32,本來就可以當(dāng)一塊單片機,搞個STM32豈不是太麻煩?

此言差矣!我們這里是把ESP8266當(dāng)做一個模塊使用,我僅僅用STM32的串口就可以控制它連網(wǎng)。但如果單單只用ESP32的話,就大大增加了開發(fā)的難度,也就是我們通常說的SDK開發(fā),而且學(xué)習(xí)的同時,又能鞏固單片機的知識,搞SDK確實不適合初學(xué)者。

最后,我們的MQTT協(xié)議轉(zhuǎn)換成C語言代碼已經(jīng)有前輩寫好了,我們的目的就是學(xué)會它,學(xué)會反向?qū)W習(xí),才能增加你對新事物的學(xué)習(xí)興趣。MQTT協(xié)議是現(xiàn)成的,拿來用即可!

在理論部分提到的MQTT協(xié)議是整個物聯(lián)網(wǎng)的核心,所以單片機、手機和云服務(wù)器都要有這協(xié)議。這就好比三個中國人在聊天,一個日本人過來聽,他根本聽不懂,因為他沒有“中文”這個能力。所以,控制器也要有這個解析協(xié)議的能力。

2、服務(wù)器

服務(wù)器可以理解成一臺普通的電腦,只是它的性能比較穩(wěn)定不容易死機。目前服務(wù)器有很多,做得比較大的像騰訊云、阿里云等等,購買服務(wù)器也是個坑,大家需謹(jǐn)慎!前期的話,大家學(xué)習(xí)不用買,登錄生活物聯(lián)平臺用現(xiàn)成的,后面我會講到。

3、手機

一般把手機也叫上位機,上位機還有電腦、平板等等,實驗中是用手機發(fā)送命令來控制我們的單片機。那么手機能打開直接能操作嗎?顯然不能,需要編寫相應(yīng)的程序界面。

如果你是安卓手機,可以用android studio軟件編寫相應(yīng)的app程序。當(dāng)然,前期的話,大家不要去想著做一個app,難度還是蠻大的。

【三】

在學(xué)習(xí)MQTT之前,我們要明白MQTT通訊是通過很多的報文組成的,這就好比二戰(zhàn)時期發(fā)電報進(jìn)行兩軍之間的通信。這個報文呢,主要由三部分組成:固定報文+可變報文+有效載荷,這是官方起的名字,你可以把它理解為開頭+正文+結(jié)尾,這樣就好理解多了是吧?!

基本在MQQTT中,所有的報文都由這三部分組成。比如今天要說的Connect控制報文,顧名思義就是客戶端(ESP8266)請求與服務(wù)端(阿里云服務(wù)器)建立連接的報文。

啥意思呢?這就好比你第一次去你女朋友家,你要首先打一個電話(Connect控制報文)征得叔叔阿姨的同意啊!叔叔阿姨同意之后(服務(wù)器確認(rèn)建立連接)你才能去對吧,如果不同意或者電話沒打通你就不能去你女朋友家啊,就算去了也不招待見對吧!

00:22

客戶端到服務(wù)端的網(wǎng)絡(luò)連接建立后,客戶端發(fā)送給服務(wù)端的第一個報文必須是connect報文(因為客戶端和服務(wù)端必須要建立連接后才能進(jìn)行通信)。

1、CONNECT控制報文主要由三部分組成:固定報頭、可變報頭、有效載荷。

e3c58232-fc34-11ec-ba43-dac502259ad0.png

2、假設(shè)我們得到了固定報頭是“l(fā)iuyao”、可變報頭是“iloveyou”、有效載荷是“zhuxiaoya”。我們要把這些字母轉(zhuǎn)換成對應(yīng)的16進(jìn)制。然后再把它們串聯(lián)起起來就得到。

e3d2ea76-fc34-11ec-ba43-dac502259ad0.png

1、固定報頭

固定報頭包含兩個字節(jié),第一個字節(jié)是固定的:0x10,第二個字節(jié)是是剩余長度字段,剩余長度等于可變報頭的長度(10字節(jié))加上有效載荷的長度。e3df49ce-fc34-11ec-ba43-dac502259ad0.png

最終固定報頭:綜上可得固定報頭為:10 ??(??我們在后面的實驗會提到,先不著急)。

2、可變報頭

可變報頭有四部分組成,協(xié)議名、協(xié)議級別、連接標(biāo)志、保持連接。大家不要糾結(jié)為啥由這四部分組成,這是人家寫這個協(xié)議的人規(guī)定的,你只要搞清楚這四部分對應(yīng)的編碼是啥就可以了,其余的四個字:不要糾結(jié)。e3fed9a6-fc34-11ec-ba43-dac502259ad0.png

2.1 協(xié)議名

e40f7bd0-fc34-11ec-ba43-dac502259ad0.png

2.2 協(xié)議級別

e41d1632-fc34-11ec-ba43-dac502259ad0.png

2.3 連接標(biāo)志

e4281942-fc34-11ec-ba43-dac502259ad0.png

2.4 保持連接

e43d66ee-fc34-11ec-ba43-dac502259ad0.png

2.5 總結(jié)

e451d142-fc34-11ec-ba43-dac502259ad0.png

2.6 最終可變報頭

綜上,我們可得有效報頭為:00 04 4D 51 54 54 04 C2 00 64

3、有效載荷

有效載荷由三部分組成:客服端標(biāo)識符、用戶名、密碼組成。e4610f9a-fc34-11ec-ba43-dac502259ad0.png ?e46f12a2-fc34-11ec-ba43-dac502259ad0.png

3.1 原始數(shù)據(jù)

我們在阿里云物聯(lián)網(wǎng)平臺上創(chuàng)建一個設(shè)備后,會得下面這三個數(shù)據(jù),這三個數(shù)據(jù)非常重要。

	{ "ProductKey":"a10zwkUxQUS", "DeviceName":"LY-1", "DeviceSecret":"d8b9915513b05d4de32fbed04566edd8" } 阿里云服務(wù)器地址(華東2) : *.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883

	客戶端ID :*|securemode=3,signmethod=hmacsha1| 用戶名:*&# 密碼: clientId*deviceName*productKey# 

3.2 加工后的數(shù)據(jù)


	服務(wù)器地址:a10zwkUxQUS.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 客戶端ID :LY-1|securemode=3,signmethod=hmacsha1| 用戶名:LY-1&a10zwkUxQUS 密碼:clientIdLY-1deviceNameLY-1productKeya10zwkUxQUS 經(jīng)過哈希加密:7a03368e740ff9efb8318c6ba2a0260f2a596f87 哈希加密在線計算網(wǎng)站:http://encode.chahuo.com/e47dd15c-fc34-11ec-ba43-dac502259ad0.png之后要將客服端ID、用戶名、經(jīng)過哈希加密后的密碼轉(zhuǎn)換成16進(jìn)制。

	客戶端ID :LY-1|securemode=3,signmethod=hmacsha1| 用戶名:LY-1&a10zwkUxQUS 經(jīng)過哈希加密:7a03368e740ff9efb8318c6ba2a0260f2a596f87 

3.3 轉(zhuǎn)換成16進(jìn)制


	客戶端ID:LY-1|securemode=3,signmethod=hmacsha1|轉(zhuǎn)換為(16進(jìn)制): 4C592D317C7365637572656D6F64653D332C73 69676E6D6574686F643D686D6163736861317C一共38個字節(jié)就是0x26 最終結(jié)果:把0026加到最前面 00264C592D317C7365637572656D6F64653D332C 7369676E6D6574686F643D686D6163736861317C 用戶名:LY-1&a10zwkUxQUS轉(zhuǎn)換為(16進(jìn)制): 4C592D31266131307A776B5578515553一共16個字節(jié)就是0x10 最終結(jié)果:把0010加到最前面 00104C592D31266131307A776B5578515553 經(jīng)過哈希加密:7a03368e740ff9efb8318c6ba2a0260f2a596f87轉(zhuǎn)換為(16進(jìn)制) 3761303333363865373430666639656662383331 3863366261326130323630663261353936663837一共40個字節(jié)就是0x28 最終結(jié)果:把0028加到最前面 002837613033333638653734306666396566623833 313863366261326130323630663261353936663837 

最終可得:

  • 客戶端: 00 264C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
  • 用戶名: 00 104C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53
  • 密碼: 00 2837 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37
  • 組合到一起: 00 264C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C00 104C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 2837 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

3.4 最終有效載荷

這樣我們就得到了有效載荷:

00 264C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C00 104C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 2837 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

4、Connect控制報文

固定報頭+可變報頭+有效載荷

  • 10??00 04 4D 51 54 54 04 C2 00 6400 264C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C00 104C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 5300 2837 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37
現(xiàn)在要解決的就是"??",也就是我們最開始說的剩余長度。這個問號??就是表示在問號后面有幾個字符,有幾個字符??就代表多少,然后把這個數(shù)字轉(zhuǎn)換成16進(jìn)制填入??就可以了。我們通過數(shù)數(shù)可以知道??后面有110個數(shù),10進(jìn)制的110轉(zhuǎn)換成16進(jìn)制就是0x6E。所以最終得到的CONNECT 控制報文為:
  • 106E00 04 4D 51 54 54 04 C2 00 6400 264C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C00 104C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 5300 2837 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37
通過網(wǎng)絡(luò)調(diào)試助手發(fā)送connect報文:1. 協(xié)議類型選擇 TCP Client2. 本機地址:本機地址會在軟件選擇TCP Client后默認(rèn)出現(xiàn),不用手動選擇3. 遠(yuǎn)程主機地址:這個就是我們創(chuàng)建設(shè)備后阿里云的遠(yuǎn)程地址

	服務(wù)器地址:a10zwkUxQUS.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 4.在發(fā)送數(shù)據(jù)之前要先勾選按16進(jìn)制發(fā)送,之后會在網(wǎng)絡(luò)調(diào)試助手的接受端出現(xiàn):20 02 00 00說明發(fā)送正常接收正常,如果點擊發(fā)送按鈕之后網(wǎng)絡(luò)調(diào)試助手馬上就斷開或者接收不到數(shù)據(jù)的話,就說明你發(fā)送的數(shù)據(jù)有問題,請仔細(xì)回去好好把報文數(shù)據(jù)整理一遍,否則不能發(fā)送成功。你要知道,錯的不可能是阿里云,也不是MQTT協(xié)議,錯的只有你的數(shù)據(jù)!e49ef3c8-fc34-11ec-ba43-dac502259ad0.png這里為啥是收到的是20 02 00 00,我們可以去看看數(shù)據(jù)手冊中3.2小節(jié)的connect確認(rèn)連接請求。e4a8201a-fc34-11ec-ba43-dac502259ad0.png
		?e4afaa60-fc34-11ec-ba43-dac502259ad0.png這樣我們的客戶端就與阿里云的服務(wù)端連接起來了,我們現(xiàn)在可以去看看阿里云官網(wǎng)就會發(fā)現(xiàn)此時的LY-1設(shè)備處于在線狀態(tài)。哈哈,是不是很奇妙??!e4c38332-fc34-11ec-ba43-dac502259ad0.png

5、斷開鏈接

我們可以看到數(shù)據(jù)手冊的3.14小節(jié),斷開連接的報文是 E0 00 e4cf49e2-fc34-11ec-ba43-dac502259ad0.png然后我們在連接狀態(tài)下向服務(wù)器發(fā)從斷開可連接的報文E0 00,這是服務(wù)器就會與客戶端斷開,由于斷開后收不到服務(wù)器發(fā)來的數(shù)據(jù)。所以網(wǎng)絡(luò)調(diào)試助手不會接收到任何新消息。 e4dd10c2-fc34-11ec-ba43-dac502259ad0.png這時,我們再到阿里云官網(wǎng)(刷新一下網(wǎng)頁)就會發(fā)現(xiàn),此時的LY-1設(shè)備處于離線狀態(tài)。哈哈,是不是很奇妙??!

e4f4e558-fc34-11ec-ba43-dac502259ad0.png

我們用網(wǎng)絡(luò)調(diào)試助手的目的就我們現(xiàn)在還沒有單片機和esp8266,但是我們又必須要學(xué)習(xí)mqtt協(xié)議,只有通過網(wǎng)絡(luò)調(diào)試助手來代替單片機來實現(xiàn),等我們網(wǎng)絡(luò)調(diào)試助手都調(diào)通了之后我們再把他一直到我們的STM32單片機中就可以了。UDP-----為應(yīng)用程序提供了一種無需建立連接就可以發(fā)送封裝的IP數(shù)據(jù)包的方法 TCPClient客戶端------單片機(網(wǎng)絡(luò)調(diào)試助手代替單片機) TCPServer服務(wù)端------阿里云
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6067

    文章

    44976

    瀏覽量

    650225
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11031

    瀏覽量

    364621

原文標(biāo)題:爛大街的ESP8266究竟該怎么玩?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    單片機實例項目:ESP8266串口WIFI

    單片機實例項目:ESP8266串口WIFI,推薦下載!
    發(fā)表于 06-03 21:01

    ESP8266燒錄與機智云鍵配網(wǎng)教程

    ESP8266模塊因其低成本和高性能,廣泛應(yīng)用于智能家居和工業(yè)自動化等領(lǐng)域。機智云平臺提供了鍵配網(wǎng)功能,簡化了設(shè)備的聯(lián)網(wǎng)過程。本教程將詳細(xì)介紹如何使用ESP8266進(jìn)行燒錄,并通過機智云實現(xiàn)
    的頭像 發(fā)表于 05-24 11:04 ?440次閱讀
    <b class='flag-5'>ESP8266</b>燒錄與機智云<b class='flag-5'>一</b>鍵配網(wǎng)教程

    esp8266 at device做一個網(wǎng)頁服務(wù)器 ,運行webnet_test顯示錯誤怎么解決?

    我現(xiàn)在想用esp8266 at device 做一個網(wǎng)頁服務(wù)器 但是文件系統(tǒng)什么都做好了 運行webnet_test 顯示下邊的錯誤 查了論壇 說at不支持服務(wù)器 但是是20年的帖子了 現(xiàn)在有支持嗎 如果不支持是不是換rw007就可以了
    發(fā)表于 03-07 06:47

    STM32ESP32應(yīng)該學(xué)哪個

    等等,市場占有率也很高。 ESP32相對年輕了不少,滿打滿算也不到 10 歲,他的前身,還得從 ESP8266 說起,都屬于樂鑫科技的產(chǎn)品。 如果你用單片機做過
    的頭像 發(fā)表于 02-18 09:52 ?684次閱讀

    esp8266加入到c51單片機單通道程序怎么寫

    要將ESP8266模塊加入到C51單片機的單通道程序中,您需要了解如何通過串行通信(UART)與ESP8266進(jìn)行通信。以下是如何實現(xiàn)這點的步驟和示例代碼。 步驟 1:硬件連接 首先
    的頭像 發(fā)表于 10-18 11:32 ?1644次閱讀

    ESP8266 太空人動畫的 OLED 顯示

    ESP8266 太空人動畫的 OLED 顯示
    的頭像 發(fā)表于 10-08 15:06 ?700次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動畫的 OLED 顯示

    STM32 ESP8266阿里云鏈接源碼

    stm32F103C8T6 ESP8266 物聯(lián)網(wǎng)電表 登錄阿里云
    發(fā)表于 08-29 14:21 ?9次下載

    esp32和esp8266代碼共用嗎

    本文將介紹ESP32和ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32和
    的頭像 發(fā)表于 08-19 18:23 ?2333次閱讀

    esp8266esp32區(qū)別是什么

    以下是關(guān)于ESP8266ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用Tensilica L106 80MHz的處理
    的頭像 發(fā)表于 08-19 18:16 ?7303次閱讀

    ESP8266需要燒錄固件庫嘛

    需要。ESP8266款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項目中。它具有低成本、低功耗、易于編程等特點,因此受到了許多開發(fā)者的喜愛。在開發(fā)ESP8266項目時,燒錄固件庫是
    的頭像 發(fā)表于 08-19 17:30 ?1865次閱讀

    esp8266不燒錄可以使用嗎

    ESP8266款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項目中。然而,如果不進(jìn)行燒錄,ESP8266將無法正常工作。 1. ESP8266簡介
    的頭像 發(fā)表于 08-19 17:28 ?1670次閱讀

    esp8266wifi模塊怎么連接手機

    ESP8266 WiFi模塊連接手機主要可以通過兩種方式實現(xiàn): 通過路由器連接(STA模式)和直接作為熱點連接(AP模式) 。以下是兩種連接方式的步驟: 、通過路由器連接(STA模式) 配置
    的頭像 發(fā)表于 08-19 17:27 ?7591次閱讀

    如何使用ESP8266創(chuàng)建WiFi熱點?

    我有第二張?zhí)峁┟赓M互聯(lián)網(wǎng)的SIM卡,但我無法在手機中使用它,因為我只有SIM卡插槽。 因此,我想使用ESP8266創(chuàng)建WiFi熱點
    發(fā)表于 07-19 11:29

    如何對ESP8266進(jìn)行降頻?

    大家好,我正在做一個電池供電的物聯(lián)網(wǎng)項目,正在考慮使用 esp8266。我需要讓 esp 直運行,以不斷記錄來自我的傳感器的數(shù)據(jù)。不幸的是,即使我完全關(guān)閉 wifi,它仍然消耗 16
    發(fā)表于 07-19 10:55

    是否可以創(chuàng)建包含多個esp8266模塊(esp-01)的網(wǎng)狀網(wǎng)絡(luò)?

    我想知道是否可以創(chuàng)建包含多個 esp8266 模塊(esp-01)的網(wǎng)狀網(wǎng)絡(luò)。如果是這樣,是否有任何指南/示例可以開始使用 esp8266
    發(fā)表于 07-19 08:31