當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]???? 點(diǎn)擊上方嵌入式開發(fā)圈 記得關(guān)注我們哦! ????這是我之前學(xué)習(xí)ESP8266想的思路,后續(xù)用STM32來實(shí)現(xiàn)其中一個或兩個功能。 一、ESP8266配網(wǎng)(使用手機(jī)APP來給模組配置) 假設(shè)已經(jīng)開發(fā)了一個手機(jī)APP,這個APP完成的功能如下: 1、連接設(shè)備接的模塊ESP8266生成的

    

點(diǎn)擊上方嵌入式開發(fā)圈 記得關(guān)注我們哦!

    這是我之前學(xué)習(xí)ESP8266想的思路,后續(xù)用STM32來實(shí)現(xiàn)其中一個或兩個功能。

一、ESP8266配網(wǎng)(使用手機(jī)APP來給模組配置)


假設(shè)已經(jīng)開發(fā)了一個手機(jī)APP,這個APP完成的功能如下:

1、連接設(shè)備接的模塊ESP8266生成的熱點(diǎn)

2、給設(shè)備熱點(diǎn)發(fā)送要連接的路由器的名字和密碼

配網(wǎng)流程

1、設(shè)備讓ESP8266進(jìn)入AP模式設(shè)備MCU通過串口給ESP8266發(fā)送AT+CWMODE=2,讓ESP8266進(jìn)入AP模式。如果進(jìn)入AP模式成功,用手機(jī)可以搜索到ESP8266模塊的熱點(diǎn)信息。


2、用手機(jī)APP去連接這個熱點(diǎn)發(fā)送路由器ssid和password,假設(shè)格式為: ssid:“xxx”,password:“xxxx”


3、解析APP發(fā)過來的字符串格式ESP8266串口收到格式:

ssid:“xxx”,password:"xxxx"這個字符串設(shè)備MCU處理收到的這個字符串,將ssid和password提取出來。分別保存到緩存區(qū)SSID、PASSWORD。


4、設(shè)備讓ESP8266進(jìn)入STA模式設(shè)備MCU通過串口給ESP8266發(fā)送AT+CWMODE=1,讓ESP8266進(jìn)入STA模式。


5、設(shè)備連接路由器拿保存在緩存區(qū)的SSID和PASSWORD,設(shè)備通過串口給ESP8266發(fā)送連接指令A(yù)T+CWJAP=“SSID”,“PASSWORD”


6、連接公網(wǎng)服務(wù)器

===>120.78.136.134:8888AT+CIPSTART=“TCP”,“120.78.136.134”,9002

    配網(wǎng)成功!如果以后不在初始化設(shè)置模式下,不會執(zhí)行該流程,默認(rèn)開機(jī)直接連接對應(yīng)的熱點(diǎn)和服務(wù)器。

 


二、ESP8266配網(wǎng)(使用上位機(jī)串口來給模組配置)


假設(shè)已經(jīng)開發(fā)了一個上位機(jī),這個上位機(jī)完成的功能如下:

1、上位機(jī)通過串口連接設(shè)備

2、具有設(shè)置wifi帳號和密碼的功能(其實(shí)就是發(fā)送一條串口指令,帶有wifi帳號和密碼)

3、具有設(shè)置服務(wù)器ip和端口號的功能(其實(shí)就是發(fā)送一條串口指令,帶有服務(wù)器ip和端口號)

配網(wǎng)流程

1、直接讓設(shè)備進(jìn)入STA模式    上位機(jī)通過串口給接有ESP8266的設(shè)備發(fā)送AT+CWMODE=1,讓ESP8266進(jìn)入STA模式。

2、設(shè)備接收到上位機(jī)發(fā)送過來的進(jìn)入STA模式的指令,透傳給ESP8266,    這時ESP8266如果設(shè)置成功,則處于STA模式。

3、特定模式下(初始化設(shè)置),線程等待上位機(jī)下發(fā)的指令指令格式:(1)設(shè)置wifi連接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”(2)設(shè)置wifi連接服務(wù)器SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

4、設(shè)備接收到上位機(jī)下發(fā)的指令,進(jìn)行解析后分別保存在緩存區(qū)中。

5、設(shè)備連接路由器    拿保存在緩存區(qū)的SSID和PASSWORD,設(shè)備通過串口給ESP8266發(fā)送連接指令A(yù)T+CWJAP=“SSID”,“PASSWORD”

6、連接公網(wǎng)服務(wù)器

===>xxx.xx.xxx.xxx:xxxx例如:AT+CIPSTART=“TCP”,“120.78.136.134”,9002

    配網(wǎng)成功!如果以后不在初始化設(shè)置模式下,不會執(zhí)行該流程,默認(rèn)開機(jī)直接連接對應(yīng)的熱點(diǎn)和服務(wù)器。


三、ESP8266配網(wǎng)(使用上位機(jī)網(wǎng)絡(luò)TCP來給模組配置)


假設(shè)以及開發(fā)了一個上位機(jī),這個上位機(jī)完成的功能如下:

1、上位機(jī)可以用TCP/IP連接wifi熱點(diǎn)(ESP8266)===>需要知道esp8266的ip和端口號,通過window網(wǎng)絡(luò)狀態(tài)可以查到。

2、具有設(shè)置wifi帳號和密碼的功能(其實(shí)就是發(fā)送一條串口指令,帶有wifi帳號和密碼)

3、具有設(shè)置服務(wù)器ip和端口號的功能(其實(shí)就是發(fā)送一條串口指令,帶有服務(wù)器ip和端口號)

配網(wǎng)流程

設(shè)備端

1、直接讓設(shè)備進(jìn)入AP模式上位機(jī)通過串口給接有ESP8266的設(shè)備發(fā)送AT+CWMODE=2,讓ESP8266進(jìn)入AP模式。

指令:

AT+CWMODE=2

2、重啟設(shè)備,確保AP模式設(shè)置成功指令:

AT+RST

3、開啟多路連接指令:

AT+CIPMUX=1

4、為設(shè)備端創(chuàng)建熱點(diǎn)指令:

AT+CWSAP=“WIFI名稱”,“WIFI密碼”,1,4

5、設(shè)備端啟動服務(wù)器指令:

AT+CIPSERVER=1,8080

PC端

1、事先需要讓PC去連接wifi熱點(diǎn)===>WIFI名稱、WIFI密碼

2、通過網(wǎng)絡(luò)連接詳情查看當(dāng)前熱點(diǎn)的IPv4服務(wù)器地址

3、PC端開發(fā)的上位機(jī)連接IPv4服務(wù)器地址,端口號就是設(shè)備端指定的端口號:8080

4、PC端開發(fā)的上位機(jī)下發(fā)指令給設(shè)備端指令格式:

(1)設(shè)置wifi連接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”

(2)設(shè)置wifi連接服務(wù)器

SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

設(shè)備端

1、解析字符串,如果含有

SSID:“xxxx”,“PASSWORD”:“xxxxx”,取得ssid和password,保存到設(shè)備端的FLASH中,如果為其它,則設(shè)定接收出錯的條件。

2、解析字符串,如果含有如下字符串:

SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

這時候程序解析取得server_ip和port,保存到設(shè)備端的FLASH中,如果為其它,則設(shè)定接收出錯的條件。

3、如果已經(jīng)解析完兩個字符串,自動重啟,切換到STA模式,取出ssid和password,連接ap,連接成功后,接下來取出flash中的server_ip和port,連接服務(wù)器,如果成功,則可進(jìn)入數(shù)據(jù)上傳,如果不成功,則返回ap連接,依次進(jìn)行,直到成功后,此時程序中連接成功的標(biāo)志會置一。

4、定時查詢與服務(wù)器端確認(rèn)是否連接成功,如果不成功,需要重新連接服務(wù)器。

5、可上傳數(shù)據(jù)

    ESP8266端,其實(shí)我已經(jīng)寫好了一個程序,只是還不是那么的完善,但現(xiàn)在已經(jīng)可以用了,分享出來,大家可以去完善它。

    大致程序框架設(shè)計如下,分別是配置WIFI的過程以及正常連接WIFI的過程:

//配置wifi網(wǎng)絡(luò)int Cofig_Wifi_NetWork(void){ int ret = -1 ; char *buf = NULL;
while(1) { switch(ESP8266_INFO.config_network_status) { case CHECK_WIFI_EXIST: ret = Wifi_Test_Exist();
if(0 != ret) { printf("wifi初始化失敗,請檢查硬件是否連接!\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); return -1 ; } else { ESP8266_INFO.config_network_status = WIFI_SET_MODE ; LED1(OFF); } break ;
case WIFI_SET_MODE: ret = Wifi_Set_Mode(3);
if(0 != ret) { printf("wifi設(shè)置模式失敗\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_BUILD_AP ; LED1(OFF); } break ;
case WIFI_BUILD_AP: printf("準(zhǔn)備ap....\n"); ret = ESP8266_BuildAP("ESP8266", "123456", WPA2_PSK);
if(1 != ret) { printf("wifi創(chuàng)建AP失敗...\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_CONFIG_MULTI ; LED1(OFF); printf("創(chuàng)建ap成功\n"); } break ;
case WIFI_CONFIG_MULTI: printf("配置多連接模式!\r\n"); ret = ESP8266_Enable_MultipleId(ENABLE);
if(1 != ret) { printf("配置多連接失敗\n"); ESP8266_INFO.config_network_status = WIFI_BUILD_AP ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_START_SERVER ; LED1(OFF); } break ;
case WIFI_START_SERVER: ret = ESP8266_StartOrShutServer(ENABLE, "8080", "10") ;
if(1 != ret) { printf("創(chuàng)建端口號:%d失敗\r\n", 8080); ESP8266_INFO.config_network_status = WIFI_CONFIG_MULTI ; LED1(ON); } else { printf("創(chuàng)建端口號:%d成功\r\n", 8080); ESP8266_INFO.config_network_status = WIFI_GET_AP_IP ; LED1(OFF); } break ;
case WIFI_GET_AP_IP: buf = malloc(20); if(buf == NULL) return -1;
if(1 != ESP8266_Inquire_ApIp(buf, 20)) { if(1 == ESP8266_StartOrShutServer(DISABLE, "8080", "5000")) { printf("關(guān)閉服務(wù)器成功!\r\n"); ESP8266_INFO.config_network_status = WIFI_START_SERVER ; //回到開啟服務(wù)器的流程 LED1(OFF); } free(buf); } printf("獲取ap ip:%s成功\r\n", buf); free(buf); ESP8266_INFO.config_network_status = WAIT_CLIENT_CONNECT; break ;
case WAIT_CLIENT_CONNECT: while(1) { //接收上位機(jī)連接 ret = ESP8266_Get_IdLinkStatus(); if(0 != ret) { printf("設(shè)備已和上位機(jī)建立連接....\r\n"); ESP8266_INFO.config_network_status = BACK_TO_CONFIG_PROCESS ; LED1(ON); break ; } LED2(ON); Delay_ms (10); LED2(OFF); Delay_ms(10); } break ;
default: break ; }
if(ESP8266_INFO.config_network_status == BACK_TO_CONFIG_PROCESS) { LED1(OFF); LED2(OFF); LED3(OFF); break ; } }
return 0 ;}
//wifi正常連接流程void Wifi_NetWork_Process(void){ int ret = -1 ;
while(1) { switch(ESP8266_INFO.wifi_status) { case WIFI_EXIST_CHECK: ret = Wifi_Test_Exist();
if(0 != ret) { printf("wifi硬件故障!\n"); return ; }
ESP8266_INFO.wifi_status = WIFI_SET_MODE ; break ;
case WIFI_SET_MODE: ret = Wifi_Set_Mode(STA);
if(0 != ret) { printf("wifi設(shè)置模式失敗\r\n"); ESP8266_INFO.wifi_status = WIFI_EXIST_CHECK ; } else ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER;
break ;
case WIFI_CONNECT_ROUTER: ret = Wifi_Connect_Router((const char *)ESP8266_INFO.wifi_ssid, (const char *)ESP8266_INFO.wifi_password);
if(ret != 0) { printf("連接wifi熱點(diǎn)失敗\n"); ESP8266_INFO.wifi_status = WIFI_SET_MODE ; return ; } else { printf("連接wifi熱點(diǎn):%s成功\n", ESP8266_INFO.wifi_ssid); ESP8266_INFO.wifi_status = WIFI_CLOSE_MULTI ; }
case WIFI_CLOSE_MULTI:
//關(guān)閉多連接 if(1 != ESP8266_Enable_MultipleId(DISABLE)) { printf("關(guān)閉多連接失敗!\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ; } else { printf("關(guān)閉多連接成功!\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_SERVER ; }
break ;
case WIFI_CONNECT_SERVER: ret = Wifi_Connect_Server("TCP", (const char *)ESP8266_INFO.server_ip, atoi((char *)ESP8266_INFO.server_port));
if(ret != 0) { printf("連接服務(wù)器失敗\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ; } else { printf("連接服務(wù)器:%s成功\n", ESP8266_INFO.server_ip); ESP8266_INFO.wifi_status = WIFI_CONFIG_OK ; }
break ;
default: break ; }
//wifi連接成功 if(WIFI_CONFIG_OK == ESP8266_INFO.wifi_status) { LED3(ON); break ; } }
return ;}

//返回當(dāng)前子串在原字符串中的索引int Sub_String_Index(char *str, char *sub_str){ char *p1 = NULL ; char *__str = str ; char *__sub_str = sub_str ; p1 = strstr(__str, __sub_str); return p1 - __str ;}

/////////////////////////////////////ESP8266解析參數(shù)int Esp8266_Process_Para(void){ char *str = NULL ; char *p1 = NULL ; char *p2 = NULL ; int index1 = 0, index2 = 0 ;
//開始wifi配置 while(1) { //如果該標(biāo)志為0,則代表上位機(jī)已經(jīng)連上設(shè)備了 if(BACK_TO_CONFIG_PROCESS == ESP8266_INFO.config_network_status) { if(0 == ESP8266_Get_IdLinkStatus()) { printf("客戶端已掉線,需重新連接....\n"); LED2(ON); Delay_ms(300); LED2(OFF); Delay_ms(300); } //此時客戶端沒有掉線 else { printf("客戶端已連接,可下發(fā)數(shù)據(jù)....\n"); //準(zhǔn)備配置wifi_ssid str = ESP8266_ReceiveString(DISABLE); p1 = str + 12 ;
if(NULL != strstr(p1, "SSID")) { //拷貝wifi ssid index1 = Sub_String_Index(p1, "="); index2 = Sub_String_Index(p1, ";"); memcpy(ESP8266_INFO.wifi_ssid, p1 + index1 + 1, index2 - index1 - 1); //拷貝wifi密碼 p2 = p1 + index2 + 1 ; index1 = Sub_String_Index(p2, "=") ; index2 = Sub_String_Index(p2, ";") ; memcpy(ESP8266_INFO.wifi_password, p2 + index1 + 1, index2 - index1 - 1); printf("wifi_ssid:%s wifi_password:%s\r\n", ESP8266_INFO.wifi_ssid, ESP8266_INFO.wifi_password); macESP8266_Usart ("setting ssid_password success"); ESP8266_INFO.wifi_config_ap_flag = 1 ; } else if(NULL != strstr(p1, "SERVER_IP")) { //拷貝服務(wù)器相關(guān)參數(shù)===>server_ip index1 = Sub_String_Index(p1, "="); index2 = Sub_String_Index(p1, ";"); memcpy(ESP8266_INFO.server_ip, p1 + index1 + 1, index2 - index1 - 1); //拷貝服務(wù)器相關(guān)參數(shù)===>server_port p2 = p1 + index2 + 1 ; index1 = Sub_String_Index(p2, "=") ; index2 = Sub_String_Index(p2, ";") ; memcpy(ESP8266_INFO.server_port, p2 + index1 + 1, index2 - index1 - 1); printf("server_ip:%s server_port:%s\r\n", ESP8266_INFO.server_ip, ESP8266_INFO.server_port); macESP8266_Usart ("setting server_ip port success"); ESP8266_INFO.wifi_cofnig_server_flag = 1 ; }
//如果都配置了,則進(jìn)入正常啟動流程 if((1 == ESP8266_INFO.wifi_config_ap_flag) && (1 == ESP8266_INFO.wifi_cofnig_server_flag)) { ESP8266_INFO.config_network_status = 1 ; return ESP8266_INFO.config_network_status ; } } } else if(1 == ESP8266_INFO.config_network_status) { return ESP8266_INFO.config_network_status ; } }}

手機(jī)APP設(shè)計得比較簡陋

以下使用QT設(shè)計的一個簡單的配置工具界面

韋東山精品嵌入式課程(包含裸機(jī)、驅(qū)動、應(yīng)用、系統(tǒng))






商務(wù)合作

深圳市云之手科技有限公司

支持我請給我在看,讓更多人知道!



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉