]> granicus.if.org Git - esp-idf/commitdiff
tcp_perf:modify tcp_perf with some new options.
authorchenyudong <chenyudong@espressif.com>
Mon, 20 Mar 2017 05:43:04 +0000 (13:43 +0800)
committerchenyudong <chenyudong@espressif.com>
Mon, 10 Apr 2017 03:49:45 +0000 (11:49 +0800)
You can set esp32 as AP/STA, client/sever, sender/recever in menuconfig.
You can set whether to display delay time info in menuconfig.
Now you can transfer data between esp and esp.

examples/performance/README.md
examples/performance/tcp_esp2ap/main/Kconfig.projbuild [deleted file]
examples/performance/tcp_esp2ap/main/tcp_esp2ap.c [deleted file]
examples/performance/tcp_perf/Makefile [moved from examples/performance/tcp_esp2ap/Makefile with 85% similarity]
examples/performance/tcp_perf/main/Kconfig.projbuild [new file with mode: 0644]
examples/performance/tcp_perf/main/component.mk [moved from examples/performance/tcp_esp2ap/main/component.mk with 100% similarity]
examples/performance/tcp_perf/main/main.c [new file with mode: 0644]
examples/performance/tcp_perf/main/tcp_perf.c [new file with mode: 0644]
examples/performance/tcp_perf/main/tcp_perf.h [new file with mode: 0644]

index d79ee486ee6a67dee30312da8b18b72918d9fbb4..198df79b1a8b13a33a128c9f7e7282d460ea3a61 100644 (file)
@@ -1,7 +1,24 @@
 # Wifi Performance Examples\r
 \r
 Some simple codes help to test the wifi performance.\r
+\r
 Including TCP/UDP TX/RX throughput.\r
-You may need a TCP/UDP client on PC.\r
+\r
+#tcp_perf\r
+\r
+Using tcp.\r
+\r
+This example is used to test tcp throughput and delay time.\r
+\r
+First you should set menuconfig.\r
+\r
+You can set esp32 will be use as AP/STA, client/sever, sender/receiver in menuconfig. Also some config such as SSID, PASSWORD, SEVER_IP can be set in menuconfig.\r
+\r
+Open AP, then open STA, when they make a connect, they will send/receive data.You will see the calc result in com output. Make sure that your set can let them connect.\r
+\r
+Explaining more in [main.c](tcp_perf/main/main.c).\r
+\r
+\r
+\r
 \r
 See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples.\r
diff --git a/examples/performance/tcp_esp2ap/main/Kconfig.projbuild b/examples/performance/tcp_esp2ap/main/Kconfig.projbuild
deleted file mode 100644 (file)
index 39b0c8e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-menu "Example Configuration"
-
-config WIFI_SSID
-    string "WiFi SSID"
-    default "tp_wifi_test1"
-    help
-        SSID (network name) for the example to connect to.
-
-config WIFI_PASSWORD
-    string "WiFi Password"
-    default "1234567890"
-    help
-        WiFi password (WPA or WPA2) for the example to use.
-
-config SEVER_PORT
-       int "tcp sever port"
-       default 4567
-       help 
-               which will the tcp sever use.
-       
-config BUFF_SIZE
-       int "buff size"
-       default 1024
-       help
-               the data send&recv buff size. 
-
-choice 
-    prompt "test mode"
-       default PERFORMANCE_MODE
-       help
-               This option performance mode.
-       
-               - for "tcp receive" setting,it will receive data by tcp.
-               
-               - for "tcp send" setting, it will send data by tcp.
-               
-#              - for "udp receive" setting,it will receive data by udp.
-               
-#              - for "udp send" setting,it will send data by udp.
-                                       
-config MODE_TCP_RECV
-       bool "tcp receive"
-config MODE_TCP_SEND
-    bool "tcp send"
-#config MODE_UDP_RECV
-#    bool "udp receive"
-#config MODE_UDP_SEND
-#    bool "udp send"
-endchoice
-
-endmenu
diff --git a/examples/performance/tcp_esp2ap/main/tcp_esp2ap.c b/examples/performance/tcp_esp2ap/main/tcp_esp2ap.c
deleted file mode 100644 (file)
index 4e3ccc4..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-\r
-/*\r
-TCP_recv example\r
-This example use esp32 as station and TCP sever,\r
-when esp32 start,it will connect to an AP and will create a TCP socket as a sever,\r
-use a TCP client connect to esp32,\r
-then it will send/receive data,(set work mode in menuconfig)\r
-And calculate the speed of sending/receiving data.\r
-*/\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include "freertos/FreeRTOS.h"\r
-#include "freertos/task.h"\r
-#include "freertos/event_groups.h"\r
-#include "esp_wifi.h"\r
-#include "esp_event_loop.h"\r
-#include "esp_system.h"\r
-#include "nvs_flash.h"\r
-#include <sys/socket.h>  \r
-#include <netinet/in.h>  \r
-#include "driver/uart.h"\r
-#include "soc/uart_struct.h"\r
-\r
-/*AP info and tcp_sever info*/\r
-#define DEFAULTSSID CONFIG_WIFI_SSID\r
-#define DEFAULTPWD CONFIG_WIFI_PASSWORD\r
-#define DEFAULTPORT CONFIG_SEVER_PORT\r
-#define BUFFSIZE CONFIG_BUFF_SIZE\r
-\r
-static int totle_data=0;\r
-\r
-/* FreeRTOS event group to signal when we are connected & ready to make a request */\r
-static EventGroupHandle_t wifi_event_group;\r
-\r
-/**/\r
-static int connectedflag = 0;\r
-static int sever_socket;\r
-static struct sockaddr_in sever_addr;\r
-static struct sockaddr_in client_addr;\r
-static unsigned int socklen = sizeof(client_addr);\r
-static int connect_soc;\r
-\r
-static esp_err_t event_handler(void *ctx, system_event_t *event)\r
-{\r
-    switch(event->event_id) {\r
-    case SYSTEM_EVENT_STA_START:\r
-        esp_wifi_connect();\r
-        //printf("event_handler:SYSTEM_EVENT_STA_START\n");\r
-        break;\r
-    case SYSTEM_EVENT_STA_DISCONNECTED:\r
-        //printf("event_handler:SYSTEM_EVENT_STA_DISCONNECTED\n");\r
-        esp_wifi_connect();\r
-        break;\r
-    case SYSTEM_EVENT_STA_CONNECTED:\r
-        //printf("event_handler:SYSTEM_EVENT_STA_CONNECTED!\n");\r
-        break;\r
-    case SYSTEM_EVENT_STA_GOT_IP:\r
-        printf("event_handler:SYSTEM_EVENT_STA_GOT_IP!\n");\r
-               printf("ip:%s\n",ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));\r
-        connectedflag=1;\r
-        break;\r
-    default:\r
-        break;\r
-    }\r
-    return ESP_OK;\r
-}\r
-//wifi_init\r
-static void wifi_init()\r
-{\r
-    tcpip_adapter_init();\r
-    wifi_event_group = xEventGroupCreate();\r
-    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );\r
-\r
-    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\r
-    ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
-    wifi_config_t wifi_config = {\r
-        .sta = {\r
-            .ssid = DEFAULTSSID,\r
-            .password = DEFAULTPWD\r
-        },\r
-    };\r
-\r
-    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );\r
-    ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );\r
-    ESP_ERROR_CHECK( esp_wifi_start() );\r
-    esp_wifi_connect();\r
-    \r
-    printf("wifi_init over.\n");\r
-}\r
-\r
-static void data_count(void *pvParameters)\r
-{\r
-       int len=0;\r
-       char databuff[BUFFSIZE];\r
-#ifdef CONFIG_MODE_TCP_SEND\r
-       memset(databuff,97,BUFFSIZE);\r
-#endif\r
-       while(1)\r
-       {\r
-#ifdef CONFIG_MODE_TCP_SEND\r
-               len=send(connect_soc, databuff, BUFFSIZE, 0);\r
-#else\r
-               len=recv(connect_soc, databuff, BUFFSIZE, 0);\r
-#endif\r
-               if(len>0)\r
-               {\r
-                       totle_data+=len;\r
-               }\r
-               else\r
-               {\r
-                       /*for faster send&receive,don't show error code.\r
-                        *if it can't work as expectations,unnote the two lines here\r
-                        **/\r
-                       //perror("data_count error");\r
-                       //vTaskDelay(500/portTICK_RATE_MS);\r
-               }\r
-       } \r
-}\r
-\r
-//this task establish a TCP connection and receive data from TCP\r
-static void tcp_client(void *pvParameters)\r
-{\r
-       do\r
-       {\r
-               vTaskDelay(100);\r
-       }\r
-       while(!connectedflag);\r
-       //wating for connecting to AP \r
-       \r
-       printf("socket....port=%d\n",DEFAULTPORT);\r
-       sever_socket = socket(AF_INET, SOCK_STREAM, 0);\r
-       if(sever_socket < 0)  \r
-       {\r
-               perror("socket() error:");\r
-               vTaskDelete(NULL);\r
-       }\r
-       sever_addr.sin_family = AF_INET;\r
-       sever_addr.sin_port = htons(DEFAULTPORT);\r
-       sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
-       if(bind(sever_socket,(struct sockaddr*)&sever_addr,sizeof(sever_addr))<0)\r
-       {\r
-               perror("bind() error");\r
-               close(sever_socket);\r
-               vTaskDelete(NULL);\r
-       }\r
-       if(listen(sever_socket,5)<0)\r
-       {\r
-               perror("listen() error");\r
-               close(sever_socket);\r
-               vTaskDelete(NULL);\r
-       }\r
-       connect_soc = accept(sever_socket,(struct sockaddr*)&client_addr,&socklen);\r
-       if(connect_soc<0)\r
-       {\r
-               perror("accept() error");\r
-               close(sever_socket);\r
-               vTaskDelete(NULL);\r
-       }\r
-       /*connection established,now can send/recv*/\r
-       printf("connection established!");\r
-       TaskHandle_t tasksend;\r
-       xTaskCreate(&data_count,"data_count",4096,NULL,5,&tasksend);\r
-\r
-       int pps;\r
-       while(1)\r
-       {\r
-               totle_data=0;\r
-               //calc every 3s \r
-               vTaskDelay(3000/ portTICK_RATE_MS);\r
-               pps=totle_data/3;\r
-#ifdef CONFIG_MODE_TCP_SEND\r
-               printf("tcp send %d byte per sec!\n",pps);\r
-#else\r
-               printf("tcp recv %d byte per sec!\n",pps);\r
-#endif\r
-       } \r
-       vTaskDelete(tasksend);\r
-       close(connect_soc);\r
-       close(sever_socket);\r
-       vTaskDelete(NULL);\r
-}\r
-\r
-\r
-void app_main(void)\r
-{\r
-    nvs_flash_init();\r
-    wifi_init();\r
-    xTaskCreate(&tcp_client,"tcp_client",4096,NULL,5,NULL);\r
-}\r
similarity index 85%
rename from examples/performance/tcp_esp2ap/Makefile
rename to examples/performance/tcp_perf/Makefile
index a4ca46adb340858c77851309987b8292aaf92ed3..03fb85528fa25fae282d6d37720bab82febf4c00 100644 (file)
@@ -3,7 +3,7 @@
 # project subdirectory.
 #
 
-PROJECT_NAME := tcp_esp2ap
+PROJECT_NAME := tcp_perf
 
 include $(IDF_PATH)/make/project.mk
 
diff --git a/examples/performance/tcp_perf/main/Kconfig.projbuild b/examples/performance/tcp_perf/main/Kconfig.projbuild
new file mode 100644 (file)
index 0000000..e5f89d9
--- /dev/null
@@ -0,0 +1,84 @@
+menu "Example Configuration"
+
+choice 
+    prompt "TCP_PERF_MODE "
+       default MODE_TCP_SHIELDBOX
+       help
+               This option performance mode.
+       
+               - for "Performance in shieldbox" setting,it will receive data by tcp.
+               
+               - for "Performance in air" setting, it will send data by tcp.
+
+               - for "Performance in long distance" setting, it will send data by tcp.
+               
+                                       
+config MODE_TCP_SHIELDBOX
+       bool "Performance in shieldbox"
+config MODE_TCP_AIR
+    bool "Performance in air"
+config MODE_TCP_LONG_DISTANCE
+    bool "Performance in long distance"
+endchoice
+
+config TCP_PERF_WIFI_MODE_AP
+    bool "softap mode enable"
+    default n
+    help
+        yes:ESP32 is softap. no:ESP32 is station.
+
+config TCP_PERF_SEVER
+    bool "TCP performance sever enable"
+    default n
+    help
+               yes:ESP32 is TCP sever. no:ESP32 is TCP client.
+
+               We suggest to make this config be same with "Station mode".
+
+config TCP_PERF_TX
+    bool "TCP performance TX test enable"
+    default n
+    help
+        yes:TCP TX test. no:TCP RX test.
+
+config TCP_PERF_DELAY_DEBUG
+    bool "TCP performance delay info enable"
+    default n
+    help
+        Show TCP performance delay info.
+
+               Ignore in TCP RX.
+
+config TCP_PERF_WIFI_SSID
+    string "WiFi SSID"
+    default "tp_wifi_test1"
+    help
+        SSID (network name) for the example to connect to.
+
+config TCP_PERF_WIFI_PASSWORD
+    string "WiFi Password"
+    default "1234567890"
+    help
+        WiFi password (WPA or WPA2) for the example to use.
+
+config TCP_PERF_SEVER_PORT
+       int "TCP sever port"
+       default 4567
+       help 
+               Which will the tcp sever use.
+               
+config TCP_PERF_SERVER_IP
+       string "TCP server ip"
+       default "192.168.4.1" 
+       help
+               IP of TCP server.
+
+               Ignore in TCP sever.
+       
+config TCP_PERF_PKT_SIZE
+       int "Size of TCP packet"
+       default 1460
+       help
+               the data send&recv packet size. 
+
+endmenu
diff --git a/examples/performance/tcp_perf/main/main.c b/examples/performance/tcp_perf/main/main.c
new file mode 100644 (file)
index 0000000..052932f
--- /dev/null
@@ -0,0 +1,109 @@
+
+
+/*
+tcp_perf example
+
+Using this example to test tcp throughput performance.
+esp<->esp or esp<->ap
+
+step1:
+       init wifi as AP/STA using config SSID/PASSWORD.
+
+step2:
+       creat a tcp sever/client socket using config PORT/(IP).
+       if sever: wating for connect.
+       if client connect to sever.
+
+step3:
+       send/receive data to/from each other.
+       if the tcp connect established. esp will send or receive data.
+       you can see the info in com port output.
+
+*/
+
+#include "tcp_perf.h"
+
+int connectedflag = 0;
+int totle_data=0;
+
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
+
+int totle_pack=0;
+int send_success=0;
+int send_fail=0;
+int delay_classify[5]={0};
+
+#endif
+
+//this task establish a TCP connection and receive data from TCP
+static void tcp_conn(void *pvParameters)
+{
+       ESP_LOGI(TAG, "task tcp_conn start.");
+       //wating for connecting to AP
+       do
+       {
+               vTaskDelay(100);
+       }
+       while(!connectedflag);
+       ESP_LOGI(TAG, "sta has connected to ap.");
+
+       //create tcp socket
+       int socret;
+#if ESP_TCP_MODE_SEVER
+       ESP_LOGI(TAG, "creat_tcp_sever.");
+       socret=creat_tcp_sever();
+#else
+       ESP_LOGI(TAG, "creat_tcp_client.");
+       socret=creat_tcp_client();
+#endif
+       if(-1==socret)
+       {
+               ESP_LOGI(TAG, "creat tcp socket error,stop.");
+               vTaskDelete(NULL);
+       }
+
+
+       //create a task to tx/rx data
+       TaskHandle_t tx_rx_task;
+#if ESP_TCP_PERF_TX
+       xTaskCreate(&send_data,"send_data",4096,NULL,4,&tx_rx_task);
+#else
+       xTaskCreate(&recv_data,"recv_data",4096,NULL,4,&tx_rx_task);
+#endif
+       int pps;
+       while(1)
+       {
+               totle_data=0;
+               //calc every 3s
+               vTaskDelay(3000/ portTICK_RATE_MS);
+               pps=totle_data/3;
+#if ESP_TCP_PERF_TX
+               ESP_LOGI(TAG, "tcp send %d byte per sec!",pps);
+#if ESP_TCP_DELAY_INFO
+               ESP_LOGI(TAG, "tcp send packet totle:%d  succeed:%d  failed:%d\n0-30:%d 30-100:%d 100-300:%d 300-1000:%d 1000+:%d\n",
+                               totle_pack,send_success,send_fail,delay_classify[0],delay_classify[1],delay_classify[2],delay_classify[3],delay_classify[
+4]);
+#endif
+#else
+               ESP_LOGI(TAG, "tcp recv %d byte per sec!\n",pps);
+#endif
+       }
+       close_socket();
+       vTaskDelete(tx_rx_task);
+       vTaskDelete(NULL);
+}
+
+
+
+void app_main(void)
+{
+    nvs_flash_init();
+#if ESP_WIFI_MODE_AP
+    ESP_LOGI(TAG, "ESP_WIFI_MODE_AP\n");
+    wifi_init_softap();
+#else
+    ESP_LOGI(TAG, "ESP_WIFI_MODE_STA\n");
+    wifi_init_sta();
+#endif
+    xTaskCreate(&tcp_conn,"tcp_conn",4096,NULL,5,NULL);
+}
diff --git a/examples/performance/tcp_perf/main/tcp_perf.c b/examples/performance/tcp_perf/main/tcp_perf.c
new file mode 100644 (file)
index 0000000..99da7be
--- /dev/null
@@ -0,0 +1,251 @@
+\r
+#include "tcp_perf.h"\r
+\r
+extern int connectedflag;\r
+extern int totle_data;\r
+\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+\r
+extern int totle_pack;\r
+extern int send_success;\r
+extern int send_fail;\r
+extern int delay_classify[5];\r
+\r
+#endif\r
+\r
+/* FreeRTOS event group to signal when we are connected & ready to make a request */\r
+static EventGroupHandle_t wifi_event_group;\r
+/*socket*/\r
+static int sever_socket;\r
+static struct sockaddr_in sever_addr;\r
+static struct sockaddr_in client_addr;\r
+static unsigned int socklen = sizeof(client_addr);\r
+static int connect_soc;\r
+\r
+static esp_err_t event_handler(void *ctx, system_event_t *event)\r
+{\r
+    switch(event->event_id) {\r
+    case SYSTEM_EVENT_STA_START:\r
+        esp_wifi_connect();\r
+        break;\r
+    case SYSTEM_EVENT_STA_DISCONNECTED:\r
+        esp_wifi_connect();\r
+        break;\r
+    case SYSTEM_EVENT_STA_CONNECTED:\r
+        break;\r
+    case SYSTEM_EVENT_STA_GOT_IP:\r
+       ESP_LOGI(TAG, "event_handler:SYSTEM_EVENT_STA_GOT_IP!\n");\r
+       ESP_LOGI(TAG, "ip:%s\n",ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));\r
+        connectedflag=1;\r
+        break;\r
+    case SYSTEM_EVENT_AP_STACONNECTED:\r
+       ESP_LOGI(TAG, "station:"MACSTR" join,AID=%d\n",\r
+                       MAC2STR(event->event_info.sta_connected.mac),\r
+                       event->event_info.sta_connected.aid);\r
+       connectedflag=1;\r
+       break;\r
+    case SYSTEM_EVENT_AP_STADISCONNECTED:\r
+       ESP_LOGI(TAG, "station:"MACSTR"leave,AID=%d\n",\r
+                               MAC2STR(event->event_info.sta_disconnected.mac),\r
+                               event->event_info.sta_disconnected.aid);\r
+       break;\r
+    default:\r
+        break;\r
+    }\r
+    return ESP_OK;\r
+}\r
+\r
+//send data\r
+void send_data(void *pvParameters)\r
+{\r
+       int len=0;\r
+       char databuff[DEFAULT_PKTSIZE];\r
+       memset(databuff,97,DEFAULT_PKTSIZE);\r
+       vTaskDelay(100/portTICK_RATE_MS);\r
+       ESP_LOGI(TAG,"start sending...");\r
+       while(1)\r
+       {\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+               //delaytime\r
+               struct timeval tv_start;\r
+               struct timeval tv_finish;\r
+               unsigned int send_delay_ms;\r
+\r
+               totle_pack++;\r
+               gettimeofday(&tv_start,NULL);\r
+#endif\r
+\r
+               len=send(connect_soc, databuff, DEFAULT_PKTSIZE, 0);\r
+\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+               gettimeofday(&tv_finish,NULL);\r
+#endif\r
+               if(len>0)\r
+               {\r
+                       totle_data+=len;\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+                       send_success++;\r
+                       send_delay_ms=(tv_finish.tv_sec-tv_start.tv_sec)*1000\r
+                                       +(tv_finish.tv_usec-tv_start.tv_usec)/1000;\r
+                       //ESP_LOGI(TAG, "send_delay_ms=%d",send_delay_ms);\r
+                       if(send_delay_ms<30)\r
+                               delay_classify[0]++;\r
+                       else if(send_delay_ms<100)\r
+                               delay_classify[1]++;\r
+                       else if(send_delay_ms<300)\r
+                               delay_classify[2]++;\r
+                       else if(send_delay_ms<1000)\r
+                               delay_classify[3]++;\r
+                       else\r
+                               delay_classify[4]++;\r
+#endif\r
+               }\r
+               else\r
+               {\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+               send_fail++;\r
+#endif\r
+                       /*for faster send&receive,don't show error code.\r
+                        *if it can't work as expectations,unnote the two lines here\r
+                        **/\r
+                       //perror("data_count error");\r
+                       //vTaskDelay(500/portTICK_RATE_MS);\r
+               }\r
+       } \r
+}\r
+//send data\r
+void recv_data(void *pvParameters)\r
+{\r
+       int len=0;\r
+       char databuff[DEFAULT_PKTSIZE];\r
+       while(1)\r
+       {\r
+               len=recv(connect_soc, databuff, DEFAULT_PKTSIZE, 0);\r
+               if(len>0)\r
+               {\r
+                       totle_data+=len;\r
+               }\r
+               else\r
+               {\r
+                       perror("data_count error");\r
+                       vTaskDelay(500/portTICK_RATE_MS);\r
+               }\r
+       }\r
+}\r
+\r
+//use this esp32 as a tcp sever. return 0:success -1:error\r
+int creat_tcp_sever()\r
+{\r
+       ESP_LOGI(TAG, "sever socket....port=%d\n",DEFAULTPORT);\r
+       sever_socket = socket(AF_INET, SOCK_STREAM, 0);\r
+       if(sever_socket < 0)\r
+       {\r
+               perror("socket() error:");\r
+               return -1;\r
+       }\r
+       sever_addr.sin_family = AF_INET;\r
+       sever_addr.sin_port = htons(DEFAULTPORT);\r
+       sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
+       if(bind(sever_socket,(struct sockaddr*)&sever_addr,sizeof(sever_addr))<0)\r
+       {\r
+               perror("bind() error");\r
+               close(sever_socket);\r
+               return -1;\r
+       }\r
+       if(listen(sever_socket,5)<0)\r
+       {\r
+               perror("listen() error");\r
+               close(sever_socket);\r
+               return -1;\r
+       }\r
+       connect_soc = accept(sever_socket,(struct sockaddr*)&client_addr,&socklen);\r
+       if(connect_soc<0)\r
+       {\r
+               perror("accept() error");\r
+               close(sever_socket);\r
+               return -1;\r
+       }\r
+       /*connection established,now can send/recv*/\r
+       ESP_LOGI(TAG, "tcp connection established!");\r
+       return 0;\r
+}\r
+//use this esp32 as a tcp client. return 0:success -1:error\r
+int creat_tcp_client()\r
+{\r
+       ESP_LOGI(TAG, "client socket....severip:port=%s:%d\n",DEFAULTSEVERIP,DEFAULTPORT);\r
+       connect_soc = socket(AF_INET, SOCK_STREAM, 0);\r
+       if(connect_soc < 0)\r
+       {\r
+               perror("socket failed!");\r
+               return -1;\r
+       }\r
+       sever_addr.sin_family = AF_INET;\r
+       sever_addr.sin_port = htons(DEFAULTPORT);\r
+       sever_addr.sin_addr.s_addr = inet_addr(DEFAULTSEVERIP);\r
+       printf("connecting to sever...");\r
+       if(connect(connect_soc, (struct sockaddr *)&sever_addr, sizeof(sever_addr)) < 0)\r
+       {\r
+               perror("connect to sever error!");\r
+               return -1;\r
+       }\r
+       ESP_LOGI(TAG,"connect to sever success!");\r
+       return 0;\r
+}\r
+\r
+//wifi_init_sta\r
+void wifi_init_sta()\r
+{\r
+    tcpip_adapter_init();\r
+    wifi_event_group = xEventGroupCreate();\r
+    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );\r
+\r
+    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\r
+    ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
+    wifi_config_t wifi_config = {\r
+        .sta = {\r
+            .ssid = DEFAULTSSID,\r
+            .password = DEFAULTPWD\r
+        },\r
+    };\r
+\r
+    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );\r
+    ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );\r
+    ESP_ERROR_CHECK( esp_wifi_start() );\r
+\r
+    ESP_LOGI(TAG, "wifi_init_sta finished.");\r
+    ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",DEFAULTSSID,DEFAULTPWD);\r
+}\r
+//wifi_init_softap\r
+void wifi_init_softap()\r
+{\r
+    tcpip_adapter_init();\r
+    wifi_event_group = xEventGroupCreate();\r
+    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );\r
+\r
+    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\r
+    ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
+    wifi_config_t wifi_config = {\r
+        .ap = {\r
+            .ssid = DEFAULTSSID,\r
+            .ssid_len=0,\r
+            .max_connection=MAXSTACONN,\r
+            .password = DEFAULTPWD,\r
+            .authmode=WIFI_AUTH_WPA_WPA2_PSK\r
+        },\r
+    };\r
+\r
+    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );\r
+    ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config) );\r
+    ESP_ERROR_CHECK( esp_wifi_start() );\r
+\r
+    ESP_LOGI(TAG, "wifi_init_softap finished.SSID:%s password:%s \n",DEFAULTSSID,DEFAULTPWD);\r
+}\r
+\r
+void close_socket()\r
+{\r
+       close(connect_soc);\r
+       close(sever_socket);\r
+}\r
+\r
+\r
+\r
diff --git a/examples/performance/tcp_perf/main/tcp_perf.h b/examples/performance/tcp_perf/main/tcp_perf.h
new file mode 100644 (file)
index 0000000..071218a
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef __TCP_PERF_H__
+#define __TCP_PERF_H__
+
+#include <stdio.h>
+#include <string.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_system.h"
+#include "nvs_flash.h"
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "driver/uart.h"
+#include "soc/uart_struct.h"
+#include "esp_log.h"
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*AP info and tcp_sever info*/
+#define DEFAULTSSID CONFIG_TCP_PERF_WIFI_SSID
+#define DEFAULTPWD CONFIG_TCP_PERF_WIFI_PASSWORD
+#define DEFAULTPORT CONFIG_TCP_PERF_SEVER_PORT
+#define DEFAULTSEVERIP CONFIG_TCP_PERF_SERVER_IP
+#define DEFAULT_PKTSIZE CONFIG_TCP_PERF_PKT_SIZE
+#define MAXSTACONN 1 //how many sta can be connected(AP mode)
+/*test options*/
+#define ESP_WIFI_MODE_AP CONFIG_TCP_PERF_WIFI_MODE_AP //TRUE:AP FALSE:STA
+#define ESP_TCP_MODE_SEVER CONFIG_TCP_PERF_SEVER //TRUE:sever FALSE:client
+#define ESP_TCP_PERF_TX CONFIG_TCP_PERF_TX //TRUE:send FALSE:receive
+#define ESP_TCP_DELAY_INFO CONFIG_TCP_PERF_DELAY_DEBUG //TRUE:show delay time info
+
+
+#define TAG "tcp_perf:"
+
+
+
+//using esp as station
+void wifi_init_sta();
+//using esp as softap
+void wifi_init_softap();
+
+//creat a tcp sever socket. return 0:success -1:error
+int creat_tcp_sever();
+//creat a tcp client socket. return 0:success -1:error
+int creat_tcp_client();
+
+//send data task
+void send_data(void *pvParameters);
+//receive data task
+void recv_data(void *pvParameters);
+
+//close all socket
+void close_socket();
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+