ESP8266 SDK開發: 物聯網篇-ESP8266配網 SmartConfig


 

 

 

前言

  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

替換掉當前配置函數即可.

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM