日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

    

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

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

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


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

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

2、給設(shè)備熱點發(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模塊的熱點信息。


2、用手機(jī)APP去連接這個熱點發(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)的熱點和服務(wù)器。

 


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


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

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

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

3、具有設(shè)置服務(wù)器ip和端口號的功能(其實就是發(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)的熱點和服務(wù)器。


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


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

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

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

3、具有設(shè)置服務(wù)器ip和端口號的功能(其實就是發(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)建熱點指令:

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

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

AT+CIPSERVER=1,8080

PC端

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

2、通過網(wǎng)絡(luò)連接詳情查看當(dāng)前熱點的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端,其實我已經(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熱點失敗\n"); ESP8266_INFO.wifi_status = WIFI_SET_MODE ; return ; } else { printf("連接wifi熱點:%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ù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉