ESP32 UDP 05

news2024/9/25 7:15:49

1.在上一文章基础上修改,文章网址

ESP32-Ethernet-04-CSDN博客

2.基本代码

/* Ethernet Basic Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_netif.h"
#include "esp_eth.h"
#include "esp_event.h"
#include "esp_log.h"
#include "ethernet_init.h"
#include "sdkconfig.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>

static const char *TAG = "eth_example";

/** Event handler for Ethernet events */
static void eth_event_handler(void *arg, esp_event_base_t event_base,
                              int32_t event_id, void *event_data)
{
    uint8_t mac_addr[6] = {0};
    /* we can get the ethernet driver handle from event data */
    esp_eth_handle_t eth_handle = *(esp_eth_handle_t *)event_data;
	esp_netif_t *eth_netif=(esp_netif_t *)arg;
    switch (event_id) {
    case ETHERNET_EVENT_CONNECTED:
		esp_netif_dhcpc_stop(eth_netif);
        esp_netif_ip_info_t eth;
		esp_netif_set_ip4_addr(&eth.ip,192, 168, 1, 22);
   	    esp_netif_set_ip4_addr(&eth.gw,192, 168, 1, 1);
   	    esp_netif_set_ip4_addr(&eth.netmask, 255, 255, 255, 0);
    	esp_netif_set_ip_info(eth_netif,&eth);

        esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr);
        ESP_LOGI(TAG, "Ethernet Link Up");
        ESP_LOGI(TAG, "Ethernet HW Addr %02x:%02x:%02x:%02x:%02x:%02x",
                 mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
        break;
    case ETHERNET_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "Ethernet Link Down");
        break;
    case ETHERNET_EVENT_START:
        ESP_LOGI(TAG, "Ethernet Started");
        break;
    case ETHERNET_EVENT_STOP:
        ESP_LOGI(TAG, "Ethernet Stopped");
        break;
    default:
        break;
    }
}

//IP_EVENT_ETH_GOT_IP的事件处理程序
static void got_ip_event_handler(void *arg, esp_event_base_t event_base,
                                 int32_t event_id, void *event_data)
{
    ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
    const esp_netif_ip_info_t *ip_info = &event->ip_info;
    ESP_LOGI(TAG, "Ethernet Got IP Address");
    ESP_LOGI(TAG, "~~~~~~~~~~~");
    ESP_LOGI(TAG, "ETHIP:" IPSTR, IP2STR(&ip_info->ip));
    ESP_LOGI(TAG, "ETHMASK:" IPSTR, IP2STR(&ip_info->netmask));
    ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info->gw));
    ESP_LOGI(TAG, "~~~~~~~~~~~");
}


//UDP 接受任务函数
static void udp_recv_task(void* arg)
{
    char rx_buffer[128];
	int sock = *(int *)arg;
    struct sockaddr_in source_addr; // Large enough for both IPv4 or IPv6
    socklen_t socklen = sizeof(source_addr);
    for (;;) 
	{
		//清空缓存
		memset(rx_buffer, 0, sizeof(rx_buffer));
		//接受数据
		int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer), 0, (struct sockaddr *)&source_addr, &socklen);
		//发送数据
		int err = sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr, sizeof(source_addr));
		if(err < 0) 
		{
			printf("Error occurred during sending: errno %d", errno);
		}

    }
}

void app_main(void)
{
	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();
    }
	//初始化TCP/IP网络接口
    esp_netif_init();
    //创建一个在后台运行的默认事件循环
    esp_event_loop_create_default();

    //初始化MAC和PHY默认配置
	eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
    eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
    
	//PHY地址和复位引脚配置
	phy_config.phy_addr = CONFIG_EXAMPLE_ETH_PHY_ADDR;
    phy_config.reset_gpio_num = CONFIG_EXAMPLE_ETH_PHY_RST_GPIO;

	//初始化EMAC默认配置
	eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
	
	//MDC的信号引脚
	esp32_emac_config.smi_mdc_gpio_num = CONFIG_EXAMPLE_ETH_MDC_GPIO;
	//MDIO的信号引脚
    esp32_emac_config.smi_mdio_gpio_num = CONFIG_EXAMPLE_ETH_MDIO_GPIO;

	 //创建MAC实例
    esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config);

	//创建PHY实例
	esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config);

	//驱动程序安装完毕后,将得到驱动程序的句柄
	esp_eth_handle_t eth_handle = NULL;
	//应用默认驱动程序配置
    esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
	//安装驱动程序
	esp_eth_driver_install(&config, &eth_handle);

	//应用以太网默认的网络接口配置
	esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH();

	//为以太网驱动程序创建网络接口
	esp_netif_t *eth_netif = esp_netif_new(&cfg);

	//将以太网驱动程序连接至TCP/IP协议栈
	esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle));

    //注册以太网事件处理程序
    esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, eth_netif);
	
	//注册用户定义的IP事件处理程序
    esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, eth_netif);

	//启动以太网驱动程序状态机
    esp_eth_start(eth_handle);

	//新建socket
	int sock =  socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

	//绑定本机地址的IP和端口
	struct sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    dest_addr.sin_port = htons(10000);
	//绑定本机IP
	int err = bind(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
	if(err < 0)
	{
		printf("Socket unable to bind: errno %d", errno);
		close(sock);
	}
	//创建任务
    xTaskCreate(udp_recv_task, "udp_recv_task", 2048, &sock, 10, NULL);
}

3.运行和测试结果

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

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

相关文章

再见Java 8,请掌握最新LTS

简介 在Java开发中&#xff0c;Java 8曾经是无可争议的主流&#xff0c;凭借其稳定性和广泛的社区支持&#xff0c;陪伴了无数开发者走过多年辉煌时刻。然而&#xff0c;随着时间的推移&#xff0c;技术不断革新&#xff0c;企业和开发者们逐渐把目光投向了更新的LTS&#xff0…

LLM时代的transformer参数量、计算量、激活值的分析

导读&#xff1a;本文可以看作是对分析transformer模型的参数量、计算量、中间激活、KV cache的详细说明 定性分析 GPU上都存了哪些东西 首先我们来从全局整体的角度看一看&#xff0c;在训练阶段GPU显存上都有哪些内容&#xff1a; Model States&#xff1a;模型训练过程中…

使用 nuxi upgrade 升级现有nuxt项目版本

title: 使用 nuxi upgrade 升级现有nuxt项目版本 date: 2024/9/10 updated: 2024/9/10 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi upgrade命令升级Nuxt 3项目,包括打开终端、运行升级命令、使用选项、测试项目等步骤,以及升级前的注意事项,如备份代码、检…

shader 案例学习笔记之绘制圆

环境搭建&#xff1a;参考glsl vscode环境搭建 先上代码 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;st - 0.5;st.x * u_resolution.x/u_resolution.y;float r length(st);float d ste…

【面试分享】面试题——网络题目_网络面试题

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 一、题目 1、网关、网桥、路由器、中继器作用、实现以及对应的osi层? 2、MAC地址是什么? 3、webSocket是什么? 4、常见的协议有哪些&#xff1f; 5、什么…

交换机vlan配置实现

交换机配置 1. 配置交换机速度 进入交换机相应端口。 speed数值&#xff1a; 单位为Mbits;可选10&#xff0c;100&#xff0c;auto duplex参数&#xff1a;参数可选full全双工,half半双工,auto自适应 配置交换机管理IP地址&#xff1a; 在全局模式下&#xff1a; interf…

Qt使用UDP进行单波通信

Qt使用UDP进行单波通信 我们一般学习完基础的一些编程之后就会开始接触网络编程&#xff0c;我们熟悉的网络编程一般会涉及到两个协议一个时TCP&#xff0c;一个是UDP。TCP一般是point to point&#xff0c;UDP一般有单播和广播两种方式&#xff0c;那么我们今天就来学习一下单…

ECRS软件作业分析:提升工厂生产效率的钥匙

在竞争日益激烈的现代工业环境中&#xff0c;如何提升生产效率、降低资源消耗、增加产品价值&#xff0c;成为了每一家制造企业必须面对的重要课题。作业分析&#xff0c;作为一种科学的管理工具&#xff0c;正逐步成为企业优化生产流程、提升竞争力的关键手段。本文旨在深入探…

Unity SRP 可编程渲染管线的基本用法

可编程渲染管线使用教程 SRP 可以处理Canvas为Screen Space - Overlay的渲染 安装插件 首先进入package manager&#xff0c;下载Core RP Lib组件 创建渲染管线 编写渲染管线逻辑脚本 新建脚本取名为MPipeLine&#xff0c;该脚本用于实现渲染管线的处理逻辑 using Unity…

Python计算机视觉 第7章-图像搜索

Python计算机视觉 第7章-图像搜索 7.1 基于内容的图像检索 在大型图像数据库上&#xff0c;CBIR&#xff08;Content-Based Image Retrieval&#xff0c;基于内容的图像检索&#xff09;技术用于检索在视觉上具相似性的图像。这样返回的图像可以是颜色相似、纹理相似、图像中…

优秀一点点

在职场中&#xff0c;想要获得晋升&#xff0c;重要的是比其他同事优秀一点点。这就好比百米短跑比赛&#xff0c;第一名比第二名可能之快了0.01秒&#xff0c;这个0.01秒&#xff0c;和跑一百米所花的10秒钟比起来&#xff0c;可能只有千分之一。也就是说&#xff0c;第一名比…

麦汁煮沸工艺

麦汁煮沸是啤酒酿造中至关重要的工艺环节之一&#xff0c;直接影响啤酒的风味。今天&#xff0c;天泰邀您一起深入探讨这一关键的酿造技术。 煮沸麦汁 在煮沸麦汁时&#xff0c;时间和温度控制至关重要。通常&#xff0c;麦汁煮沸持续 40 到 50 分钟&#xff0c;具体时间取决于…

OpenAI Embeddings API: How embeddings work?

题意&#xff1a;OpenAI 嵌入 API&#xff1a;嵌入是如何工作的&#xff1f; 问题背景&#xff1a; There are quite a few tutorials on embeddings in OpenAI. I cant understand how they work. 在OpenAI中有很多关于嵌入的教程&#xff0c;但我无法理解它们是如何工作的。…

轻松实现游戏串流,内网穿透

一、部署Gemini Gemini使用教程 二、部署Moonlight 过程大概说一下&#xff0c;网上有太多太多moonlight的东西了 需要运行游戏的机器上安装GFE&#xff08;GeForce Experience&#xff09;&#xff0c;登录并开启GAMESTREAM&#xff08;游戏串流&#xff09;功能 注&…

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的&#xff0c; 论文可以从 https://arxiv.org/abs/2205.14135 页面下载&#xff0c;点击 View PDF 就可以下载。 下面我…

Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看。以及php搜索给定的值在数组中最后一次出现的位置的实现思考

一、Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看 PHP的数组函数真不少&#xff0c;甚至对一个程序员来说&#xff0c;在其整个程序生涯中有些方法他永远也不会用上。不过每一个方法都有其价值、或者在出现的时候有其价值。所以偶尔有空时还是可以去看看。在这…

并发编程:线程池(下)

一、线程池常用的阻塞队列有哪些&#xff1f; 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数&#xff0c;如果达到的话&#xff0c;新任务就会被存放在队列中。 不同的线程池会选用不同的阻塞队列&#xff0c;我们可以结合内置线程池来分析。 容量为 Integer…

UE5 半透明阴影 快速解决方案

Step 1&#xff1a; 打开该选项 Step 2&#xff1a; 将半透明材质给到模型后&#xff0c;设置光照的Shadow Resolution Scale&#xff0c;越大&#xff0c;阴影的效果越好 Step 3&#xff1a; 用这种方式去做&#xff0c;阴影会因为半透明的程度&#xff0c;降低阴影的浓度 要…

Spring security 动态权限管理(基于数据库)

一、简介 如果对该篇文章不了解&#xff0c;请移步上一篇文章&#xff1a;spring security 中的授权使用-CSDN博客 当我们配置的 URL 拦截规则请求 URL 所需要的权限都是通过代码来配置的&#xff0c;这样就比较死板&#xff0c;如果想要调整访问某一个 URL 所需要的权限&…

【专项刷题】— 队列

1、N 叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 每次遍历一层节点的时候就把当前节点的值添加到列表中再将当前层的节点的子节点添加到队列中每次遍历完一层之后就添加到总表中代码&#xff1a; public List<List<Integer>> levelO…