环境准备
- 安装ESP-IDF开发环境,可参考官方文档。
- 确保开发环境已正确配置,能对ESP32 - S3进行编译和烧录。
实现思路
- 连接WiFi:让ESP32 - S3连接到一个可用的WiFi网络。
- 初始化Ping功能:利用ESP-IDF提供的Ping API初始化Ping功能。
- 执行Ping操作:对百度的服务器(例如
www.baidu.com
)执行Ping操作。 - 处理Ping结果:显示Ping操作的结果。
示例代码
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/apps/ping.h"
// 替换为你的WiFi信息
#define EXAMPLE_ESP_WIFI_SSID "your_wifi_ssid"
#define EXAMPLE_ESP_WIFI_PASS "your_wifi_password"
static const char *TAG = "ping_test";
// WiFi事件处理函数
static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
if (esp_wifi_connect() == ESP_OK) {
ESP_LOGI(TAG, "Connect to the AP failed");
}
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "Got IP:" IPSTR, IP2STR(&event->ip_info.ip));
// 连接成功后开始Ping操作
xTaskCreate(ping_task, "ping_task", 4096, NULL, 5, NULL);
}
}
// Ping结果处理函数
static void ping_result_handler(echo_reply_info_t *echo_reply)
{
if (echo_reply->err == ERR_OK) {
ESP_LOGI(TAG, "Ping success: seq %d, time %d ms", echo_reply->seqno, echo_reply->rtt);
} else {
ESP_LOGI(TAG, "Ping failed: seq %d, err %d", echo_reply->seqno, echo_reply->err);
}
}
// Ping任务函数
static void ping_task(void *pvParameters)
{
ping_config_t ping_config = {
.host = "www.baidu.com",
.count = 4,
.interval_ms = 1000,
.timeout_ms = 2000,
.data_size = 64,
.tos = 0,
};
ping_result_t ping_result;
int err = ping_start(&ping_config, ping_result_handler, &ping_result);
if (err == ERR_OK) {
ESP_LOGI(TAG, "Ping started");
vTaskDelay(pdMS_TO_TICKS((ping_config.count + 1) * ping_config.interval_ms));
ping_stop();
ESP_LOGI(TAG, "Ping stopped");
} else {
ESP_LOGI(TAG, "Ping start failed: err %d", err);
}
vTaskDelete(NULL);
}
void app_main(void)
{
// 初始化NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 初始化网络栈
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
// 初始化WiFi
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 注册WiFi事件处理函数
esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
NULL);
esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
NULL);
// 配置WiFi
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS
},
};
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, "wifi_init_sta finished.");
}
代码解释
-
WiFi连接部分:
event_handler
函数用于处理WiFi事件,当连接到WiFi并获取到IP地址后,会启动Ping任务。app_main
函数中进行了NVS初始化、网络栈初始化、WiFi初始化和配置等操作,并启动WiFi连接。
-
Ping操作部分:
ping_task
函数中配置了Ping参数,包括目标主机、Ping次数、间隔时间等,并调用ping_start
函数开始Ping操作。ping_result_handler
函数用于处理Ping结果,根据结果输出成功或失败信息。
编译和烧录
- 打开终端,进入代码所在目录。
- 配置项目:
在idf.py set-target esp32s3 idf.py menuconfig
menuconfig
中配置串口等参数。 - 编译和烧录项目:
idf.py build flash monitor
注意事项
- 要将
EXAMPLE_ESP_WIFI_SSID
和EXAMPLE_ESP_WIFI_PASS
替换为你实际的WiFi信息。 - 确保ESP32 - S3能够正常连接到WiFi网络,并且网络可以访问百度的服务器。