1. 程式人生 > >ESP8266 wifi模組正常上電,處理過程

ESP8266 wifi模組正常上電,處理過程

wifi模組正常上電,需要涉及ESP8266 NOS SDK的 wifi介面部分、TCP/UDP部分  還有使用者引數區訪問部分。


/********************user_init函式***********************************/

void ICACHE_FLASH_ATTR
user_init(void)
{
uint32 system_free_size = 0;
      uint8 opmode;

        /*上電設定wifi的配置*/
wifi_station_set_auto_connect(1); //設定ESP8266 Station上電自動連線已記錄的AP,在此呼叫,本次就生效

//set none sleep mode  設定省電模式:無睡眠全電, 預設是MODEM_SLEEP_T
wifi_set_sleep_type(NONE_SLEEP_T);   


wifi_station_ap_number_set(1);  //設定ESP8266 最多可記錄幾個AP資訊(最多為5個,這裡是1個,考慮配網)


wifi_station_set_reconnect_policy(true);  //設定斷開重連策略為ture,即斷開會重連


espconn_tcp_set_max_con(10);  //允許的最多的TCP連線數,即同時有效的TCP client連線最多10個


uart_init_3(115200,115200);     //配置UART0 和UART1
//       uart_init(115200, 115200);
UART_SetPrintPort(1);     //設定列印UART為UART1


os_printf("SDK version:%s\n", system_get_sdk_version());
     /*自動連線*/


wifi_set_opmode(STATION_MODE); //設定wifi的工作模式,並儲存到Flash,

//#define NULL_MODE       0x00

//#define STATION_MODE    0x01
//#define SOFTAP_MODE     0x02
//#define STATIONAP_MODE  0x03
opmode = wifi_get_opmode();//獲取當前wifi的工作模式


os_printf("Current WorkMode:%d\r\n", opmode);
         system_init_done_cb(autoConnectAP);       //用於註冊系統初始化完成的回撥函式,在user_init中呼叫。

        //smart_Config_NET();

}




對於自動連線這部分:基本思路是先掃描下該環境下時候有給AP,有的話直接連線connect,進入等待配網/或按鍵進入配網

/*******************autoConnectAp 自動連線AP函式***********************/

void autoConnectAP()
{
struct scan_config    Scanconfig;
struct station_config APMSG[5];
int i = wifi_station_get_ap_info(APMSG);   //獲取ESP8266 Station儲存的AP資訊,最多5個
if(i>=1)
{
APconfig = APMSG[0];   //取第一個
}
else
{
os_printf("Never Configure NetWork");
return;
}
Scanconfig.ssid = (char *)os_zalloc(sizeof(APconfig.ssid));
Scanconfig.bssid = NULL;
Scanconfig.channel = 0;
Scanconfig.show_hidden = 1;
//先掃描
Conected_AP_Flag = false;   //連線上AP的標識
Conected_Server_Flag = false;    //連結上伺服器的標識


 //獲取Ap的資訊,實參Scanconfig是掃描AP的配置引數,null表示掃描所有可用的AP資訊;

 //可以獲取掃描特定通道上的AP資訊,也可以獲取所有通道上的某特定名稱AP的資訊

 //scan_done 掃描完成的回撥函式void scan_done_cb_t (void *arg, STATUS status)

wifi_station_scan(&Scanconfig, scan_done);   
}

struct scan_config {
uint8 *ssid; // AP’s ssid
    服務集標識
uint8 *bssid; // AP’s bssid
  MAC地址
uint8 channel; //scan a specific channel
  特定的通道
uint8 show_hidden; //scan APs of which ssid is hidden.
   查詢隱藏SSID 
};  //掃描配置的結構體


struct station_config {
    uint8 ssid[32];   //wifi伺服器標識
    uint8 password[64];  //密碼
    uint8 bssid_set; // Note: If bssid_set is 1, station will just connect to the router
                        // with both ssid[] and bssid[] matched. Please check about this.  當為1,連線上
                       //熱點(ssid和bssid都複合)
    uint8 bssid[6];  //站點MAC地址
}; //wifi_station介面配置引數

bool wifi_station_set_config_current (struct station_config *config) ; 設定wifi_station介面的配置引數,不儲存到Flash

bool wifi_station_get_config_default (struct station_config *config) ;設定wifi_station介面的配置引數,儲存到Flash
bool wifi_station_get_config (struct station_config *config)   查詢WIFI Station介面的當前配置引數。
bool wifi_station_get_config_default (struct station_config *config)
查詢WIFI station介面儲存在Flash中的配置引數。

在配置完wifi_station 後就可以呼叫bool wifi_station_connect (void) 函式連線指定的AP點。

/***********scan引數*************************/

scan_done函式 是wifi_station_scan完成的 的回撥函式;

void scan_done_cb_t (void *arg, STATUS status)  *arg掃描到AP資訊存放的指標,以連結串列形式儲存bss_info

STATUS status:掃描結果 typedef enum {
    OK = 0,   //成功
    FAIL,     //失敗
    PENDING,   //暫停
    BUSY,  //忙
    CANCEL,  //取消
} STATUS;
而儲存掃描到AP資訊的連結串列結構

struct bss_info {
STAILQ_ENTRY(bss_info) next;

uint8 ssid[32];

uint8 ssid_len;

uint8 channel;

AUTH_MODE authmode;

uint8 is_hidden;

sint16 freq_offset
sint16 freqcal_val;
uint8 *esp_mesh_ie;
uint8 simple_pair;
}; 



開啟一個執行緒,週期性檢測AP的連線狀態,處理不同的錯誤狀態。。。。。???