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高八位