添加esp32 wifi ap tcpserver的例子

master
18650180552 2020-03-12 10:50:16 +08:00
parent ac2841a24b
commit d3054962ed
12 changed files with 1818 additions and 0 deletions

17
esp32/esp32/.cproject Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.1169930517">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1169930517" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry kind="src" path=""/>
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

20
esp32/esp32/.project Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>esp32</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>com.espressif.idf.core.idfNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,3 @@
eclipse.preferences.version=1
encoding//main/xuhong_Tcp.c=UTF-8
encoding//main/xuhong_Tcp.h=UTF-8

View File

@ -0,0 +1,6 @@
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(app-template)

5
esp32/esp32/LICENSE Normal file
View File

@ -0,0 +1,5 @@
Code in this repository 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.

11
esp32/esp32/README.md Normal file
View File

@ -0,0 +1,11 @@
ESP-IDF template app
====================
This is a template application to be used with [Espressif IoT Development Framework](https://github.com/espressif/esp-idf).
Please check [ESP-IDF docs](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for getting started instructions.
*Code in this repository 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.*

View File

@ -0,0 +1,8 @@
# Edit following two lines to set component requirements (see docs)
set(COMPONENT_REQUIRES )
set(COMPONENT_PRIV_REQUIRES )
set(COMPONENT_SRCS "main.c xuhong_Tcp.c")
set(COMPONENT_ADD_INCLUDEDIRS "")
register_component()

View File

@ -0,0 +1,14 @@
# put here your custom config value
menu "Example Configuration"
config ESP_WIFI_SSID
string "WiFi SSID"
default "myssid"
help
SSID (network name) for the example to connect to.
config ESP_WIFI_PASSWORD
string "WiFi Password"
default "mypassword"
help
WiFi password (WPA or WPA2) for the example to use.
endmenu

133
esp32/esp32/main/main.c Normal file
View File

@ -0,0 +1,133 @@
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "esp_err.h"
#include "driver/uart.h"
#include <errno.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_log.h"
#include "esp_err.h"
#include "xuhong_Tcp.h"
#define TCP_SERVER_CLIENT_OPTION 1
//this task establish a TCP connection and receive data from TCP
static void tcp_conn(void *pvParameters)
{
while (1)
{
g_rxtx_need_restart = false;
ESP_LOGI(TAG, "task tcp_conn...");
/*wating for connecting to AP*/
xEventGroupWaitBits(tcp_event_group, WIFI_CONNECTED_BIT, false, true, portMAX_DELAY);
TaskHandle_t tx_rx_task = NULL;
#if TCP_SERVER_CLIENT_OPTION
ESP_LOGI(TAG, "tcp_server will start after 3s...");
vTaskDelay(3000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_tcp_server.");
int socket_ret = create_tcp_server(true);
#else
ESP_LOGI(TAG, "tcp_client will start after 3s...");
vTaskDelay(3000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_tcp_Client.");
int socket_ret = create_tcp_client();
#endif
if (socket_ret == ESP_FAIL)
{
ESP_LOGI(TAG, "create tcp socket error,stop...");
continue;
}
else
{
ESP_LOGI(TAG, "create tcp socket succeed...");
}
if (pdPASS != xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task))
{
ESP_LOGI(TAG, "Recv task create fail!");
}
else
{
ESP_LOGI(TAG, "Recv task create succeed!");
}
while (1)
{
vTaskDelay(3000 / portTICK_RATE_MS);
#if TCP_SERVER_CLIENT_OPTION
if (g_rxtx_need_restart)
{
ESP_LOGE(TAG, "tcp server send or receive task encoutner error, need to restart...");
if (ESP_FAIL != create_tcp_server(false))
{
if (pdPASS != xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task))
{
ESP_LOGE(TAG, "tcp server Recv task create fail!");
}
else
{
ESP_LOGE(TAG, "tcp server Recv task create succeed!");
}
}
}
#else
if (g_rxtx_need_restart)
{
ESP_LOGI(TAG, "tcp_client will reStart after 3s...");
vTaskDelay(3000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_tcp_Client...");
int socket_ret = create_tcp_client();
if (socket_ret == ESP_FAIL)
{
ESP_LOGE(TAG, "create tcp socket error,stop...");
continue;
}
else
{
ESP_LOGI(TAG, "create tcp socket succeed...");
g_rxtx_need_restart = false;
}
if (pdPASS != xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task))
{
ESP_LOGE(TAG, "Recv task create fail!");
}
else
{
ESP_LOGI(TAG, "Recv task create succeed!");
}
}
#endif
}
}
vTaskDelete(NULL);
}
void app_main(void)
{
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
#if TCP_SERVER_CLIENT_OPTION
ESP_LOGI(TAG, "As a Tcp Server , will start wifi_init_softap...");
wifi_init_softap();
#else
ESP_LOGI(TAG, "As a Tcp Client , will start wifi_init_sta...");
wifi_init_sta();
#endif
xTaskCreate(&tcp_conn, "tcp_conn", 4096, NULL, 5, NULL);
}

View File

@ -0,0 +1,377 @@
/* tcp_perf 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/socket.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "xuhong_Tcp.h"
/* FreeRTOS event group to signal when we are connected to wifi */
EventGroupHandle_t tcp_event_group;
/*socket*/
static int server_socket = 0;
static struct sockaddr_in server_addr;
static struct sockaddr_in client_addr;
static unsigned int socklen = sizeof(client_addr);
static int connect_socket = 0;
bool g_rxtx_need_restart = false;
int g_total_data = 0;
#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO
int g_total_pack = 0;
int g_send_success = 0;
int g_send_fail = 0;
int g_delay_classify[5] = {0};
#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch (event->event_id)
{
case SYSTEM_EVENT_STA_START:
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
esp_wifi_connect();
xEventGroupClearBits(tcp_event_group, WIFI_CONNECTED_BIT);
break;
case SYSTEM_EVENT_STA_CONNECTED:
xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);
break;
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "got ip:%s\n",
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);
break;
case SYSTEM_EVENT_AP_STACONNECTED:
ESP_LOGI(TAG, "station:" MACSTR " join,AID=%d\n",
MAC2STR(event->event_info.sta_connected.mac),
event->event_info.sta_connected.aid);
xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
ESP_LOGI(TAG, "station:" MACSTR "leave,AID=%d\n",
MAC2STR(event->event_info.sta_disconnected.mac),
event->event_info.sta_disconnected.aid);
g_rxtx_need_restart = true;
xEventGroupClearBits(tcp_event_group, WIFI_CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
//send data
void send_data(void *pvParameters)
{
int len = 0;
char *databuff = (char *)malloc(EXAMPLE_DEFAULT_PKTSIZE * sizeof(char));
memset(databuff, EXAMPLE_PACK_BYTE_IS, EXAMPLE_DEFAULT_PKTSIZE);
vTaskDelay(100 / portTICK_RATE_MS);
ESP_LOGI(TAG, "start sending...");
while (1)
{
int to_write = EXAMPLE_DEFAULT_PKTSIZE;
while (to_write > 0)
{
len = send(connect_socket, databuff + (EXAMPLE_DEFAULT_PKTSIZE - to_write), to_write, 0);
if (len > 0)
{
g_total_data += len;
to_write -= len;
}
else
{
int err = get_socket_error_code(connect_socket);
if (err != ENOMEM)
{
show_socket_error_reason("send_data", connect_socket);
break;
}
}
}
#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO
gettimeofday(&tv_finish, NULL);
#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/
if (g_total_data > 0)
{
#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO
g_send_success++;
send_delay_ms = (tv_finish.tv_sec - tv_start.tv_sec) * 1000 + (tv_finish.tv_usec - tv_start.tv_usec) / 1000;
if (send_delay_ms < 30)
{
g_delay_classify[0]++;
}
else if (send_delay_ms < 100)
{
g_delay_classify[1]++;
}
else if (send_delay_ms < 300)
{
g_delay_classify[2]++;
}
else if (send_delay_ms < 1000)
{
g_delay_classify[3]++;
}
else
{
g_delay_classify[4]++;
}
#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/
}
else
{
break;
}
}
g_rxtx_need_restart = true;
free(databuff);
vTaskDelete(NULL);
}
//receive data
void recv_data(void *pvParameters)
{
int len = 0;
char databuff[1024];
while (1)
{
//姣忔鎺ユ敹閮借娓呯┖鎺ユ敹鏁扮粍
memset(databuff, 0x00, sizeof(databuff));
len = recv(connect_socket, databuff, sizeof(databuff), 0);
g_rxtx_need_restart = false;
if (len > 0)
{
g_total_data += len;
//鎵撳嵃鎺ユ敹鍒扮殑鏁扮粍
ESP_LOGI(TAG, "recvData: %s\n", databuff);
//鍘熻矾杩斿洖锛屼笉鎸囧畾鏌愪釜瀹㈡埛绔<E59F9B>
send(connect_socket, databuff, sizeof(databuff), 0);
//sendto(connect_socket, databuff , sizeof(databuff), 0, (struct sockaddr *) &remote_addr,sizeof(remote_addr));
}
else
{
show_socket_error_reason("recv_data", connect_socket);
g_rxtx_need_restart = true;
#if !TCP_SERVER_CLIENT_OPTION
break;
#endif
}
}
close_socket();
g_rxtx_need_restart = true;
vTaskDelete(NULL);
}
esp_err_t create_tcp_server(bool isCreatServer)
{
if (isCreatServer)
{
ESP_LOGI(TAG, "server socket....,port=%d", TCP_PORT);
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0)
{
show_socket_error_reason("create_server", server_socket);
return ESP_FAIL;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(TCP_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
show_socket_error_reason("bind_server", server_socket);
close(server_socket);
return ESP_FAIL;
}
}
if (listen(server_socket, 5) < 0)
{
show_socket_error_reason("listen_server", server_socket);
close(server_socket);
return ESP_FAIL;
}
connect_socket = accept(server_socket, (struct sockaddr *)&client_addr, &socklen);
if (connect_socket < 0)
{
show_socket_error_reason("accept_server", connect_socket);
close(server_socket);
return ESP_FAIL;
}
/*connection established锛宯ow can send/recv*/
ESP_LOGI(TAG, "tcp connection established!");
return ESP_OK;
}
//鍒涘缓TCP瀹㈡埛绔繛鎺ュ埌鎸囧畾鐨勬湇鍔″櫒
esp_err_t create_tcp_client()
{
ESP_LOGI(TAG, "will connect gateway ssid : %s port:%d\n",
TCP_SERVER_ADRESS, TCP_PORT);
connect_socket = socket(AF_INET, SOCK_STREAM, 0);
if (connect_socket < 0)
{
show_socket_error_reason("create client", connect_socket);
return ESP_FAIL;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(TCP_PORT);
server_addr.sin_addr.s_addr = inet_addr(TCP_SERVER_ADRESS);
ESP_LOGI(TAG, "connectting server...");
if (connect(connect_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
show_socket_error_reason("client connect", connect_socket);
ESP_LOGE(TAG, "connect failed!");
return ESP_FAIL;
}
ESP_LOGI(TAG, "connect success!");
return ESP_OK;
}
//wifi_init_sta
void wifi_init_sta()
{
tcp_event_group = xEventGroupCreate();
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {
.sta = {
.ssid = GATEWAY_SSID,
.password = GATEWAY_PAS},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_sta finished.");
ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",
GATEWAY_SSID, GATEWAY_PAS);
}
//wifi_init_softap
void wifi_init_softap()
{
tcp_event_group = xEventGroupCreate();
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {
.ap = {
.ssid_len = 0,
.ssid = SOFT_AP_SSID,
.max_connection = SOFT_AP_MAX_CONNECT,
.password = SOFT_AP_PAS,
.authmode = WIFI_AUTH_WPA_WPA2_PSK},
};
if (strlen(EXAMPLE_DEFAULT_PWD) == 0)
{
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
}
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "SoftAP set finish:%s pas:%s \n",
EXAMPLE_DEFAULT_SSID, EXAMPLE_DEFAULT_PWD);
}
int get_socket_error_code(int socket)
{
int result;
u32_t optlen = sizeof(int);
int err = getsockopt(socket, SOL_SOCKET, SO_ERROR, &result, &optlen);
if (err == -1)
{
ESP_LOGE(TAG, "getsockopt failed:%s", strerror(err));
return -1;
}
return result;
}
int show_socket_error_reason(const char *str, int socket)
{
int err = get_socket_error_code(socket);
if (err != 0)
{
ESP_LOGW(TAG, "%s socket error %d %s", str, err, strerror(err));
}
return err;
}
int check_working_socket()
{
int ret;
#if EXAMPLE_ESP_TCP_MODE_SERVER
ESP_LOGD(TAG, "check server_socket");
ret = get_socket_error_code(server_socket);
if (ret != 0)
{
ESP_LOGW(TAG, "server socket error %d %s", ret, strerror(ret));
}
if (ret == ECONNRESET)
{
return ret;
}
#endif
ESP_LOGD(TAG, "check connect_socket");
ret = get_socket_error_code(connect_socket);
if (ret != 0)
{
ESP_LOGW(TAG, "connect socket error %d %s", ret, strerror(ret));
}
if (ret != 0)
{
return ret;
}
return 0;
}
void close_socket()
{
close(connect_socket);
close(server_socket);
}

View File

@ -0,0 +1,121 @@
#ifndef __TCP_PERF_H__
#define __TCP_PERF_H__
#ifdef __cplusplus
extern "C" {
#endif
/*test options*/
#define EXAMPLE_ESP_WIFI_MODE_AP CONFIG_TCP_PERF_WIFI_MODE_AP
#define EXAMPLE_ESP_TCP_MODE_SERVER CONFIG_TCP_PERF_SERVER
#define EXAMPLE_ESP_TCP_PERF_TX CONFIG_TCP_PERF_TX
#define EXAMPLE_ESP_TCP_DELAY_INFO CONFIG_TCP_PERF_DELAY_DEBUG
/*AP info and tcp_server info*/
#define EXAMPLE_DEFAULT_SSID "test"
#define EXAMPLE_DEFAULT_PWD "123456789"
#define EXAMPLE_DEFAULT_PORT 8900
#define EXAMPLE_DEFAULT_PKTSIZE 200
#define EXAMPLE_MAX_STA_CONN 1
#ifdef CONFIG_TCP_PERF_SERVER_IP
#define EXAMPLE_DEFAULT_SERVER_IP CONFIG_TCP_PERF_SERVER_IP
#else
#define EXAMPLE_DEFAULT_SERVER_IP "192.168.4.1"
#endif
#define EXAMPLE_PACK_BYTE_IS 97 //'a'
#define TCP_SERVER_CLIENT_OPTION FALSE //true涓哄紑鍚儹鐐瑰苟涓斿垱寤簍cp鏈嶅姟鍣紝fasle涓鸿繛鎺ュ埌鎸囧畾鐨勮矾鐢卞櫒骞朵笖杩炴帴鍒版寚瀹氱殑tcp鏈嶅姟鍣<E5A79F>
#define TAG "XuHongTCP-->" //鎵撳嵃鐨則ag
//浠ヤ笅鏄痵oftAP鐑偣妯″紡鐨勯厤缃俊鎭<E4BF8A>
#define SOFT_AP_SSID "XuHongTCP2018"
#define SOFT_AP_PAS "xuhong123456" //濡傛灉瀵嗙爜璁剧疆涓虹┖锛屽垯閰嶇疆鐨勭儹鐐规槸寮<E6A7B8>鏀剧殑锛屾病鏈夊瘑鐮佺殑銆<E6AE91>
#define SOFT_AP_MAX_CONNECT 1 //浣滀负AP鐑偣鏃跺<E98F83>欙紝鏈<E7B49D>х殑杩炴帴鏁扮洰
//浠ヤ笅鏄痵tation妯″紡閰嶇疆淇℃伅,鏄偍瀹堕噷鐨勮矾鐢卞櫒鐨勪俊鎭<E4BF8A>
#define GATEWAY_SSID "AliyunOnlyTest"
#define GATEWAY_PAS "aliyun#123456"
#define TCP_SERVER_ADRESS "192.168.1.104" //瑕佽繛鎺CP鏈嶅姟鍣ㄥ湴鍧<E6B9B4>
//缁熶竴鐨勭鍙彿锛屽寘鎷琓CP瀹㈡埛绔垨鑰呮湇鍔
#define TCP_PORT 8266
/* FreeRTOS event group to signal when we are connected to wifi*/
extern EventGroupHandle_t tcp_event_group;
#define WIFI_CONNECTED_BIT BIT0
extern int g_total_data;
extern bool g_rxtx_need_restart;
#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO
extern int g_total_pack;
extern int g_send_success;
extern int g_send_fail;
extern int g_delay_classify[5];
#endif/*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/
//using esp as station
void wifi_init_sta();
//using esp as softap
void wifi_init_softap();
//create a tcp server socket. return ESP_OK:success ESP_FAIL:error
esp_err_t create_tcp_server(bool isCreatServer);
//create a tcp client socket. return ESP_OK:success ESP_FAIL:error
esp_err_t create_tcp_client();
//send data task
void send_data(void *pvParameters);
//receive data task
void recv_data(void *pvParameters);
//close all socket
void close_socket();
//get socket error code. return: error code
int get_socket_error_code(int socket);
//show socket error code. return: error code
int show_socket_error_reason(const char* str, int socket);
//check working socket
int check_working_socket();
#ifdef __cplusplus
}
#endif
#endif /*#ifndef __TCP_PERF_H__*/

1103
esp32/esp32/sdkconfig Normal file

File diff suppressed because it is too large Load Diff