基于ESP32 - S3实现一个ping百度的C测试程序

news2025/4/21 13:37:46

环境准备

  • 安装ESP-IDF开发环境,可参考官方文档。
  • 确保开发环境已正确配置,能对ESP32 - S3进行编译和烧录。

实现思路

  1. 连接WiFi:让ESP32 - S3连接到一个可用的WiFi网络。
  2. 初始化Ping功能:利用ESP-IDF提供的Ping API初始化Ping功能。
  3. 执行Ping操作:对百度的服务器(例如 www.baidu.com)执行Ping操作。
  4. 处理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.");
}

代码解释

  1. WiFi连接部分

    • event_handler 函数用于处理WiFi事件,当连接到WiFi并获取到IP地址后,会启动Ping任务。
    • app_main 函数中进行了NVS初始化、网络栈初始化、WiFi初始化和配置等操作,并启动WiFi连接。
  2. Ping操作部分

    • ping_task 函数中配置了Ping参数,包括目标主机、Ping次数、间隔时间等,并调用 ping_start 函数开始Ping操作。
    • ping_result_handler 函数用于处理Ping结果,根据结果输出成功或失败信息。

编译和烧录

  1. 打开终端,进入代码所在目录。
  2. 配置项目:
    idf.py set-target esp32s3
    idf.py menuconfig
    
    在 menuconfig 中配置串口等参数。
  3. 编译和烧录项目:
    idf.py build flash monitor
    

注意事项

  • 要将 EXAMPLE_ESP_WIFI_SSID 和 EXAMPLE_ESP_WIFI_PASS 替换为你实际的WiFi信息。
  • 确保ESP32 - S3能够正常连接到WiFi网络,并且网络可以访问百度的服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源项目FastAPI-MCP:一键API转换MCP服务

在当今AI开发的世界中,应用程序与AI模型之间的无缝集成至关重要。 模型上下文协议(Model Context Protocol, MCP)通过允许AI模型访问外部工具和数据源,弥合了这一差距。 FastAPI MCP是一个强大的工具,它可以通过最少的配置将您现有的FastAPI端点转换为MCP兼容的工具。 本…

python课堂随记

11.15 连接符 namemcl print(我叫,name) print(我叫name)#连接符 age18 print(我叫name年龄str(age)) #连接符需要数据类型相同 11.17随记 除法运算神奇 8/5 #1.6 8//5 #1 -8/5 #-1.6 -8//5 #-2 ##次方表示—两个** 3的27次方 27的3次方 小结 程序的书写&…

Agent安装-Beszel​​ 轻量级服务器监控平台

docker-compose安装 beszel-agent 安装 docker-compose 配置文件 services:beszel-agent:image: henrygd/beszel-agent:latestcontainer_name: beszel-agentrestart: unless-stoppednetwork_mode: hostvolumes:- ./beszel_socket:/beszel_socket- /var/run/docker.sock:/var…

算法—选择排序—js(场景:简单实现,不关心稳定性)

选择排序原理&#xff1a;&#xff08;简单但低效&#xff09; 每次从未排序部分选择最小元素&#xff0c;放到已排序部分的末尾。 特点&#xff1a; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …

【统计分析120】统计分析120题分享

1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象&#xff0c;利用数学语言来描述他们的结构和行为&#xff0c;做出一些必要的假设&#xff0c;运用适当的数学工具&#xff0c;得到一个数学结论 数学模型&#xff1a;指的是通过抽象、简化现实世界的某些现象&am…

【计量地理学】实验四 主成分分析与莫兰指数

一、实验内容 &#xff08;一&#xff09; 某地区35个城市2004年的7项经济统计指标数据见&#xff08;数据中的“题目1”sheet&#xff09;。 &#xff08;1&#xff09;试用最短距离聚类法对35个城市综合实力进行系统聚类分析&#xff0c;并画出聚类谱系图: 在此次实验内容…

手写call,bind,apply

foo.Mycall(obj,1,2,3) Function.prototype.Mycallfunction(target,...args){if(typeof this!function){throw new TypeError(this is not a function)}// 判断target是否是对象if(targetnull||targetundefined){targetwindow}if(typeof target!object){targetObject(target)}/…

【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析

低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩&#xff0c;单颗芯片可集成更多元件&#xff0c;导致功耗相应增长。更严峻的是&#xff0c;现代芯片工作频率较二十年前大幅提升&#xff0c;而功耗与频率呈正比关系。因此&#xff0c;芯片功耗突破…

Ubuntu18.04安装Qt5.12

本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…

max31865典型电路

PT100读取有很多种方案&#xff0c;常用的惠斯通电桥&#xff0c;和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD&#xff0c;镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…

数据通信学习笔记之OSPF的区域

OSPFArea 用于标识一个 OSPF 的区域 区域是从逻辑上将设备划分为不同的组&#xff0c;每个组用区域号 (Area ID)来标识 OSPF 的区域 ID 是一个 32bit 的非负整数&#xff0c;按点分十进制的形式(与 IPV4 地址的格式一样)呈现&#xff0c;例如 Area0.0.0.1。 为了简便起见&#…

5 提示词工程指南-计划与行动

5 提示词工程指南-计划与行动 计划与行动 Cline 有两种模式: Plan 描述目标和需求、提问与回答、讨论、抽象项目的各个方面、确定技术路线、确定计划 计划与确认相当于架构师,不编写代码Act 按计划编写代码 按照计划编码Plan 模式的本质是构建实际编码前的上下文,Act 的本…

如何一键批量删除多个 Word 文档中的页眉和页脚

在工作中&#xff0c;许多 Word 文档的页眉页脚中包含公司名称、Logo、电话等信息&#xff0c;用于对外宣传。但有时我们需要批量删除这些页眉页脚信息&#xff0c;尤其当信息有误时&#xff0c;手动逐个删除会增加工作量&#xff0c;导致效率低下。本文将介绍一种便捷的方法&a…

QCustomPlot中自定义图层

QCustomPlot 使用图层(QCPLayer)系统来组织绘图元素的绘制顺序和可见性。下面详细介绍如何自定义图层并将可绘制对象关联到特定图层。 1. 理解 QCustomPlot 的图层系统 QCustomPlot 的图层系统具有以下特点&#xff1a; 图层按顺序排列&#xff0c;后绘制的图层会覆盖前面的图…

-实用类-

1. API是什么 2.什么是枚举 &#xff01;有点类似封装&#xff01; 2.包装类 注意&#xff1a; 1.Boolean类构造方法参数为String类型时&#xff0c;若该字符串内容为true(不考虑大小写)&#xff0c;则该Boolean对象表示true&#xff0c;否则表示false 2.当包装类构造方法参…

Spring 事务管理核心机制与传播行为应用

Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP&#xff08;面向切面编程&#xff09;实现&#xff0c;通过 声明式事务&#xff08;注解或 XML 配置&#xff09;统一管理数据库操作&#xff0c;确保数据一致性。核心目标&#xff1a;保证多个数据库操作的原子…

集合框架(重点)

1. 什么是集合框架 List有序插入对象&#xff0c;对象可重复 Set无序插入对象&#xff0c;对象不可重复&#xff08;重复对象插入只会算一个&#xff09; Map无序插入键值对象&#xff0c;键只唯一&#xff0c;值可多样 &#xff08;这里的有序无序指的是下标&#xff0c;可…

IPv4地址分类与常用网络地址详解

常见的 IPv4 地址分类&#xff1a; 1. A 类地址&#xff08;Class A&#xff09; 范围&#xff1a;0.0.0.0 到 127.255.255.255 默认子网掩码&#xff1a;255.0.0.0 或 /8 用途&#xff1a;通常用于大型网络&#xff0c;例如大型公司、组织。 特点&#xff1a; 网络地址范围…

模拟实现memmove,memcpy,memset

目录 前言 一、模拟实现memmove 代码演示&#xff1a; 二、模拟实现memcpy 代码演示&#xff1a; 三、模拟实现memset 代码演示&#xff1a; 总结 前言 这篇文章主要讲解了库函数的模拟实现&#xff0c;包含memmove&#xff0c;memcpy&#xff0c;memset 一、模拟实现m…

RHCSA Linux 系统文件内容显示2

6. 过滤文件内容显示 grep &#xff08;1&#xff09;功能&#xff1a;在指定普通文件中查找并显示含指定字符串的行&#xff0c;也可与管道符连用。 &#xff08;2&#xff09;格式&#xff1a;grep 选项... 关键字字符串 文件名... &#xff08;3&#xff09;常用选项及说…