# tcp_perf
-This example is used to test tcp throughput and delay time. First you should set options in menuconfig.
+This example is used to test tcp throughput and delay time.
-Steps:
+Step1: Set options in `make menuconfig` like ssid, password, server ip and server port. And choose what the esp32 will work as.
-* Step1: Set a AP and a STA with same SSID & PASSWORD. You can set one esp32 as AP and another esp32 as STA, also you can use Router or wifi adaptor instead one of the them.
+* AP or STA. You can set one esp32 as AP and another esp32 as STA with same ssid & password, also you can use Router or wifi adapter instead of one of these.
-* Step2: Set a tcp client and a sever. Make sure the client has correct sever ip & port so they can get connected. It's okay if you creat a tcp sever & client using PC since one of the wifi device is't esp32.
+* Client or server. Make sure the client has correct server ip & port so they can get connected. It's okay if you create a tcp server & client using PC since one of the wifi device is't esp32.
-* Step3: Set a sender and a receiver. Set one of them sending data and the other receiving.
+* Send or receive. Set one of them sending data and the other receiving.
-* Step4: Save your settings and make bin file downloading to flash.
+Step2: Exit menuconfig, saving the new settings. Then build the app and flash it to the ESP32.
-* Step5: Start test.
-
-Here are some things that might help you do the test easily.
+Step3: Start test. And here are some things that might help you do the test easily.
* You'd better turn on the AP before the STA.
-* The tcp sever should be built before the tcp client.
-* If you use a esp32 as AP, you'd better use it as tcp sever also.
-* Once the tcp connection crashed, esp32 should be restarted to rebuild tcp connection.
+* The tcp server should be started before the tcp client.
+* If you use a esp32 as AP, you'd better use it as tcp server also.
+* Once the tcp connection crashed, esp32 should be restarted to re-establish TCP connection.
-After connection established, TCP sever and TCP client can send data to each other. The result of throughput will show by COM.
+Step4: View the result. After connection established, TCP server and TCP client can send data to each other. The result of throughput will be printed in the serial log.
-Explaining more in [main.c](./tcp_perf/main/main.c).
+See [main.c](./tcp_perf/main/main.c) for full details.
# udp_perf
There's a obvious difference between udp_perf and tcp perf:
-Before formal sending & receiving, a packet will be send from client to sever. So the sever can konw the ip&port of client. Maybe it's easily to use if you set the udp sever as receiver.
+Before formal sending & receiving, a packet will be send from client to server. So the server can know the ip&port of client. It is usually eaiser to set the UDP server as the receiver.
-Explaining more in [main.c](./udp_perf/main/main.c).
+See [main.c](./udp_perf/main/main.c) for full details.
# More
menu "Example Configuration"
#choice
-# prompt "TCP_PERF_MODE "
+# prompt "TCP_PERF_MODE "
# default MODE_TCP_SHIELDBOX
# help
# This option set performance mode.
# bool "Performance in long distance"
#endchoice
+choice TCP_PERF_WIFI_MODE
+ prompt "AP or STA"
+ default TCP_PERF_ESP_IS_STATION
+ help
+ Whether the esp32 is softAP or station.
+
+config TCP_PERF_ESP_IS_SOFTAP
+ bool "SoftAP"
+config TCP_PERF_ESP_IS_STATION
+ bool "Station"
+endchoice
+
config TCP_PERF_WIFI_MODE_AP
- bool "softap mode enable"
- default n
- help
- yes:ESP32 is softap. no:ESP32 is station.
+ bool
+ default y if TCP_PERF_ESP_IS_SOFTAP
+ default n if TCP_PERF_ESP_IS_STATION
-config TCP_PERF_SEVER
- bool "TCP performance sever enable"
- default n
- help
- yes:ESP32 is TCP sever. no:ESP32 is TCP client.
+choice TCP_PERF_SERVER_CLIENT
+ prompt "server or client"
+ default TCP_PERF_ESP_IS_CLIENT
+ help
+ Whether the esp32 is tcp server or client.
- We suggest to make this config be same with "Station mode".
+ We suggest to choose "client" if you choose "station" in "wifi mode".
+
+config TCP_PERF_ESP_IS_SERVER
+ bool "server"
+config TCP_PERF_ESP_IS_CLIENT
+ bool "client"
+endchoice
+
+config TCP_PERF_SERVER
+ bool
+ default y if TCP_PERF_ESP_IS_SERVER
+ default n if TCP_PERF_ESP_IS_CLIENT
+
+choice TCP_PERF_TX_RX
+ prompt "send or receive"
+ default TCP_PERF_ESP_RECV
+ help
+ Whether the esp32 will send or receive.
+
+config TCP_PERF_ESP_SEND
+ bool "send"
+config TCP_PERF_ESP_RECV
+ bool "receive"
+endchoice
config TCP_PERF_TX
- bool "TCP performance TX test enable"
- default n
- help
- yes:TCP TX test. no:TCP RX test.
+ bool
+ default y if TCP_PERF_ESP_SEND
+ default n if TCP_PERF_ESP_RECV
config TCP_PERF_DELAY_DEBUG
bool "TCP performance delay info enable"
- default n
- help
- Show TCP performance delay info.
+ depends on TCP_PERF_TX
+ default n
+ help
+ Show TCP performance delay info.
- Ignore in TCP RX.
+ Ignore in TCP RX.
config TCP_PERF_WIFI_SSID
string "WiFi SSID"
- default "esp_wifi_test1"
- help
- SSID (network name) for the example to connect to.
+ default "esp_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.
+ 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_PORT
+ int "TCP server port"
+ default 4567
+ help
+ Which will the tcp server use.
config TCP_PERF_SERVER_IP
string "TCP server ip"
- default "192.168.4.1"
- help
- IP of TCP server.
+ default "192.168.4.1"
+ help
+ IP of TCP server.
- Ignore in TCP sever.
+ Ignore in TCP server.
config TCP_PERF_PKT_SIZE
int "Size of TCP packet"
- default 1460
- help
- the data send&recv packet size.
+ default 1460
+ help
+ the data send&recv packet size.
endmenu
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.
+ create a tcp server/client socket using config PORT/(IP).
+ if server: wating for connect.
+ if client connect to server.
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.
+ you can see the info in serial output.
*/
#include <errno.h>
#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 /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
//this task establish a TCP connection and receive data from TCP
static void tcp_conn(void *pvParameters)
ESP_LOGI(TAG, "sta has connected to ap.");
/*create tcp socket*/
- int socret;
+ int socket_ret;
-#if ESP_TCP_MODE_SEVER
+#if ESP_TCP_MODE_SERVER
vTaskDelay(3000 / portTICK_RATE_MS);
- ESP_LOGI(TAG, "creat_tcp_sever.");
- socret=creat_tcp_sever();
-#else /*ESP_TCP_MODE_SEVER*/
+ ESP_LOGI(TAG, "create_tcp_server.");
+ socket_ret=create_tcp_server();
+#else /*ESP_TCP_MODE_SERVER*/
vTaskDelay(20000 / portTICK_RATE_MS);
- ESP_LOGI(TAG, "creat_tcp_client.");
- socret = creat_tcp_client();
+ ESP_LOGI(TAG, "create_tcp_client.");
+ socket_ret = create_tcp_client();
#endif
- if(ESP_FAIL == socret) {
- ESP_LOGI(TAG, "creat tcp socket error,stop.");
+ if(ESP_FAIL == socket_ret) {
+ ESP_LOGI(TAG, "create tcp socket error,stop.");
vTaskDelete(NULL);
}
#endif
int pps;
while (1) {
- totle_data = 0;
+ total_data = 0;
vTaskDelay(3000 / portTICK_RATE_MS);//every 3s
- pps = totle_data / 3;
- if (totle_data <= 0) {
+ pps = total_data / 3;
+ if (total_data <= 0) {
int err_ret = check_socket_error_code();
if (err_ret == ECONNRESET) {
ESP_LOGI(TAG, "disconnected... stop.");
#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\n"
+ ESP_LOGI(TAG, "tcp send packet total:%d succeed:%d failed:%d\n"
"time(ms):0-30:%d 30-100:%d 100-300:%d 300-1000:%d 1000+:%d\n",
- totle_pack, send_success, send_fail, delay_classify[0],
+ total_pack, send_success, send_fail, delay_classify[0],
delay_classify[1], delay_classify[2], delay_classify[3], delay_classify[4]);
#endif /*ESP_TCP_DELAY_INFO*/
#else
-\r
+// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
\r
#include <string.h>\r
#include <sys/socket.h>\r
#include "tcp_perf.h"\r
\r
/*socket*/\r
-static int sever_socket = 0;\r
-static struct sockaddr_in sever_addr;\r
+static int server_socket = 0;\r
+static struct sockaddr_in server_addr;\r
static struct sockaddr_in client_addr;\r
static unsigned int socklen = sizeof(client_addr);\r
-static int connect_soc = 0;\r
+static int connect_socket = 0;\r
+\r
+int connectedflag = 0;\r
+int total_data = 0;\r
+\r
+#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+\r
+int total_pack = 0;\r
+int send_success = 0;\r
+int send_fail = 0;\r
+int delay_classify[5] = { 0 };\r
+\r
+#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
+\r
\r
static esp_err_t event_handler(void *ctx, system_event_t *event)\r
{\r
while(1) {\r
\r
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
- //vTaskDelay(1000/portTICK_RATE_MS);\r
- totle_pack++;\r
+ total_pack++;\r
gettimeofday(&tv_start, NULL);\r
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
\r
//send function\r
- len = send(connect_soc, databuff, DEFAULT_PKTSIZE, 0);\r
+ len = send(connect_socket, databuff, DEFAULT_PKTSIZE, 0);\r
\r
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
gettimeofday(&tv_finish, NULL);\r
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
if(len > 0) {\r
- totle_data += len;\r
+ total_data += len;\r
\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=%ld",send_delay_ms);\r
if(send_delay_ms < 30)\r
delay_classify[0]++;\r
else if(send_delay_ms < 100)\r
send_fail++;\r
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
\r
- /*for faster sending,don't show error code\r
- *if it can't work as expectations,unnote the two lines here\r
+ /*Most of the error code will be send window full.\r
+ *So, for faster sending,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
+ //show_socket_error_code(connect_socket);\r
//vTaskDelay(500/portTICK_RATE_MS);\r
}\r
} \r
int len = 0;\r
char databuff[DEFAULT_PKTSIZE];\r
while (1) {\r
- len = recv(connect_soc, databuff, DEFAULT_PKTSIZE, 0);\r
+ len = recv(connect_socket, databuff, DEFAULT_PKTSIZE, 0);\r
if (len > 0) {\r
- totle_data += len;\r
+ total_data += len;\r
}\r
else {\r
- show_socket_error_code(connect_soc);\r
+ show_socket_error_code(connect_socket);\r
vTaskDelay(500 / portTICK_RATE_MS);\r
}\r
}\r
}\r
\r
\r
-//use this esp32 as a tcp sever. return ESP_OK:success ESP_FAIL:error\r
-int creat_tcp_sever()\r
+//use this esp32 as a tcp server. return ESP_OK:success ESP_FAIL:error\r
+esp_err_t create_tcp_server()\r
{\r
- ESP_LOGI(TAG, "sever socket....port=%d\n", DEFAULT_PORT);\r
- sever_socket = socket(AF_INET, SOCK_STREAM, 0);\r
- if (sever_socket < 0) {\r
- show_socket_error_code(sever_socket);\r
- //perror("socket() error:");\r
+ ESP_LOGI(TAG, "server socket....port=%d\n", DEFAULT_PORT);\r
+ server_socket = socket(AF_INET, SOCK_STREAM, 0);\r
+ if (server_socket < 0) {\r
+ show_socket_error_code(server_socket);\r
return ESP_FAIL;\r
}\r
- sever_addr.sin_family = AF_INET;\r
- sever_addr.sin_port = htons(DEFAULT_PORT);\r
- sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
- if (bind(sever_socket, (struct sockaddr*)&sever_addr, sizeof(sever_addr)) < 0) {\r
- show_socket_error_code(sever_socket);\r
- //perror("bind() error");\r
- close(sever_socket);\r
+ server_addr.sin_family = AF_INET;\r
+ server_addr.sin_port = htons(DEFAULT_PORT);\r
+ server_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
+ if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {\r
+ show_socket_error_code(server_socket);\r
+ close(server_socket);\r
return ESP_FAIL;\r
}\r
- if (listen(sever_socket, 5) < 0) {\r
- show_socket_error_code(sever_socket);\r
- //perror("listen() error");\r
- close(sever_socket);\r
+ if (listen(server_socket, 5) < 0) {\r
+ show_socket_error_code(server_socket);\r
+ close(server_socket);\r
return ESP_FAIL;\r
}\r
- connect_soc = accept(sever_socket, (struct sockaddr*)&client_addr, &socklen);\r
- if (connect_soc<0) {\r
- show_socket_error_code(connect_soc);\r
- //perror("accept() error");\r
- close(sever_socket);\r
+ connect_socket = accept(server_socket, (struct sockaddr*)&client_addr, &socklen);\r
+ if (connect_socket<0) {\r
+ show_socket_error_code(connect_socket);\r
+ close(server_socket);\r
return ESP_FAIL;\r
}\r
/*connection established,now can send/recv*/\r
return ESP_OK;\r
}\r
//use this esp32 as a tcp client. return ESP_OK:success ESP_FAIL:error\r
-int creat_tcp_client()\r
+esp_err_t create_tcp_client()\r
{\r
- ESP_LOGI(TAG, "client socket....severip:port=%s:%d\n", \r
- DEFAULT_SEVER_IP, DEFAULT_PORT);\r
- connect_soc = socket(AF_INET, SOCK_STREAM, 0);\r
- if (connect_soc < 0) {\r
- show_socket_error_code(connect_soc);\r
- //perror("socket failed!");\r
+ ESP_LOGI(TAG, "client socket....serverip:port=%s:%d\n", \r
+ DEFAULT_SERVER_IP, DEFAULT_PORT);\r
+ connect_socket = socket(AF_INET, SOCK_STREAM, 0);\r
+ if (connect_socket < 0) {\r
+ show_socket_error_code(connect_socket);\r
return ESP_FAIL;\r
}\r
- sever_addr.sin_family = AF_INET;\r
- sever_addr.sin_port = htons(DEFAULT_PORT);\r
- sever_addr.sin_addr.s_addr = inet_addr(DEFAULT_SEVER_IP);\r
- ESP_LOGI(TAG, "connecting to sever...");\r
- if (connect(connect_soc, (struct sockaddr *)&sever_addr, sizeof(sever_addr)) < 0) {\r
- show_socket_error_code(connect_soc);\r
- //perror("connect to sever error!");\r
+ server_addr.sin_family = AF_INET;\r
+ server_addr.sin_port = htons(DEFAULT_PORT);\r
+ server_addr.sin_addr.s_addr = inet_addr(DEFAULT_SERVER_IP);\r
+ ESP_LOGI(TAG, "connecting to server...");\r
+ if (connect(connect_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {\r
+ show_socket_error_code(connect_socket);\r
return ESP_FAIL;\r
}\r
- ESP_LOGI(TAG, "connect to sever success!");\r
+ ESP_LOGI(TAG, "connect to server success!");\r
return ESP_OK;\r
}\r
\r
\r
char* tcpip_get_reason(int err)\r
{\r
- switch (err) {\r
+ switch (err) {\r
case 0:\r
- return "reason: other reason";\r
+ return "reason: other reason";\r
case ENOMEM:\r
- return "reason: out of memory";\r
+ return "reason: out of memory";\r
case ENOBUFS:\r
- return "reason: buffer error";\r
+ return "reason: buffer error";\r
case EWOULDBLOCK:\r
- return "reason: timeout, try again";\r
+ return "reason: timeout, try again";\r
case EHOSTUNREACH:\r
- return "reason: routing problem";\r
+ return "reason: routing problem";\r
case EINPROGRESS:\r
- return "reason: operation in progress";\r
+ return "reason: operation in progress";\r
case EINVAL:\r
- return "reason: invalid value";\r
+ return "reason: invalid value";\r
case EADDRINUSE:\r
- return "reason: address in use";\r
+ return "reason: address in use";\r
case EALREADY:\r
- return "reason: conn already connected";\r
+ return "reason: conn already connected";\r
case EISCONN:\r
- return "reason: conn already established";\r
+ return "reason: conn already established";\r
case ECONNABORTED:\r
- return "reason: connection aborted";\r
+ return "reason: connection aborted";\r
case ECONNRESET:\r
- return "reason: connection is reset";\r
+ return "reason: connection is reset";\r
case ENOTCONN:\r
- return "reason: connection closed";\r
+ return "reason: connection closed";\r
case EIO:\r
- return "reason: invalid argument";\r
+ return "reason: invalid argument";\r
case -1:\r
- return "reason: low level netif error";\r
+ return "reason: low level netif error";\r
default:\r
- return "reason not found";\r
- }\r
+ return "reason not found";\r
+ }\r
}\r
\r
-int show_socket_error_code(int soc)\r
+int show_socket_error_code(int socket)\r
{\r
- int result;\r
+ int result;\r
u32_t optlen = sizeof(int);\r
- getsockopt(soc, SOL_SOCKET, SO_ERROR, &result, &optlen);\r
- ESP_LOGI(TAG, "soc error %d reason: %s", result, tcpip_get_reason(result));\r
+ getsockopt(socket, SOL_SOCKET, SO_ERROR, &result, &optlen);\r
+ ESP_LOGI(TAG, "socket error %d reason: %s", result, tcpip_get_reason(result));\r
return result;\r
}\r
\r
int check_socket_error_code()\r
{\r
- int ret;\r
-#if ESP_TCP_MODE_SEVER\r
- ESP_LOGI(TAG, "check sever_socket sever_socket");\r
- ret = show_socket_error_code(sever_socket);\r
- if(ret == ECONNRESET)\r
- return ret;\r
+ int ret;\r
+#if ESP_TCP_MODE_SERVER\r
+ ESP_LOGI(TAG, "check server_socket");\r
+ ret = show_socket_error_code(server_socket);\r
+ if(ret == ECONNRESET)\r
+ return ret;\r
#endif\r
- ESP_LOGI(TAG, "check sever_socket connect_soc");\r
- ret = show_socket_error_code(connect_soc);\r
- if(ret == ECONNRESET)\r
- return ret;\r
- return 0;\r
+ ESP_LOGI(TAG, "check connect_socket");\r
+ ret = show_socket_error_code(connect_socket);\r
+ if(ret == ECONNRESET)\r
+ return ret;\r
+ return 0;\r
}\r
\r
void close_socket()\r
{\r
- close(connect_soc);\r
- close(sever_socket);\r
+ close(connect_socket);\r
+ close(server_socket);\r
}\r
\r
\r
-\r
extern "C" {
#endif
-/*AP info and tcp_sever info*/
+/*AP info and tcp_server info*/
#define DEFAULT_SSID CONFIG_TCP_PERF_WIFI_SSID
#define DEFAULT_PWD CONFIG_TCP_PERF_WIFI_PASSWORD
-#define DEFAULT_PORT CONFIG_TCP_PERF_SEVER_PORT
-#define DEFAULT_SEVER_IP CONFIG_TCP_PERF_SERVER_IP
+#define DEFAULT_PORT CONFIG_TCP_PERF_SERVER_PORT
+#define DEFAULT_SERVER_IP CONFIG_TCP_PERF_SERVER_IP
#define DEFAULT_PKTSIZE CONFIG_TCP_PERF_PKT_SIZE
#define MAX_STA_CONN 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_MODE_SERVER CONFIG_TCP_PERF_SERVER //TRUE:server 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
extern int connectedflag;
-extern int totle_data;
+extern int total_data;
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
-extern int totle_pack;
+extern int total_pack;
extern int send_success;
extern int send_fail;
extern int delay_classify[5];
//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();
+//create a tcp server socket. return ESP_OK:success ESP_FAIL:error
+esp_err_t create_tcp_server();
+//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);
void close_socket();
//show socket error code. return: error code
-int show_socket_error_code(int soc);
+int show_socket_error_code(int socket);
//check working socket
int check_socket_error_code();
menu "Example Configuration"
#choice
-# prompt "TCP_PERF_MODE "
-# default MODE_TCP_SHIELDBOX
+# prompt "UDP_PERF_MODE "
+# default MODE_UDP_SHIELDBOX
# help
# This option set performance mode.
#
# bool "Performance in long distance"
#endchoice
#
+
+choice UDP_PERF_WIFI_MODE
+ prompt "AP or STA"
+ default UDP_PERF_ESP_IS_STATION
+ help
+ Whether the esp32 is softAP or station.
+
+config UDP_PERF_ESP_IS_SOFTAP
+ bool "SoftAP"
+config UDP_PERF_ESP_IS_STATION
+ bool "Station"
+endchoice
+
config UDP_PERF_WIFI_MODE_AP
- bool "softap mode enable"
- default n
- help
- yes:ESP32 is softap. no:ESP32 is station.
+ bool
+ default y if UDP_PERF_ESP_IS_SOFTAP
+ default n if UDP_PERF_ESP_IS_STATION
-config UDP_PERF_SEVER
- bool "TCP performance sever enable"
- default y
- help
- yes:ESP32 is UDP sever. no:ESP32 is UDP client.
+choice UDP_PERF_SERVER_CLIENT
+ prompt "server or client"
+ default UDP_PERF_ESP_IS_CLIENT
+ help
+ Whether the esp32 is tcp server or client.
- We suggest to make this config be same with "Station mode".
+ We suggest to choose "client" if you choose "station" in "wifi mode".
+
+config UDP_PERF_ESP_IS_SERVER
+ bool "server"
+config UDP_PERF_ESP_IS_CLIENT
+ bool "client"
+endchoice
+
+config UDP_PERF_SERVER
+ bool
+ default y if UDP_PERF_ESP_IS_SERVER
+ default n if UDP_PERF_ESP_IS_CLIENT
+
+choice UDP_PERF_TX_RX
+ prompt "send or receive"
+ default UDP_PERF_ESP_RECV
+ help
+ Whether the esp32 will send or receive.
+
+config UDP_PERF_ESP_SEND
+ bool "send"
+config UDP_PERF_ESP_RECV
+ bool "receive"
+endchoice
config UDP_PERF_TX
- bool "UDP performance TX test enable"
- default n
- help
- yes:UDP TX test. no:UDP RX test.
+ bool
+ default y if UDP_PERF_ESP_SEND
+ default n if UDP_PERF_ESP_RECV
+
config UDP_PERF_WIFI_SSID
string "WiFi SSID"
help
WiFi password (WPA or WPA2) for the example to use.
-config UDP_PERF_SEVER_PORT
- int "UDP sever port"
+config UDP_PERF_SERVER_PORT
+ int "UDP server port"
default 4567
help
- Which will the udp sever use.
+ Which will the udp server use.
config UDP_PERF_SERVER_IP
string "UDP server ip"
help
IP of UDP server.
- Ignore in UDP sever.
+ Ignore in UDP server.
config UDP_PERF_PKT_SIZE
int "Size of UDP packet"
init wifi as AP/STA using config SSID/PASSWORD.
step2:
- creat a udp sever/client socket using config PORT/(IP).
- if sever: wating for the first message of client.
- if client: sending a packet to sever first.
+ create a udp server/client socket using config PORT/(IP).
+ if server: wating for the first message of client.
+ if client: sending a packet to server first.
step3:
send/receive data to/from each other.
- you can see the info in com port output.
+ you can see the info in serial output.
*/
+
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "udp_perf.h"
-int connectedflag = 0;
-int totle_data = 0;
-int success_pack = 0;
//this task establish a UDP connection and receive data from UDP
static void udp_conn(void *pvParameters)
ESP_LOGI(TAG, "sta has connected to ap.");
/*create udp socket*/
- int socret;
+ int socket_ret;
-#if ESP_UDP_MODE_SEVER
+#if ESP_UDP_MODE_SERVER
vTaskDelay(3000 / portTICK_RATE_MS);
- ESP_LOGI(TAG, "creat_udp_sever.");
- socret=creat_udp_sever();
- //vTaskDelay(1000/portTICK_RATE_MS);
-#else /*ESP_UDP_MODE_SEVER*/
+ ESP_LOGI(TAG, "create_udp_server.");
+ socket_ret=create_udp_server();
+#else /*ESP_UDP_MODE_SERVER*/
vTaskDelay(20000 / portTICK_RATE_MS);
- ESP_LOGI(TAG, "creat_udp_client.");
- socret = creat_udp_client();
+ ESP_LOGI(TAG, "create_udp_client.");
+ socket_ret = create_udp_client();
#endif
- if(ESP_FAIL == socret) {
- ESP_LOGI(TAG, "creat udp socket error,stop.");
+ if(ESP_FAIL == socket_ret) {
+ ESP_LOGI(TAG, "create udp socket error,stop.");
vTaskDelete(NULL);
}
int pps;
while (1) {
- totle_data = 0;
+ total_data = 0;
vTaskDelay(3000 / portTICK_RATE_MS);//every 3s
- pps = totle_data / 3;
+ pps = total_data / 3;
#if ESP_UDP_PERF_TX
- ESP_LOGI(TAG, "udp send %d byte per sec! totle pack: %d \n", pps, success_pack);
+ ESP_LOGI(TAG, "udp send %d byte per sec! total pack: %d \n", pps, success_pack);
#else
- ESP_LOGI(TAG, "udp recv %d byte per sec! totle pack: %d \n", pps, success_pack);
+ ESP_LOGI(TAG, "udp recv %d byte per sec! total pack: %d \n", pps, success_pack);
#endif /*ESP_UDP_PERF_TX*/
}
close_socket();
+// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
\r
#include <string.h>\r
#include <sys/socket.h>\r
static struct sockaddr_in remote_addr;\r
static unsigned int socklen;\r
\r
+int connectedflag = 0;\r
+int total_data = 0;\r
+int success_pack = 0;\r
+\r
\r
static esp_err_t event_handler(void *ctx, system_event_t *event)\r
{\r
DEFAULT_SSID, DEFAULT_PWD);\r
}\r
\r
-//creat a udp sever socket. return ESP_OK:success ESP_FAIL:error\r
-int creat_udp_sever()\r
+//create a udp server socket. return ESP_OK:success ESP_FAIL:error\r
+esp_err_t create_udp_server()\r
{\r
- ESP_LOGI(TAG, "creat_udp_sever()");\r
+ ESP_LOGI(TAG, "create_udp_server()");\r
mysocket = socket(AF_INET, SOCK_DGRAM, 0);\r
if (mysocket < 0) {\r
- perror("socket failed:");\r
+ show_socket_error_code(mysocket);\r
return ESP_FAIL;\r
}\r
- struct sockaddr_in sever_addr;\r
- sever_addr.sin_family = AF_INET;\r
- sever_addr.sin_port = htons(DEFAULT_PORT);\r
- sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
- if (bind(mysocket, (struct sockaddr *)&sever_addr, sizeof(sever_addr)) < 0) {\r
- perror("bind local port error:");\r
+ struct sockaddr_in server_addr;\r
+ server_addr.sin_family = AF_INET;\r
+ server_addr.sin_port = htons(DEFAULT_PORT);\r
+ server_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
+ if (bind(mysocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {\r
+ show_socket_error_code(mysocket);\r
close(mysocket);\r
return ESP_FAIL;\r
}\r
return ESP_OK;\r
}\r
\r
-//creat a udp client socket. return ESP_OK:success ESP_FAIL:error\r
-int creat_udp_client()\r
+//create a udp client socket. return ESP_OK:success ESP_FAIL:error\r
+esp_err_t create_udp_client()\r
{\r
- ESP_LOGI(TAG, "creat_udp_client()");\r
+ ESP_LOGI(TAG, "create_udp_client()");\r
mysocket = socket(AF_INET, SOCK_DGRAM, 0);\r
if (mysocket < 0) {\r
- perror("socket failed:");\r
+ show_socket_error_code(mysocket);\r
return ESP_FAIL;\r
}\r
- /*for client remote_addr is also sever_addr*/\r
+ /*for client remote_addr is also server_addr*/\r
remote_addr.sin_family = AF_INET;\r
remote_addr.sin_port = htons(DEFAULT_PORT);\r
- remote_addr.sin_addr.s_addr = inet_addr(DEFAULT_SEVER_IP);\r
+ remote_addr.sin_addr.s_addr = inet_addr(DEFAULT_SERVER_IP);\r
\r
return ESP_OK;\r
}\r
/*send&receive first packet*/\r
socklen = sizeof(remote_addr);\r
memset(databuff, PACK_BYTE_IS, DEFAULT_PKTSIZE);\r
-#if ESP_UDP_MODE_SEVER\r
+#if ESP_UDP_MODE_SERVER\r
ESP_LOGI(TAG, "first recvfrom:");\r
len = recvfrom(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
#else\r
ESP_LOGI(TAG, "transfer data with %s:%u\n",\r
inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port));\r
} else {\r
- perror("first recv&send error:");\r
+ show_socket_error_code(mysocket);\r
close(mysocket);\r
vTaskDelete(NULL);\r
}\r
#else\r
len = recvfrom(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
#endif\r
- //printf("%d\n",len);\r
- //vTaskDelay(100/portTICK_RATE_MS);\r
if (len > 0) {\r
- totle_data += len;\r
+ total_data += len;\r
success_pack++;\r
} else {\r
- //perror("data_count:\n");\r
+ //show_socket_error_code(mysocket);\r
/*you'd better turn off watch dog in menuconfig\r
*Component config->ESP32-specific->Task watchdog.\r
**/\r
}\r
\r
\r
+char* tcpip_get_reason(int err)\r
+{\r
+ switch (err) {\r
+ case 0:\r
+ return "reason: other reason";\r
+ case ENOMEM:\r
+ return "reason: out of memory";\r
+ case ENOBUFS:\r
+ return "reason: buffer error";\r
+ case EWOULDBLOCK:\r
+ return "reason: timeout, try again";\r
+ case EHOSTUNREACH:\r
+ return "reason: routing problem";\r
+ case EINPROGRESS:\r
+ return "reason: operation in progress";\r
+ case EINVAL:\r
+ return "reason: invalid value";\r
+ case EADDRINUSE:\r
+ return "reason: address in use";\r
+ case EALREADY:\r
+ return "reason: conn already connected";\r
+ case EISCONN:\r
+ return "reason: conn already established";\r
+ case ECONNABORTED:\r
+ return "reason: connection aborted";\r
+ case ECONNRESET:\r
+ return "reason: connection is reset";\r
+ case ENOTCONN:\r
+ return "reason: connection closed";\r
+ case EIO:\r
+ return "reason: invalid argument";\r
+ case -1:\r
+ return "reason: low level netif error";\r
+ default:\r
+ return "reason not found";\r
+ }\r
+}\r
+\r
+int show_socket_error_code(int socket)\r
+{\r
+ int result;\r
+ u32_t optlen = sizeof(int);\r
+ getsockopt(socket, SOL_SOCKET, SO_ERROR, &result, &optlen);\r
+ ESP_LOGI(TAG, "socket error %d reason: %s", result, tcpip_get_reason(result));\r
+ return result;\r
+}\r
+\r
+\r
void close_socket()\r
{\r
close(mysocket);\r
extern "C" {
#endif
-/*AP info and tcp_sever info*/
+/*AP info and tcp_server info*/
#define DEFAULT_SSID CONFIG_UDP_PERF_WIFI_SSID
#define DEFAULT_PWD CONFIG_UDP_PERF_WIFI_PASSWORD
-#define DEFAULT_PORT CONFIG_UDP_PERF_SEVER_PORT
-#define DEFAULT_SEVER_IP CONFIG_UDP_PERF_SERVER_IP
+#define DEFAULT_PORT CONFIG_UDP_PERF_SERVER_PORT
+#define DEFAULT_SERVER_IP CONFIG_UDP_PERF_SERVER_IP
#define DEFAULT_PKTSIZE CONFIG_UDP_PERF_PKT_SIZE
#define MAX_STA_CONN 1 //how many sta can be connected(AP mode)
/*test options*/
#define ESP_WIFI_MODE_AP CONFIG_UDP_PERF_WIFI_MODE_AP //TRUE:AP FALSE:STA
-#define ESP_UDP_MODE_SEVER CONFIG_UDP_PERF_SEVER //TRUE:sever FALSE:client
+#define ESP_UDP_MODE_SERVER CONFIG_UDP_PERF_SERVER //TRUE:server FALSE:client
#define ESP_UDP_PERF_TX CONFIG_UDP_PERF_TX //TRUE:send FALSE:receive
#define PACK_BYTE_IS 97 //'a'
extern int connectedflag;
-extern int totle_data;
+extern int total_data;
extern int success_pack;
//using esp as softap
void wifi_init_softap();
-//creat a udp sever socket. return 0:success -1:error
-int creat_udp_sever();
-//creat a udp client socket. return 0:success -1:error
-int creat_udp_client();
+//create a udp server socket. return ESP_OK:success ESP_FAIL:error
+esp_err_t create_udp_server();
+//create a udp client socket. return ESP_OK:success ESP_FAIL:error
+esp_err_t create_udp_client();
//send or recv data task
void send_recv_data(void *pvParameters);
+//show socket error code. return: error code
+int show_socket_error_code(int socket);
+
//close all socket
void close_socket();