環境及工具與第一章相同,這裡就不在重複!
本章通過程式碼示例,來實現wifi模組連線到路由器的功能,模組開機上電是自動進入快連模式,待30秒後退出快連模式,若連線成功則執行正常程式,若未連線成功,則嘗試以儲存在flash內的引數進行連線,若連線成功則執行正常程式,若未成功則繼續嘗試重連。
加入了狀態指示功能,開機指示燈閃爍,用於提示進入快連模式,若連線失敗則指示燈熄滅,若連線成功則指示燈常亮,並列印已連線字元到串列埠。
使用方法:上電進入快連模式後,可以用EspTouch或AirKiss工具進行配網測試
user_main.c的全部程式碼如下
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"//io口
#include "user_interface.h"
#include "smartconfig.h"//配網
#include "user_devicefind.h"
#include "user_webserver.h"
#if ESP_PLATFORM
#include "user_esp_platform.h"
#endif
void user_rf_pre_init(void){}
/*******************************************************************************
* 完成快連模式
*******************************************************************************/
void ICACHE_FLASH_ATTR
smartconfig_done(sc_status status, void *pdata)
{
switch(status) {
case SC_STATUS_WAIT://連線未開始,請勿在此階段開始連線
os_printf("SC_STATUS_WAIT
");
break;
case SC_STATUS_FIND_CHANNEL://在此階段進行配對連線
os_printf("SC_STATUS_FIND_CHANNEL
");
break;
case SC_STATUS_GETTING_SSID_PSWD://得到wifi名字和密碼
os_printf("SC_STATUS_GETTING_SSID_PSWD
");
sc_type *type = pdata;
if (*type == SC_TYPE_ESPTOUCH) {
os_printf("SC_TYPE:SC_TYPE_ESPTOUCH
");
} else {
os_printf("SC_TYPE:SC_TYPE_AIRKISS
");
}
break;
case SC_STATUS_LINK://正在連線路由器
os_printf("SC_STATUS_LINK
");
struct station_config *sta_conf = pdata;
wifi_station_set_config(sta_conf);//設定WiFi station介面的配置引數,並儲存到flash
wifi_station_disconnect();//WiFi station介面從AP斷開連線
wifi_station_connect();//WiFi station介面連線AP
break;
case SC_STATUS_LINK_OVER://獲取到ip,連線路由完成
os_printf("SC_STATUS_LINK_OVER
");
if (pdata != NULL) {
uint8 phone_ip[4] = {0};
os_memcpy(phone_ip, (uint8*)pdata, 4);
os_printf("Phone ip: %d.%d.%d.%d
",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]);//列印發廣播過來的裝置IP地址
}
smartconfig_stop();//停止配置
break;
}
}
/*******************************************************************************
* 自定義引腳執行函式_定時器回撥
*******************************************************************************/
void ICACHE_FLASH_ATTR
Task_Run(void){
static uint32 lag[10];
static bool io;//io引腳標記
static bool first;//使用一次標記
if(lag[0]<500){lag[0]++;}
if(lag[0]<300){//開機閃爍,提示配網模式
if(io==true){
io=false;
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//GPIO12輸出低電平
}else{
io=true;
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12輸出高電平
}
}else{//結束配網
uint8 status=wifi_station_get_connect_status();//連線狀態
if(!first&&status!=STATION_GOT_IP){//未進行快連配置,則嘗試連線原AP
first=true;
smartconfig_stop();//停止配置
wifi_station_disconnect();//WiFi station介面從AP斷開連線
wifi_station_connect();//WiFi station介面連線AP
}
if(status==STATION_GOT_IP){
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//GPIO12輸出低電平
os_printf("Already connected
");
}else{
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12輸出高電平
}
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
/*設定串列埠波特率*/
uart_init(115200,9600);
/*列印版本資訊*/
os_printf("SDK version:%s
", system_get_sdk_version());
/*配置SmartConfig模式*/
smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//設定快連模式的協議型別(esptouch與airkiss)
wifi_set_opmode(STATION_MODE);//配置為客戶端模式,並儲存到flash(若使用快連則必須使用station模式)
smartconfig_start(smartconfig_done);//開啟快連模式
/*配置GPIO12*/
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
/*配置 硬體定時器*/
hw_timer_init(0,1);//初始化ISR硬體定時器,自動填裝
hw_timer_set_func(Task_Run);//設定定時器回撥函式
hw_timer_arm(100000);//使能硬體中斷定時器,定時100ms
}