ESP8266配網思路(不使用SmartConfig)
這是我之前學習ESP8266想的思路,后續(xù)用STM32來實現其中一個或兩個功能。
假設已經開發(fā)了一個手機APP,這個APP完成的功能如下:
1、連接設備接的模塊ESP8266生成的熱點
2、給設備熱點發(fā)送要連接的路由器的名字和密碼
配網流程
1、設備讓ESP8266進入AP模式設備MCU通過串口給ESP8266發(fā)送AT+CWMODE=2,讓ESP8266進入AP模式。如果進入AP模式成功,用手機可以搜索到ESP8266模塊的熱點信息。
2、用手機APP去連接這個熱點發(fā)送路由器ssid和password,假設格式為: ssid:“xxx”,password:“xxxx”
3、解析APP發(fā)過來的字符串格式ESP8266串口收到格式:
ssid:“xxx”,password:"xxxx"這個字符串設備MCU處理收到的這個字符串,將ssid和password提取出來。分別保存到緩存區(qū)SSID、PASSWORD。
4、設備讓ESP8266進入STA模式設備MCU通過串口給ESP8266發(fā)送AT+CWMODE=1,讓ESP8266進入STA模式。
5、設備連接路由器拿保存在緩存區(qū)的SSID和PASSWORD,設備通過串口給ESP8266發(fā)送連接指令AT+CWJAP=“SSID”,“PASSWORD”
6、連接公網服務器
===>120.78.136.134:8888AT+CIPSTART=“TCP”,“120.78.136.134”,9002
配網成功!如果以后不在初始化設置模式下,不會執(zhí)行該流程,默認開機直接連接對應的熱點和服務器。
假設已經開發(fā)了一個上位機,這個上位機完成的功能如下:
1、上位機通過串口連接設備
2、具有設置wifi帳號和密碼的功能(其實就是發(fā)送一條串口指令,帶有wifi帳號和密碼)
3、具有設置服務器ip和端口號的功能(其實就是發(fā)送一條串口指令,帶有服務器ip和端口號)
配網流程
1、直接讓設備進入STA模式 上位機通過串口給接有ESP8266的設備發(fā)送AT+CWMODE=1,讓ESP8266進入STA模式。
2、設備接收到上位機發(fā)送過來的進入STA模式的指令,透傳給ESP8266, 這時ESP8266如果設置成功,則處于STA模式。
3、特定模式下(初始化設置),線程等待上位機下發(fā)的指令指令格式:(1)設置wifi連接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”(2)設置wifi連接服務器SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”
4、設備接收到上位機下發(fā)的指令,進行解析后分別保存在緩存區(qū)中。
5、設備連接路由器 拿保存在緩存區(qū)的SSID和PASSWORD,設備通過串口給ESP8266發(fā)送連接指令AT+CWJAP=“SSID”,“PASSWORD”
6、連接公網服務器
===>xxx.xx.xxx.xxx:xxxx例如:AT+CIPSTART=“TCP”,“120.78.136.134”,9002
配網成功!如果以后不在初始化設置模式下,不會執(zhí)行該流程,默認開機直接連接對應的熱點和服務器。
假設以及開發(fā)了一個上位機,這個上位機完成的功能如下:
1、上位機可以用TCP/IP連接wifi熱點(ESP8266)===>需要知道esp8266的ip和端口號,通過window網絡狀態(tài)可以查到。
2、具有設置wifi帳號和密碼的功能(其實就是發(fā)送一條串口指令,帶有wifi帳號和密碼)
3、具有設置服務器ip和端口號的功能(其實就是發(fā)送一條串口指令,帶有服務器ip和端口號)
配網流程
設備端
1、直接讓設備進入AP模式上位機通過串口給接有ESP8266的設備發(fā)送AT+CWMODE=2,讓ESP8266進入AP模式。
指令:
AT+CWMODE=2
2、重啟設備,確保AP模式設置成功指令:
AT+RST
3、開啟多路連接指令:
AT+CIPMUX=1
4、為設備端創(chuàng)建熱點指令:
AT+CWSAP=“WIFI名稱”,“WIFI密碼”,1,4
5、設備端啟動服務器指令:
AT+CIPSERVER=1,8080
PC端
1、事先需要讓PC去連接wifi熱點===>WIFI名稱、WIFI密碼
2、通過網絡連接詳情查看當前熱點的IPv4服務器地址
3、PC端開發(fā)的上位機連接IPv4服務器地址,端口號就是設備端指定的端口號:8080
4、PC端開發(fā)的上位機下發(fā)指令給設備端指令格式:
(1)設置wifi連接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”
(2)設置wifi連接服務器
SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”
設備端
1、解析字符串,如果含有
SSID:“xxxx”,“PASSWORD”:“xxxxx”,取得ssid和password,保存到設備端的FLASH中,如果為其它,則設定接收出錯的條件。
2、解析字符串,如果含有如下字符串:
SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”
這時候程序解析取得server_ip和port,保存到設備端的FLASH中,如果為其它,則設定接收出錯的條件。
3、如果已經解析完兩個字符串,自動重啟,切換到STA模式,取出ssid和password,連接ap,連接成功后,接下來取出flash中的server_ip和port,連接服務器,如果成功,則可進入數據上傳,如果不成功,則返回ap連接,依次進行,直到成功后,此時程序中連接成功的標志會置一。
4、定時查詢與服務器端確認是否連接成功,如果不成功,需要重新連接服務器。
5、可上傳數據
ESP8266端,其實我已經寫好了一個程序,只是還不是那么的完善,但現在已經可以用了,分享出來,大家可以去完善它。
大致程序框架設計如下,分別是配置WIFI的過程以及正常連接WIFI的過程:
//配置wifi網絡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設置模式失敗\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("準備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("關閉服務器成功!\r\n");ESP8266_INFO.config_network_status = WIFI_START_SERVER ; //回到開啟服務器的流程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){//接收上位機連接ret = ESP8266_Get_IdLinkStatus();if(0 != ret){printf("設備已和上位機建立連接....\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設置模式失敗\r\n");ESP8266_INFO.wifi_status = WIFI_EXIST_CHECK ;}elseESP8266_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://關閉多連接if(1 != ESP8266_Enable_MultipleId(DISABLE)){printf("關閉多連接失敗!\n");ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ;}else{printf("關閉多連接成功!\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("連接服務器失敗\n");ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ;}else{printf("連接服務器:%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 ;}//返回當前子串在原字符串中的索引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解析參數int Esp8266_Process_Para(void){char *str = NULL ;char *p1 = NULL ;char *p2 = NULL ;int index1 = 0, index2 = 0 ;//開始wifi配置while(1){//如果該標志為0,則代表上位機已經連上設備了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ā)數據....\n");//準備配置wifi_ssidstr = ESP8266_ReceiveString(DISABLE);p1 = str + 12 ;if(NULL != strstr(p1, "SSID")){//拷貝wifi ssidindex1 = 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")){//拷貝服務器相關參數===>server_ipindex1 = Sub_String_Index(p1, "=");index2 = Sub_String_Index(p1, ";");memcpy(ESP8266_INFO.server_ip, p1 + index1 + 1, index2 - index1 - 1);//拷貝服務器相關參數===>server_portp2 = 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 ;}//如果都配置了,則進入正常啟動流程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 ;}}}
手機APP設計得比較簡陋
以下使用QT設計的一個簡單的配置工具界面
深圳市云之手科技有限公司
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





