天天看點

ESP8266學習——AP Mode内容代碼總結架構

AP Mode

  • 内容
    • os_memset
  • 代碼
    • 頭檔案
    • 宏定義
    • 全局變量
    • 初始化WIFI函數【ESP8266_AP_init】
    • 軟體定時回調函數【OS_Timer_1_cb】
    • user_init
    • 整體代碼
  • 總結架構

内容

os_memset

os_memset(void *s, int ch, size_t n)

  • 【void *s】記憶體塊指針
  • 【int ch】填充值
  • 【size_t n】填充大小

代碼

頭檔案

#include "user_config.h"		// 使用者配置
#include "driver/uart.h"  		// 序列槽
#include "driver/oled.h"  		// OLED

//#include "at_custom.h"
#include "c_types.h"			// 變量類型
#include "eagle_soc.h"			// GPIO函數、宏定義
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h"			// 回調函數
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、軟體定時器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系統接口、system_param_xxx接口、WIFI、RateContro

           

宏定義

#define		ProjectName			"AP_Mode"			// 工程名宏定義

#define		ESP8266_AP_SSID		"ESP8266_AIoT"		// 建立的WIFI名
#define		ESP8266_AP_PASS		"aiot123456"			// 建立的WIFI密碼
           

全局變量

初始化WIFI函數【ESP8266_AP_init】

void ICACHE_FLASH_ATTR
ESP8266_AP_init()
{
	struct softap_config AP_Config;		//AP參數結構體

	wifi_set_opmode(0x02);				//設定為AP模式,并儲存到Flash

	os_memset(&AP_Config, 0, sizeof(struct softap_config));		//AP參數結構體 = 0
	os_strcpy(AP_Config.ssid, ESP8266_AP_SSID);					//設定SSID(将字元串複制到ssid數組)
	os_strcpy(AP_Config.password,ESP8266_AP_PASS);				//設定密碼
	AP_Config.ssid_len = os_strlen(ESP8266_AP_PASS);			//設定ssid長度(和SSID的長度一緻)
	AP_Config.channel = 1;										//通道号1~13
	AP_Config.authmode = AUTH_WPA2_PSK;							//設定加密模式
	AP_Config.ssid_hidden = 0;									//不隐藏SSID
	AP_Config.max_connection = 4;								//最大連接配接數
	AP_Config.beacon_interval = 100;							//信标間隔時槽100~60000ms

	wifi_softap_set_config(&AP_Config);							//設定soft_AP,并儲存到Flash
}
           

軟體定時回調函數【OS_Timer_1_cb】

void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;		//IP資訊結構體
	u8 ESP8266_IP[4];					//點分十進制形式儲存IP

	switch(wifi_get_opmode())
	{
		case 0x01:	os_printf("\nESP8266_Mode = Station\n");	break;
		case 0x02:	os_printf("\nESP8266_Mode = SoftAP\n");	break;
		case 0x03:	os_printf("\nESP8266_Mode = Station+SoftAP\n");	break;
	}

	// 擷取ESP8266_AP模式下的IP位址
	//【AP模式下,如果開啟DHCP(預設),并且未設定IP相關參數,ESP8266的IP位址=192.168.4.1】
	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 參數2:IP資訊結構體指針

	// ESP8266_AP_IP.ip.addr==32位二進制IP位址,将它轉換為點分十進制的形式
	ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;			// 點分十進制IP的第一個數 <==> addr低八位
	ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;		// 點分十進制IP的第二個數 <==> addr次低八位
	ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;		// 點分十進制IP的第三個數 <==> addr次高八位
	ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;		// 點分十進制IP的第四個數 <==> addr高八位

	// 列印ESP8266的IP位址
	os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
	OLED_ShowIP(24,2,ESP8266_IP);			// 顯示ESP8266的IP位址


	// 查詢并列印接入此WIFI的裝置數量
	os_printf("Number of devices connected to this WIFI = %d\n",wifi_softap_get_station_num());
}
           

user_init

void ICACHE_FLASH_ATTR
user_init(void)
{
	uart_init(115200,115200);	// 初始化序列槽波特率
		os_delay_us(10000);			// 等待序列槽穩定
		os_printf("\r\n=================================================\r\n");
		os_printf("\t Project:\t%s\r\n", ProjectName);
		os_printf("\t SDK version:\t%s", system_get_sdk_version());
		os_printf("\r\n=================================================\r\n");


		// OLED初始化
		//---------------------
		OLED_Init();							// |
		OLED_ShowString(0,0,"ESP8266 = AP");	// |
		OLED_ShowString(0,2,"IP:");				// |
		//---------------------


		ESP8266_AP_init();			// 設定ESP8266_AP模式相關參數

		OS_Timer_1_init(1000,1);		// 1秒軟體定時


	//	while(1) system_soft_wdt_feed();	// 死循環,測試用

	    os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
           

整體代碼

#include "user_config.h"		// 使用者配置
#include "driver/uart.h"  		// 序列槽
#include "driver/oled.h"  		// OLED

//#include "at_custom.h"
#include "c_types.h"			// 變量類型
#include "eagle_soc.h"			// GPIO函數、宏定義
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h"			// 回調函數
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、軟體定時器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系統接口、system_param_xxx接口、WIFI、RateContro

#define		ProjectName			"AP_Mode"			// 工程名宏定義

#define		ESP8266_AP_SSID		"ESP8266_AIoT"		// 建立的WIFI名
#define		ESP8266_AP_PASS		"aiot123456"			// 建立的WIFI密碼

os_timer_t OS_Timer_1;		// 軟體定時器

void ICACHE_FLASH_ATTR
delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}

void ICACHE_FLASH_ATTR
ESP8266_AP_init()
{
	struct softap_config AP_Config;		//AP參數結構體

	wifi_set_opmode(0x02);				//設定為AP模式,并儲存到Flash

	os_memset(&AP_Config, 0, sizeof(struct softap_config));		//AP參數結構體 = 0
	os_strcpy(AP_Config.ssid, ESP8266_AP_SSID);					//設定SSID(将字元串複制到ssid數組)
	os_strcpy(AP_Config.password,ESP8266_AP_PASS);				//設定密碼
	AP_Config.ssid_len = os_strlen(ESP8266_AP_PASS);			//設定ssid長度(和SSID的長度一緻)
	AP_Config.channel = 1;										//通道号1~13
	AP_Config.authmode = AUTH_WPA2_PSK;							//設定加密模式
	AP_Config.ssid_hidden = 0;									//不隐藏SSID
	AP_Config.max_connection = 4;								//最大連接配接數
	AP_Config.beacon_interval = 100;							//信标間隔時槽100~60000ms

	wifi_softap_set_config(&AP_Config);							//設定soft_AP,并儲存到Flash
}

void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;		//IP資訊結構體
	u8 ESP8266_IP[4];					//點分十進制形式儲存IP

	switch(wifi_get_opmode())
	{
		case 0x01:	os_printf("\nESP8266_Mode = Station\n");	break;
		case 0x02:	os_printf("\nESP8266_Mode = SoftAP\n");	break;
		case 0x03:	os_printf("\nESP8266_Mode = Station+SoftAP\n");	break;
	}

	// 擷取ESP8266_AP模式下的IP位址
	//【AP模式下,如果開啟DHCP(預設),并且未設定IP相關參數,ESP8266的IP位址=192.168.4.1】
	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 參數2:IP資訊結構體指針

	// ESP8266_AP_IP.ip.addr==32位二進制IP位址,将它轉換為點分十進制的形式
	ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;			// 點分十進制IP的第一個數 <==> addr低八位
	ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;		// 點分十進制IP的第二個數 <==> addr次低八位
	ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;		// 點分十進制IP的第三個數 <==> addr次高八位
	ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;		// 點分十進制IP的第四個數 <==> addr高八位

	// 列印ESP8266的IP位址
	os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
	OLED_ShowIP(24,2,ESP8266_IP);			// 顯示ESP8266的IP位址


	// 查詢并列印接入此WIFI的裝置數量
	os_printf("Number of devices connected to this WIFI = %d\n",wifi_softap_get_station_num());
}

//參數1:【定時時間】;參數2:【重複模式】
void ICACHE_FLASH_ATTR OS_Timer_1_init(u32 time_ms, u8 time_repetitive)
{
	//關閉定時器
	//參數一:要關閉的定時器
	os_timer_disarm(&OS_Timer_1);	//關閉軟體定時器

	//設定定時器
	//參數一:要設定的定時器;參數二:回調函數(需類型轉換);參數三:回到函數的參數
	//注:os_timer_setfn必須在軟體定時器未使能的情況下調用
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t*)OS_Timer_1_cb, NULL);	//設定回調函數

	//使能(啟動)ms定時器
	//參數一:要失能的定時器;參數二:定時時間(機關:ms);參數三:1=重複/0=隻一次
	os_timer_arm(&OS_Timer_1,time_ms,time_repetitive);

}



void ICACHE_FLASH_ATTR
user_init(void)
{
	uart_init(115200,115200);	// 初始化序列槽波特率
		os_delay_us(10000);			// 等待序列槽穩定
		os_printf("\r\n=================================================\r\n");
		os_printf("\t Project:\t%s\r\n", ProjectName);
		os_printf("\t SDK version:\t%s", system_get_sdk_version());
		os_printf("\r\n=================================================\r\n");


		// OLED初始化
		//---------------------
		OLED_Init();							// |
		OLED_ShowString(0,0,"ESP8266 = AP");	// |
		OLED_ShowString(0,2,"IP:");				// |
		//---------------------


		ESP8266_AP_init();			// 設定ESP8266_AP模式相關參數

		OS_Timer_1_init(1000,1);		// 1秒軟體定時


	//	while(1) system_soft_wdt_feed();	// 死循環,測試用

	    os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}



void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}

           

總結架構

#define		ESP8266_AP_SSID		"ESP8266_AIoT"		// 建立的WIFI名
#define		ESP8266_AP_PASS		"aiot123456"			// 建立的WIFI密碼

void ICACHE_FLASH_ATTR
ESP8266_AP_init()
{
	struct softap_config AP_Config;		//AP參數結構體

	wifi_set_opmode(0x02);				//設定為AP模式,并儲存到Flash
	
	// 結構體指派(注意:【服務集辨別符/密碼】須設為字元串形式)
	os_memset(&AP_Config, 0, sizeof(struct softap_config));		//AP參數結構體 = 0
	os_strcpy(AP_Config.ssid, ESP8266_AP_SSID);					//設定SSID(将字元串複制到ssid數組)
	os_strcpy(AP_Config.password,ESP8266_AP_PASS);				//設定密碼
	AP_Config.ssid_len = os_strlen(ESP8266_AP_PASS);			//設定ssid長度(和SSID的長度一緻)
	AP_Config.channel = 1;										//通道号1~13
	AP_Config.authmode = AUTH_WPA2_PSK;							//設定加密模式
	AP_Config.ssid_hidden = 0;									//不隐藏SSID
	AP_Config.max_connection = 4;								//最大連接配接數
	AP_Config.beacon_interval = 100;							//信标間隔時槽100~60000ms

	wifi_softap_set_config(&AP_Config);							//設定soft_AP,并儲存到Flash
}
           
struct ip_info ST_ESP8266_IP;		//IP資訊結構體
	u8 ESP8266_IP[4];					//點分十進制形式儲存IP

	switch(wifi_get_opmode())
	{
		case 0x01:	os_printf("\nESP8266_Mode = Station");	break;
		case 0x02:	os_printf("\nESP8266_Mode = SoftAP");	break;
		case 0x03:	os_printf("\nESP8266_Mode = Station+SoftAP");	break;
	}

	// 擷取ESP8266_AP模式下的IP位址
	//【AP模式下,如果開啟DHCP(預設),并且未設定IP相關參數,ESP8266的IP位址=192.168.4.1】
	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 參數2:IP資訊結構體指針

	// ESP8266_AP_IP.ip.addr==32位二進制IP位址,将它轉換為點分十進制的形式
	ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;			// 點分十進制IP的第一個數 <==> addr低八位
	ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;		// 點分十進制IP的第二個數 <==> addr次低八位
	ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;		// 點分十進制IP的第三個數 <==> addr次高八位
	ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;		// 點分十進制IP的第四個數 <==> addr高八位

           

繼續閱讀