【致敬未来的攻城狮计划】打卡第5天 ESP-IDF Socket网络编程

指针到处飞 2023-05-09 23:04:32

目录

  • 新建工程
  • 配置代码
  • 编译工程
  • 代码
  • 结果

开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯(http://yyds.recan-li.xn--cn%29-cj4e/ 瑞萨MCU (瑞萨电子 (Renesas Electronics Corporation) ) 联合发起的「 致敬未来的攻城狮计划 」的第 5天,点击查看活动计划详情 (https://bbs.csdn.net/topics/613916237%EF%BC%89%EF%BC%81

在学习了Socket网络编程与之后,对Socket网络编程有了简单的了解,对ESPIDF的示例代码看起来没啥压力了
还有因为瑞萨的FSP实在有点用不惯,之前配置板载电容按键研究了一晚上也没研究出结果,所以暂时先不研究了,等后期有时间再继续学习,先发点这个水一水

新建工程

image-20230509220720822

创建工程之后,先连一下宿舍wifi,注意需要连接2.4g的wifi,因为esp32s2只支持2.4g的wifi。

image-20230509222447813

配置代码

点击左下角的设置按钮可以进入项目代码的配置界面,同idf.py menuconfig,只不过界面更加友好。

配置要连接的wifi与要连接主机的ip地址,不知道的可以在win+r输入cmd输入命令ipconfig查看ipv4地址填进去,端口号输入0~65535范围内的数字,建议8000以后,防止端口和其他程序冲突,程序默认的端口为3333,我这里填了9999保存后查看修改的配置发现没反应,所以端口用的默认的3333

输入esp32要连接的wifi信息

image-20230509221757815

image-20230509221454573

编译工程

不得不说,windows下使用编译工具确实慢而且CPU发热严重,风扇还呼呼的转,用Linux编译的比较快CPU还不太发热

image-20230509222542920

image-20230509223101954

烧录后发现串口输出乱码,需要在.vscode文件夹下设置,详见下图

image-20230509223631156

添加这一行

image-20230509223753719

代码

代码用的是示例代码,没有修改,只进行了上面的配置,还加了点注释

/* BSD Socket API 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 <string.h>
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"
#include "addr_from_stdin.h"
#include "lwip/err.h"
#include "lwip/sockets.h"


#if defined(CONFIG_EXAMPLE_IPV4)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV4_ADDR
#elif defined(CONFIG_EXAMPLE_IPV6)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV6_ADDR
#else
#define HOST_IP_ADDR ""
#endif

#define PORT CONFIG_EXAMPLE_PORT

static const char *TAG = "example";
static const char *payload = "Message from ESP32 ";

static void tcp_client_task(void *pvParameters)
{
    char rx_buffer[128];
    char host_ip[] = HOST_IP_ADDR;
    int addr_family = 0;
    int ip_protocol = 0;

    while (1) {
#if defined(CONFIG_EXAMPLE_IPV4)
        struct sockaddr_in dest_addr;
        dest_addr.sin_addr.s_addr = inet_addr(host_ip);
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_port = htons(PORT);
        addr_family = AF_INET;
        ip_protocol = IPPROTO_IP;
#elif defined(CONFIG_EXAMPLE_IPV6)
        struct sockaddr_in6 dest_addr = { 0 };
        inet6_aton(host_ip, &dest_addr.sin6_addr);
        dest_addr.sin6_family = AF_INET6;
        dest_addr.sin6_port = htons(PORT);
        dest_addr.sin6_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE);
        addr_family = AF_INET6;
        ip_protocol = IPPROTO_IPV6;
#elif defined(CONFIG_EXAMPLE_SOCKET_IP_INPUT_STDIN)
        struct sockaddr_storage dest_addr = { 0 };
        ESP_ERROR_CHECK(get_addr_from_stdin(PORT, SOCK_STREAM, &ip_protocol, &addr_family, &dest_addr));
#endif
        int sock =  socket(addr_family, SOCK_STREAM, ip_protocol);//创建套接字
        if (sock < 0) {
            ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
            break;
        }
        ESP_LOGI(TAG, "Socket created, connecting to %s:%d", host_ip, PORT);

        int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));//连接电脑主机
        if (err != 0) {
            ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
            break;
        }
        ESP_LOGI(TAG, "Successfully connected");

        while (1) {
            int err = send(sock, payload, strlen(payload), 0);//发送数据
            if (err < 0) {
                ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
                break;
            }

            int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);//接收数据
            // Error occurred during receiving
            if (len < 0) {
                ESP_LOGE(TAG, "recv failed: errno %d", errno);
                break;
            }
            // Data received
            else {
                rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string
                ESP_LOGI(TAG, "Received %d bytes from %s:", len, host_ip);
                ESP_LOGI(TAG, "%s", rx_buffer);
            }

            vTaskDelay(2000 / portTICK_PERIOD_MS);
        }

        if (sock != -1) {
            ESP_LOGE(TAG, "Shutting down socket and restarting...");
            shutdown(sock, 0);
            close(sock);
        }
    }
    vTaskDelete(NULL);
}

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());//初始化nvs_flash
    ESP_ERROR_CHECK(esp_netif_init());//初始化esp_netif网络接口
    ESP_ERROR_CHECK(esp_event_loop_create_default());//创建默认事件循环

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    ESP_ERROR_CHECK(example_connect());//

    xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);//创建TCP客户端任务
}

结果

image-20230509224426805

...全文
114 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

17,168

社区成员

发帖
与我相关
我的任务
社区描述
物联网架构师李肯,CSDN博客专家,带你一起玩转嵌入式和物联网。
物联网嵌入式硬件 个人社区 广东省·深圳市
社区管理员
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

架构师李肯带你进入物联网的精彩世界。

试试用AI创作助手写篇文章吧