ESP32做TCP客户端(client)与PC通信(socket)
本文作为学习记录描述基于esp32已经连接WiFi上,实现esp32作为tcp客户端跟pc端进行数据收发。
配置环境:
- ESP32开发板
- vscode
- ESP-IDF
- TCP工具 获取链接
1.什么是通信
我们在聊微信或QQ时,我们发一条信息过去,对方收到信息,并返回一条。在这个过程中,发信息和收信息这个进程是怎么跟微信或QQ这个服务器进行通信的。在网络中进程之间互相通信,我们需要列出唯一的标记来表示目前的进程。实际上,TCP/IP协议很好的帮助我们解决这个问题,利用ip地址+协议+端口号标记网络进程。网络中的进程一般都使用socket接口进行通信。个人理解socket相当于一个传话筒,每个人都把自己要发的信息交给socket,然后socket通过上面的标记分别发送给对应到的接收方。
2.socket工作基本流程
1.初始化socket()
2.连接(客户端client 连接 服务端server)connect()
3.数据交互(communicate)send()和recv()一直循环
4.断开连接(disconnect)shutdown() close()
在乐鑫文档里支持以下的API:
官方示例(tcp client)
所有示例都在esp-idf的example里
因为本文只描述tcp作为客户端的情况,所以服务端配置流程暂不描述。
3.TCP(client)流程
- 创建socket()
- 连接服务端connect()
- 发送数据send()
- 接收数据recv()
- 关闭socket close()
以下是根据示例移植到自己的工程下,所以略有改动(因为有些是官方给的示例函数,不建议直接使用)
#include "usertcp_client.h"
#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 "sdkconfig.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"
#include "lwip/errno.h"
#include "lwip/prot/dns.h"
// #if defined(CONFIG_EXAMPLE_IPV4)//如果选择IPV4 可以直接设置HOST_IP_ADDR
// #define HOST_IP_ADDR CONFIG_EXAMPLE_IPV4_ADDR
// #elif defined(CONFIG_EXAMPLE_IPV6)//如果选择IPV6 可以直接设置HOST_IP_ADDR
// #define HOST_IP_ADDR CONFIG_EXAMPLE_IPV6_ADDR
// #else
// #define HOST_IP_ADDR "198.20.10.13"
// #endif
// #define CONFIG_EXAMPLE_IPV4 "198.20.10.13"//电脑连接WiFi(esp也连同一个)时的ip
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV4_ADDR
#define PORT CONFIG_EXAMPLE_PORT //端口号(自己定)
static const