前言
SmartConfig配網是在手機APP連接路由器的情況下.
APP發送無線信息在空中.
Wi-Fi模塊通過監測空中的無線信息實現的獲取路由器名稱和密碼
1.包含以下頭文件
#include "smartconfig.h"

2.編寫配網程序


void smartconfig_callback(sc_status status, void *pdata){ switch(status) { case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; case SC_STATUS_LINK://獲取到手機發來的無線信息 os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; //連接路由器 WIFI_Connect(sta_conf->ssid, sta_conf->password, wifiConnectCb); break; case SC_STATUS_LINK_OVER: os_printf("SC_STATUS_LINK_OVER\n"); if (pdata != NULL) { uint8 phone_ip[4] = {0}; memcpy(phone_ip, (uint8*)pdata, 4); os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]); } smartconfig_stop(); break; } }

void wifiConnectCb(uint8_t status) { if(status == STATION_GOT_IP){ os_printf("\nConnect AP Success\n"); } else { os_printf("\nDisConnect AP\n"); } }
3.測試
請使用第一節里面的APP進行測試
https://www.cnblogs.com/yangfengwu/p/11961168.html
如果想自己做SmartConfig的APP,請看這一節文章
https://www.cnblogs.com/yangfengwu/p/11911992.html
3.1,安裝手機APP

3.2,點擊APP右上角菜單

3.3,連接家里的路由器,輸入路由器密碼

3.4 下載好Wi-Fi模塊程序
3.5,點擊APP上面的搜索設備按鈕

3.6 使用串口調試助手查看Wi-Fi打印的數據

4.優化:長按按鈕3S,指示燈快閃,進入配網模式

int KeyDelay=0;//檢測按鍵延時 int SmartConfigDelay=0;//控制LED閃耀時間 int SmartConfigFlag=0;//開始配網標志

//定時器初始化 hw_timer_init(0,1);//1:循環 //設置定時器回調函數 hw_timer_set_func(hw_test_timer_cb);//hw_test_timer_cb:硬件定時器中斷回調函數 hw_timer_arm(1000);//1000:1000us定時進入中斷函數

//按鈕按下 if(GPIO_INPUT_GET(0) == 0){ KeyDelay++; if(KeyDelay>=3000 && SmartConfigFlag==0){ KeyDelay = 0; SmartConfigFlag = 1; wifi_set_opmode_current(STATION_MODE);//STATION模式下才能配網 smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//smartconfig + airkiss(APP+微信) esptouch_set_timeout(60);//超時時間60S smartconfig_start(smartconfig_callback);//設置配網回調函數 } } else{ KeyDelay=0; } //控制指示燈快閃 if(SmartConfigFlag == 1){ SmartConfigDelay++; if(SmartConfigDelay>100){ SmartConfigDelay=0; GPIO_OUTPUT_SET(2, 1-GPIO_INPUT_GET(2)); } } else{ SmartConfigDelay=0; }

void wifiConnectCb(uint8_t status) { if(status == STATION_GOT_IP){ os_printf("\nConnect AP Success\n"); } else { os_printf("\nDisConnect AP\n"); } } void smartconfig_callback(sc_status status, void *pdata){ switch(status) { case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; case SC_STATUS_LINK://獲取到手機發來的無線信息 os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; //連接路由器 WIFI_Connect(sta_conf->ssid, sta_conf->password, wifiConnectCb); break; case SC_STATUS_LINK_OVER: os_printf("SC_STATUS_LINK_OVER\n"); if (pdata != NULL) { uint8 phone_ip[4] = {0}; memcpy(phone_ip, (uint8*)pdata, 4); os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]); } SmartConfigFlag = 0; smartconfig_stop(); break; } }
5.測試
長按開發板的固件引腳大約3S,等待指示燈快閃,之后松開按鈕



補充:配網以后,設備重啟不能主動連接路由器問題
原因是在wifi連接路由器的程序設置的是當前配置,沒有把數據存儲到flash
替換掉當前配置函數即可.


