关于esp32的省电模式的WiFi链接 ESP32做为接入点AP

 

  对于ESP32,其做为一款集成了2.4GHz WiFi和蓝牙双模块的单芯片,全部基于wifi和蓝牙开发是学习esp32的重要一环,今天WiFi原理和网络结构 能够点击连接进行详细的了解,这里就不作详细的叙述了,本文重点讲解省电模式下的WiFi是如何链接上路由器的,重点是相关API接口和编程方法的介绍。本文源码地址在:esp-idf/examples/wifi/power_save里。源码完成了对ESP32的低功耗模式的设置,并经过menuconfig将接入点AP的名称和密码赋值给ESP32,使ESP32做为一个站点STA接入到接入点AP(即路由器)中。
html

PART1:

定义基本参数

/*set the ssid and password via "make menuconfig"*/
#define DEFAULT_SSID CONFIG_WIFI_SSID
#define DEFAULT_PWD CONFIG_WIFI_PASSWORD

#if CONFIG_POWER_SAVE_MODEM
#define DEFAULT_PS_MODE WIFI_PS_MODEM
#elif CONFIG_POWER_SAVE_NONE
#define DEFAULT_PS_MODE WIFI_PS_NONE
#else
#define DEFAULT_PS_MODE WIFI_PS_NONE
#endif /*CONFIG_POWER_SAVE_MODEM*/

 这里首先将AP端的名称和密码赋值给ESP32,使ESP32能够链接上接入点AP,这里的CONFIG_WIFI_SSID和CONFIG_WIFI_PASSWORD即为路由器端的名称和密码,他们在源码中是看不到的,它们的定义是在Kconfig.projbuild中定义的,咱们能够经过make menconfig对其进行赋值。具体操做以下:编程

选择Example Configuration后windows

    在WIFI SSID和WIFI Password中分别将路由器的名称和密码赋值给ESP32。api

  (固然,你也能够不经过menucofig而对ESP32直接进行赋值)缓存

  紧随其后的即是对ESP32工做模式的设置,一样,其也能够经过menuconfig进行设置。服务器

PART2:

进程打印函数

static const char *TAG = "power_save";


static esp_err_t event_handler(void *ctx, system_event_t *event)
{
    switch(event->event_id) {
    case SYSTEM_EVENT_STA_START:
    ESP_LOGI(TAG, "SYSTEM_EVENT_STA_START");
    ESP_ERROR_CHECK(esp_wifi_connect());
    break;
    case SYSTEM_EVENT_STA_GOT_IP:
    ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP");
    ESP_LOGI(TAG, "got ip:%s\n",
        ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
    ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED");
    ESP_ERROR_CHECK(esp_wifi_connect());
    break;
    default:
        break;
    }
    return ESP_OK;
}

   本部分主要是将ESP32的工做信息,打印出来,对返回的任务通知进行switch分析,若是链接上了,就打印sta_start消息,并再次执行esp_err_t esp_wifi_connect void 将ESP32 WiFi站链接到AP,第二次获得返回任务通知SYSTEM_EVENT_STA_GOT_IP,并调用  ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));将数字IP地址转换为十进制点ASCII表示法。,此时显示链接到的AP的IP和MAC地址。网络

若是没有链接上AP,一样会一直执行esp_err_t esp_wifi_connect( void ),直到将ESP32 WiFi站链接到AP为止。app

 

PART3:

WIFI设置和耗电设置

/*init wifi as sta and set power save mode*/
static void wifi_power_save(void)
{
    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
    
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    wifi_config_t wifi_config = {
    .sta = {
        .ssid = DEFAULT_SSID,
        .password = DEFAULT_PWD
    },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "esp_wifi_set_ps().");
    esp_wifi_set_ps(DEFAULT_PS_MODE);
}

   wifi_power_save首先调用 tcpip_adapter_init();函数对底层库的TCP/IP协议进行调用,而后检测esp_event_loop_init是否初始化完成。socket

以后即是进行wifi的设置,首先用esp_wifi_init(&cfg)对WIFI的内存空间进行设置,初始化WiFi Alloc资源为WiFi驱动,如WiFi控制结构,RX / TX缓冲区,WiFi NVS结构等,此WiFi也启动WiFi任务。(注意;在调用全部其余WiFi API以前,必须先调用此API)tcp

而后设置ESP32 STA或AP的配置。

 wifi_config_t wifi_config = { .sta = {                         .ssid = DEFAULT_SSID,              //设置要链接的AP的接入点名称和密码 .password = DEFAULT_PWD }, };
(注意
1.只有当指定的接口被启用时,才能调用这个API,不然API会失败
2.对于站配置,bssid_set须要为0; 只有当用户须要检查AP的MAC地址时,才须要1。
3. ESP32仅限一个通道,所以在软AP +站模式下,软AP将自动调整其通道与ESP32站的通道相同。)

 经过esp_wifi_set_mode(WIFI_MODE_STA)将WiFi操做模式设置为站,软AP或站+软AP,默认模式为软AP模式。

esp_wifi_set_config设置ESP32 STA或AP的配置。

最后经过esp_wifi_start()根据当前配置启动WiFi,

并经过 esp_wifi_set_ps(DEFAULT_PS_MODE);设置当前节电类型。

PART4:

APP_main函数

void app_main()
{
    // Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK( ret );

    wifi_power_save();
}

 app_main函数主要是对NVS完成基本的初始化操做(关于NVS,能够在ESP32汇总中进行详细了解),保证数据的缓存空间,而后调用 wifi_power_save();函数完成WIFI设置。

 

PART5:

实验现象

   程序烧写完成后,打开minicom,能够看到以下的打印信息

打开windows的cmd(这里笔记本和ESP32接入的是同一个AP),对AP分配的ESP32的IP进行ping操做,观察可否PING通。操做结果以下:

至此,基于省电模式的WIFI连接就设计完成了。

 

PART6:编程详情

   

   一旦ESP32已经设置了站点配置细节,其中包括SSID和password,咱们准备好链接到目标访问点后。 功能 esp_wifi_connect() 将造成的链接。你链接了后ESP32中的任何内容都不会阻塞,一样也不会影响到这个功能。

    在一段时间之后,当其实际的链接起来后,咱们会看到两个回调事件发生, 首先是 SYSTEM_EVENT_STA_CONNECTED 代表咱们有链接到接入点。 第二个事件是 SYSTEM_EVENT_STA_GOT_IP 其表示咱们已经被DHCP服务器分配了一个IP地址。只有这样咱们才能真正参与通信。若是咱们正在使用静态IP地址,那么咱们只会看到链接的事件。

   咱们从接入点断开链接时,咱们将看到一个SYSTEM_EVENT_STA_DISCONNECTED 事件。从先前链接的 断开接入点咱们调用esp_wifi_disconnect()完成,

    关于与接入点链接的进一步考虑是自动链接的想法。 有一个布尔标志存储在闪存中指示ESP32是否应尝试自动链接到最后一个使用的接入点。 若是设置为true,那么以后在设备启动后,你无需调用任何API函数,它将尝试链接到最后使用的接入点。  这是一个

方便选项,可是我更喜欢关闭。 一般我想在个人设备中进行控制来肯定是否自动链接,是否自动链接,咱们能够经过调用esp_wifi_set_auto_connect()。

    另外,当咱们链接到接入点时,咱们的设备正在成为一个station。 链接到接入点AP不是自动的,意味着咱们如今有一个IP地址。 咱们坚持必须从DHCP服务器请求已创建的IP地址。 这可能须要几秒。在某些状况下,咱们可让设备请求特定的IP。 这能够更快的链接时间。 若是咱们指定数据,咱们也须要提供DNS信息,若是咱们须要链接到DNS服务器的名字解析度。

这是分配给咱们一个特定IP地址的逻辑片断:
#include <lwip / sockets.h>
 
//咱们但愿咱们的设备拥有的IP地址。
#define DEVICE_IP“192.168.1.99”
 
//咱们但愿发送数据包的网关地址
//这一般是咱们的接入点。#define DEVICE_GW “192.168.1 1”
 
//网络掩码规范。
#define DEVICE_NETMASK“255.255.255.0”
 
//咱们但愿链接的接入点的身份。
#define AP_TARGET_SSID“RASPI3”
 
//咱们须要提供给接入点进行受权的密码。
#define AP_TARGET_PASSWORD“password”

 
 
esp_err_t wifiEventHandler(void * ctx,system_event_t * event)
{
返回ESP_OK;
}
 
 
//代码片断在这里...
nvs_flash_init();
tcpip_adapter_init();
 
tcpip_adap ter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
tcpip_adapter_ip_info_t ipInfo;
 
inet_pton(AF_INET,DEVICE_IP,&ipInfo.ip);
inet_pton(AF_INET,DEVICE_GW,&ipInfo.gw);
inet_pton(AF_INET,DEVICE_NETMASK,&ipInfo.netmask);
tcpip_ada pter_set_ip_info(TCPIP_ADAPTER_IF_STA,&ipInfo);
 
ESP_ERROR_CHECK(esp_event_loop_init(wifiEventHandler,NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_ST ORAGE_RAM));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
wifi_config_t sta_config = {
.sta = {
.ssid = AP_TARGET_SSID,
.password = AP_TARGET_PASSWORD,
.bssid_set = 0
}
};
ESP_ERROR_CHECK(esp_wifi_set_config(WI FI_IF_STA,&sta_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_ERROR_CHECK(esp_wifi_connect());

 

 

 

 

做为接入点AP

    到目前为止,咱们只将ESP32做为了接入接入点的WiFi站

    但它也具备做为一个接入点使其余WiFi设备(站)链接的能力 。为了成为一个接入点,咱们须要定义容许其余的SSID设备来区分咱们的网络。 这个SSID能够被标记为为hidden, 若是咱们不但愿它在扫描中找到。 另外咱们还要提供认证方式当台站但愿与咱们联系时,将使用该功能。 这是用来容许

的,实际的将ES32实例做为接入点AP请看下一篇文章

ESP32做为接入点AP

        

相关知识:wifi相关的API接口

相关文章
相关标签/搜索