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(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 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的連線狀態,處理不同的錯誤狀態。。。。。???