ESP32+idf开发之WIFI通信入门(3)TCP通信

ESP32+idf开发之WIFI通信入门(3)TCP通信

一、实现功能:

1、数据上行:在esp32板子上编写tcp客户端程序,每隔3秒钟向tcp服务端(网络调试助手)发送字符串“hello, I am tcp_client!”;

2、数据下行:esp32能够接收服务端发来的指令,解析后控制板子上的led的亮和灭;

3、能同时运行在数据的上下行状态;

二、步骤:

1、使用vscode新建一个空的sample_project工程,将idf中用于wifi连接的公共非标准组件(Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common),复制到我们的自定义组件目录components中。

进入终端命令行:

mkdir components

cp -r D:\Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common .\components

image-20230321214245939

2、在main.c中编写实现以上功能的代码

#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>

#include <esp_event.h>
#include <nvs_flash.h>
#include <esp_netif.h>

#include <protocol_examples_common.h>
#include <lwip/sockets.h>
#include <driver/gpio.h>

static char *TAG = "tcp_client";

static int sock;

// 功能二
#define LED_PIN GPIO_NUM_2 // led对应的gpio口
void led_init()
{
    gpio_config_t cfg = {
        .pin_bit_mask = 1 << LED_PIN,
        .mode = GPIO_MODE_OUTPUT,
        .intr_type = GPIO_INTR_DISABLE,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
    };
    ESP_ERROR_CHECK(gpio_config(&cfg)); // 对gpio进行初始化配置
}
void led_on()
{
    ESP_ERROR_CHECK(gpio_set_level(LED_PIN, 1));
}
void led_off()
{
    ESP_ERROR_CHECK(gpio_set_level(LED_PIN, 0));
}
static void my_led_task(void *pvParameters) // 控制led亮灭的任务
{
    led_init();
    while (1)
    {
        char cmd;
        int count = recv(sock, &cmd, 1, 0); // 接收服务端发来的控制指令
        if (count > 0)
        {
            if (cmd == '1')
            {
                led_on(); // led灯亮
            }
            else if (cmd == '0')
            {
                led_off(); // led灯灭
            }
        }
    }
}

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // esp32连接wifi热点
    ESP_ERROR_CHECK(example_connect());

    // 创建socket:socket();
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
        ESP_LOGE(TAG, "create socket failed!");
        return;
    }
    ESP_LOGI(TAG, "create socket successfully!");

    // 初始化server的地址结构体sockaddr_in
    struct sockaddr_in destaddr = {};
    destaddr.sin_family = AF_INET;
    destaddr.sin_port = htons(3333);                      // 填写网络调试助手服务端实际端口
    destaddr.sin_addr.s_addr = inet_addr("10.26.65.239"); // 填写网络调试助手服务端实际IP地址

    // 建立socket连接:
    socklen_t len = sizeof(struct sockaddr);
    if (connect(sock, (struct sockaddr *)&destaddr, len) < 0)
    {
        ESP_LOGE(TAG, "connect to server failed!");
        close(sock);
        return;
    }
    ESP_LOGI(TAG, "connect to server successfully!");

    // 创建任务来实现功能一和功能二同时运行
    xTaskCreate(my_led_task, "my_led", 4096, NULL, 5, NULL);

    // 功能一
    while (1)
    {
        // 发送数据给服务端:send();
        char buff[512] = "hello, I am tcp_client!";
        send(sock, buff, strlen(buff), 0);
        vTaskDelay(pdMS_TO_TICKS(3000));
    }
}

3、配置wifi连接设置,打开终端命令界面输入idf.py menuconfig,进入到Example Connection Configuration界面对热点信息的ssid和password等配置。

image-20230321221245559

三、测试

编译、烧录到esp32中,打开手机热点,并打开网络调试助手服务端,点击vscode的monitor按钮,查看与服务端建立socket连接。

image-20230321222400544

在网络调试助手可以看到每间隔三秒收到数据打印:hello, I am tcp_client! 同时发送字符1控制led灯亮,发送字符0控制led灯灭。

image-20230321222645002
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值