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
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等配置。
三、测试
编译、烧录到esp32中,打开手机热点,并打开网络调试助手服务端,点击vscode的monitor按钮,查看与服务端建立socket连接。
在网络调试助手可以看到每间隔三秒收到数据打印:hello, I am tcp_client! 同时发送字符1控制led灯亮,发送字符0控制led灯灭。
