ESP32 UDP 05

打印 上一主题 下一主题

主题 651|帖子 651|积分 1953

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

ESP32-Ethernet-04-CSDN博客
2.基本代码

  1. /* Ethernet Basic Example
  2.    This example code is in the Public Domain (or CC0 licensed, at your option.)
  3.    Unless required by applicable law or agreed to in writing, this
  4.    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  5.    CONDITIONS OF ANY KIND, either express or implied.
  6. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "esp_netif.h"
  12. #include "esp_eth.h"
  13. #include "esp_event.h"
  14. #include "esp_log.h"
  15. #include "ethernet_init.h"
  16. #include "sdkconfig.h"
  17. #include "nvs_flash.h"
  18. #include "lwip/err.h"
  19. #include "lwip/sockets.h"
  20. #include "lwip/sys.h"
  21. #include <lwip/netdb.h>
  22. static const char *TAG = "eth_example";
  23. /** Event handler for Ethernet events */
  24. static void eth_event_handler(void *arg, esp_event_base_t event_base,
  25.                               int32_t event_id, void *event_data)
  26. {
  27.     uint8_t mac_addr[6] = {0};
  28.     /* we can get the ethernet driver handle from event data */
  29.     esp_eth_handle_t eth_handle = *(esp_eth_handle_t *)event_data;
  30.         esp_netif_t *eth_netif=(esp_netif_t *)arg;
  31.     switch (event_id) {
  32.     case ETHERNET_EVENT_CONNECTED:
  33.                 esp_netif_dhcpc_stop(eth_netif);
  34.         esp_netif_ip_info_t eth;
  35.                 esp_netif_set_ip4_addr(&eth.ip,192, 168, 1, 22);
  36.                esp_netif_set_ip4_addr(&eth.gw,192, 168, 1, 1);
  37.                esp_netif_set_ip4_addr(&eth.netmask, 255, 255, 255, 0);
  38.             esp_netif_set_ip_info(eth_netif,&eth);
  39.         esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr);
  40.         ESP_LOGI(TAG, "Ethernet Link Up");
  41.         ESP_LOGI(TAG, "Ethernet HW Addr %02x:%02x:%02x:%02x:%02x:%02x",
  42.                  mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  43.         break;
  44.     case ETHERNET_EVENT_DISCONNECTED:
  45.         ESP_LOGI(TAG, "Ethernet Link Down");
  46.         break;
  47.     case ETHERNET_EVENT_START:
  48.         ESP_LOGI(TAG, "Ethernet Started");
  49.         break;
  50.     case ETHERNET_EVENT_STOP:
  51.         ESP_LOGI(TAG, "Ethernet Stopped");
  52.         break;
  53.     default:
  54.         break;
  55.     }
  56. }
  57. //IP_EVENT_ETH_GOT_IP的事件处理程序
  58. static void got_ip_event_handler(void *arg, esp_event_base_t event_base,
  59.                                  int32_t event_id, void *event_data)
  60. {
  61.     ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
  62.     const esp_netif_ip_info_t *ip_info = &event->ip_info;
  63.     ESP_LOGI(TAG, "Ethernet Got IP Address");
  64.     ESP_LOGI(TAG, "~~~~~~~~~~~");
  65.     ESP_LOGI(TAG, "ETHIP:" IPSTR, IP2STR(&ip_info->ip));
  66.     ESP_LOGI(TAG, "ETHMASK:" IPSTR, IP2STR(&ip_info->netmask));
  67.     ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info->gw));
  68.     ESP_LOGI(TAG, "~~~~~~~~~~~");
  69. }
  70. //UDP 接受任务函数
  71. static void udp_recv_task(void* arg)
  72. {
  73.     char rx_buffer[128];
  74.         int sock = *(int *)arg;
  75.     struct sockaddr_in source_addr; // Large enough for both IPv4 or IPv6
  76.     socklen_t socklen = sizeof(source_addr);
  77.     for (;;)
  78.         {
  79.                 //清空缓存
  80.                 memset(rx_buffer, 0, sizeof(rx_buffer));
  81.                 //接受数据
  82.                 int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer), 0, (struct sockaddr *)&source_addr, &socklen);
  83.                 //发送数据
  84.                 int err = sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr, sizeof(source_addr));
  85.                 if(err < 0)
  86.                 {
  87.                         printf("Error occurred during sending: errno %d", errno);
  88.                 }
  89.     }
  90. }
  91. void app_main(void)
  92. {
  93.         esp_err_t ret = nvs_flash_init();
  94.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  95.       ESP_ERROR_CHECK(nvs_flash_erase());
  96.       ret = nvs_flash_init();
  97.     }
  98.         //初始化TCP/IP网络接口
  99.     esp_netif_init();
  100.     //创建一个在后台运行的默认事件循环
  101.     esp_event_loop_create_default();
  102.     //初始化MAC和PHY默认配置
  103.         eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
  104.     eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
  105.    
  106.         //PHY地址和复位引脚配置
  107.         phy_config.phy_addr = CONFIG_EXAMPLE_ETH_PHY_ADDR;
  108.     phy_config.reset_gpio_num = CONFIG_EXAMPLE_ETH_PHY_RST_GPIO;
  109.         //初始化EMAC默认配置
  110.         eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
  111.        
  112.         //MDC的信号引脚
  113.         esp32_emac_config.smi_mdc_gpio_num = CONFIG_EXAMPLE_ETH_MDC_GPIO;
  114.         //MDIO的信号引脚
  115.     esp32_emac_config.smi_mdio_gpio_num = CONFIG_EXAMPLE_ETH_MDIO_GPIO;
  116.          //创建MAC实例
  117.     esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config);
  118.         //创建PHY实例
  119.         esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config);
  120.         //驱动程序安装完毕后,将得到驱动程序的句柄
  121.         esp_eth_handle_t eth_handle = NULL;
  122.         //应用默认驱动程序配置
  123.     esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
  124.         //安装驱动程序
  125.         esp_eth_driver_install(&config, &eth_handle);
  126.         //应用以太网默认的网络接口配置
  127.         esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH();
  128.         //为以太网驱动程序创建网络接口
  129.         esp_netif_t *eth_netif = esp_netif_new(&cfg);
  130.         //将以太网驱动程序连接至TCP/IP协议栈
  131.         esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle));
  132.     //注册以太网事件处理程序
  133.     esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, eth_netif);
  134.        
  135.         //注册用户定义的IP事件处理程序
  136.     esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, eth_netif);
  137.         //启动以太网驱动程序状态机
  138.     esp_eth_start(eth_handle);
  139.         //新建socket
  140.         int sock =  socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  141.         //绑定本机地址的IP和端口
  142.         struct sockaddr_in dest_addr;
  143.     dest_addr.sin_family = AF_INET;
  144.     dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  145.     dest_addr.sin_port = htons(10000);
  146.         //绑定本机IP
  147.         int err = bind(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  148.         if(err < 0)
  149.         {
  150.                 printf("Socket unable to bind: errno %d", errno);
  151.                 close(sock);
  152.         }
  153.         //创建任务
  154.     xTaskCreate(udp_recv_task, "udp_recv_task", 2048, &sock, 10, NULL);
  155. }
复制代码
3.运行和测试效果




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表