config TCP_PERF_SERVER_IP
string "TCP server ip"
+ depends on TCP_PERF_ESP_IS_CLIENT
default "192.168.4.1"
help
IP of TCP server.
+/* 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 <errno.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#include "freertos/event_groups.h"
#include "esp_log.h"
#include "esp_err.h"
//this task establish a TCP connection and receive data from TCP
static void tcp_conn(void *pvParameters)
{
- ESP_LOGI(TAG, "task tcp_conn start.");
+ ESP_LOGI(TAG, "task tcp_conn.");
/*wating for connecting to AP*/
- do
- {
- vTaskDelay(100);
- }
- while (!connectedflag);
+ xEventGroupWaitBits(tcp_event_group, WIFI_CONNECTED_BIT,false, true, portMAX_DELAY);
+
ESP_LOGI(TAG, "sta has connected to ap.");
/*create tcp socket*/
int socket_ret;
-#if ESP_TCP_MODE_SERVER
+#if EXAMPLE_ESP_TCP_MODE_SERVER
+ ESP_LOGI(TAG, "tcp_server will start after 3s...");
vTaskDelay(3000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_tcp_server.");
socket_ret=create_tcp_server();
-#else /*ESP_TCP_MODE_SERVER*/
+#else /*EXAMPLE_ESP_TCP_MODE_SERVER*/
+ ESP_LOGI(TAG, "tcp_client will start after 20s...");
vTaskDelay(20000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_tcp_client.");
socket_ret = create_tcp_client();
#endif
- if(ESP_FAIL == socket_ret) {
+ if(socket_ret == ESP_FAIL) {
ESP_LOGI(TAG, "create tcp socket error,stop.");
vTaskDelete(NULL);
}
/*create a task to tx/rx data*/
TaskHandle_t tx_rx_task;
-#if ESP_TCP_PERF_TX
+#if EXAMPLE_ESP_TCP_PERF_TX
xTaskCreate(&send_data, "send_data", 4096, NULL, 4, &tx_rx_task);
-#else /*ESP_TCP_PERF_TX*/
+#else /*EXAMPLE_ESP_TCP_PERF_TX*/
xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task);
#endif
- int pps;
+ int bps;
while (1) {
total_data = 0;
vTaskDelay(3000 / portTICK_RATE_MS);//every 3s
- pps = total_data / 3;
+ bps = total_data / 3;
if (total_data <= 0) {
- int err_ret = check_socket_error_code();
- if (err_ret == ECONNRESET) {
- ESP_LOGI(TAG, "disconnected... stop.");
+ int err_ret = check_working_socket();
+ if (err_ret == ECONNRESET || ECONNABORTED) {
+ ESP_LOGW(TAG, "tcp disconnected... stop.\n");
break;
}
}
-#if ESP_TCP_PERF_TX
- ESP_LOGI(TAG, "tcp send %d byte per sec!", pps);
-#if ESP_TCP_DELAY_INFO
+#if EXAMPLE_ESP_TCP_PERF_TX
+ ESP_LOGI(TAG, "tcp send %d byte per sec!", bps);
+#if EXAMPLE_ESP_TCP_DELAY_INFO
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",
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*/
+#endif /*EXAMPLE_ESP_TCP_DELAY_INFO*/
#else
- ESP_LOGI(TAG, "tcp recv %d byte per sec!\n", pps);
-#endif /*ESP_TCP_PERF_TX*/
+ ESP_LOGI(TAG, "tcp recv %d byte per sec!\n", bps);
+#endif /*EXAMPLE_ESP_TCP_PERF_TX*/
}
close_socket();
vTaskDelete(tx_rx_task);
void app_main(void)
{
-#if ESP_WIFI_MODE_AP
- ESP_LOGI(TAG, "ESP_WIFI_MODE_AP\n");
+#if EXAMPLE_ESP_WIFI_MODE_AP
+ ESP_LOGI(TAG, "EXAMPLE_ESP_WIFI_MODE_AP");
wifi_init_softap();
-#else /*ESP_WIFI_MODE_AP*/
- ESP_LOGI(TAG, "ESP_WIFI_MODE_STA\n");
+#else
+ ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
-#endif
+#endif /*EXAMPLE_ESP_WIFI_MODE_AP*/
xTaskCreate(&tcp_conn, "tcp_conn", 4096, NULL, 5, NULL);
}
-// 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
+/* tcp_perf Example\r
+\r
+ This example code is in the Public Domain (or CC0 licensed, at your option.)\r
+\r
+ Unless required by applicable law or agreed to in writing, this\r
+ software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\r
+ CONDITIONS OF ANY KIND, either express or implied.\r
+*/\r
\r
#include <string.h>\r
#include <sys/socket.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_log.h"\r
\r
#include "tcp_perf.h"\r
\r
+\r
+/* FreeRTOS event group to signal when we are connected to wifi */\r
+EventGroupHandle_t tcp_event_group;\r
+\r
/*socket*/\r
static int server_socket = 0;\r
static struct sockaddr_in server_addr;\r
static unsigned int socklen = sizeof(client_addr);\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
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_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
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
+\r
+\r
\r
\r
static esp_err_t event_handler(void *ctx, system_event_t *event)\r
break;\r
case SYSTEM_EVENT_STA_DISCONNECTED:\r
esp_wifi_connect();\r
+ xEventGroupClearBits(tcp_event_group, WIFI_CONNECTED_BIT);\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!");\r
ESP_LOGI(TAG, "got ip:%s\n",\r
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));\r
- connectedflag = 1;\r
+ xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);\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
+ xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);\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
- connectedflag = 0;\r
+ xEventGroupClearBits(tcp_event_group, WIFI_CONNECTED_BIT);\r
break;\r
default:\r
break;\r
void send_data(void *pvParameters)\r
{\r
int len = 0;\r
- char databuff[DEFAULT_PKTSIZE];\r
- memset(databuff, PACK_BYTE_IS, DEFAULT_PKTSIZE);\r
+ char databuff[EXAMPLE_DEFAULT_PKTSIZE];\r
+ memset(databuff, EXAMPLE_PACK_BYTE_IS, EXAMPLE_DEFAULT_PKTSIZE);\r
vTaskDelay(100/portTICK_RATE_MS);\r
ESP_LOGI(TAG, "start sending...");\r
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO\r
//delaytime\r
struct timeval tv_start;\r
struct timeval tv_finish;\r
unsigned long send_delay_ms;\r
-#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
while(1) {\r
\r
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO\r
total_pack++;\r
gettimeofday(&tv_start, NULL);\r
-#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
\r
//send function\r
- len = send(connect_socket, databuff, DEFAULT_PKTSIZE, 0);\r
+ len = send(connect_socket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0);\r
\r
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO\r
gettimeofday(&tv_finish, NULL);\r
-#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
if(len > 0) {\r
total_data += len;\r
\r
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_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
delay_classify[3]++;\r
else\r
delay_classify[4]++;\r
-#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
\r
- }/*if(len > 0)*/\r
- else {\r
+ } else {\r
\r
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO\r
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO\r
send_fail++;\r
-#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/\r
- \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
- //show_socket_error_code(connect_socket);\r
- //vTaskDelay(500/portTICK_RATE_MS);\r
- }\r
+#endif /*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/\r
+\r
+ if (LOG_LOCAL_LEVEL >= ESP_LOG_DEBUG) {\r
+ show_socket_error_reason(connect_socket);\r
+ }\r
+ } /*if(len > 0)*/\r
} \r
}\r
//receive data\r
void recv_data(void *pvParameters)\r
{\r
int len = 0;\r
- char databuff[DEFAULT_PKTSIZE];\r
+ char databuff[EXAMPLE_DEFAULT_PKTSIZE];\r
while (1) {\r
- len = recv(connect_socket, databuff, DEFAULT_PKTSIZE, 0);\r
+ len = recv(connect_socket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0);\r
if (len > 0) {\r
total_data += len;\r
- }\r
- else {\r
- show_socket_error_code(connect_socket);\r
- vTaskDelay(500 / portTICK_RATE_MS);\r
+ } else {\r
+ if (LOG_LOCAL_LEVEL >= ESP_LOG_DEBUG) {\r
+ show_socket_error_reason(connect_socket);\r
+ }\r
+ vTaskDelay(100 / portTICK_RATE_MS);\r
}\r
}\r
}\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, "server socket....port=%d\n", DEFAULT_PORT);\r
+ ESP_LOGI(TAG, "server socket....port=%d\n", EXAMPLE_DEFAULT_PORT);\r
server_socket = socket(AF_INET, SOCK_STREAM, 0);\r
if (server_socket < 0) {\r
- show_socket_error_code(server_socket);\r
+ show_socket_error_reason(server_socket);\r
return ESP_FAIL;\r
}\r
server_addr.sin_family = AF_INET;\r
- server_addr.sin_port = htons(DEFAULT_PORT);\r
+ server_addr.sin_port = htons(EXAMPLE_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
+ show_socket_error_reason(server_socket);\r
close(server_socket);\r
return ESP_FAIL;\r
}\r
if (listen(server_socket, 5) < 0) {\r
- show_socket_error_code(server_socket);\r
+ show_socket_error_reason(server_socket);\r
close(server_socket);\r
return ESP_FAIL;\r
}\r
connect_socket = accept(server_socket, (struct sockaddr*)&client_addr, &socklen);\r
if (connect_socket<0) {\r
- show_socket_error_code(connect_socket);\r
+ show_socket_error_reason(connect_socket);\r
close(server_socket);\r
return ESP_FAIL;\r
}\r
esp_err_t create_tcp_client()\r
{\r
ESP_LOGI(TAG, "client socket....serverip:port=%s:%d\n", \r
- DEFAULT_SERVER_IP, DEFAULT_PORT);\r
+ EXAMPLE_DEFAULT_SERVER_IP, EXAMPLE_DEFAULT_PORT);\r
connect_socket = socket(AF_INET, SOCK_STREAM, 0);\r
if (connect_socket < 0) {\r
- show_socket_error_code(connect_socket);\r
+ show_socket_error_reason(connect_socket);\r
return ESP_FAIL;\r
}\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
+ server_addr.sin_port = htons(EXAMPLE_DEFAULT_PORT);\r
+ server_addr.sin_addr.s_addr = inet_addr(EXAMPLE_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
+ show_socket_error_reason(connect_socket);\r
return ESP_FAIL;\r
}\r
ESP_LOGI(TAG, "connect to server success!");\r
//wifi_init_sta\r
void wifi_init_sta()\r
{\r
+ tcp_event_group = xEventGroupCreate();\r
+\r
tcpip_adapter_init();\r
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL) );\r
\r
ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
wifi_config_t wifi_config = {\r
.sta = {\r
- .ssid = DEFAULT_SSID,\r
- .password = DEFAULT_PWD\r
+ .ssid = EXAMPLE_DEFAULT_SSID,\r
+ .password = EXAMPLE_DEFAULT_PWD\r
},\r
};\r
\r
\r
ESP_LOGI(TAG, "wifi_init_sta finished.");\r
ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",\r
- DEFAULT_SSID,DEFAULT_PWD);\r
+ EXAMPLE_DEFAULT_SSID,EXAMPLE_DEFAULT_PWD);\r
}\r
//wifi_init_softap\r
void wifi_init_softap()\r
{\r
+ tcp_event_group = xEventGroupCreate();\r
+\r
tcpip_adapter_init();\r
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));\r
\r
ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
wifi_config_t wifi_config = {\r
.ap = {\r
- .ssid = DEFAULT_SSID,\r
+ .ssid = EXAMPLE_DEFAULT_SSID,\r
.ssid_len = 0,\r
- .max_connection=MAX_STA_CONN,\r
- .password = DEFAULT_PWD,\r
+ .max_connection=EXAMPLE_MAX_STA_CONN,\r
+ .password = EXAMPLE_DEFAULT_PWD,\r
.authmode = WIFI_AUTH_WPA_WPA2_PSK\r
},\r
};\r
- if (strlen(DEFAULT_PWD) ==0) {\r
+ if (strlen(EXAMPLE_DEFAULT_PWD) ==0) {\r
wifi_config.ap.authmode = WIFI_AUTH_OPEN;\r
}\r
\r
ESP_ERROR_CHECK(esp_wifi_start());\r
\r
ESP_LOGI(TAG, "wifi_init_softap finished.SSID:%s password:%s \n",\r
- DEFAULT_SSID, DEFAULT_PWD);\r
+ EXAMPLE_DEFAULT_SSID, EXAMPLE_DEFAULT_PWD);\r
}\r
\r
\r
\r
\r
-char* tcpip_get_reason(int err)\r
+int get_socket_error_code(int socket)\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
+ int result;\r
+ u32_t optlen = sizeof(int);\r
+ if(getsockopt(socket, SOL_SOCKET, SO_ERROR, &result, &optlen) == -1) {\r
+ ESP_LOGE(TAG, "getsockopt failed");\r
+ return -1;\r
}\r
+ return result;\r
}\r
\r
-int show_socket_error_code(int socket)\r
+int show_socket_error_reason(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
+ int err = get_socket_error_code(socket);\r
+ ESP_LOGW(TAG, "socket error %d %s", err, strerror(err));\r
+ return err;\r
}\r
\r
-int check_socket_error_code()\r
+int check_working_socket()\r
{\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 EXAMPLE_ESP_TCP_MODE_SERVER\r
+ ESP_LOGD(TAG, "check server_socket");\r
+ ret = get_socket_error_code(server_socket);\r
+ if(ret != 0) {\r
+ ESP_LOGW(TAG, "server socket error %d %s", ret, strerror(ret));\r
+ }\r
if(ret == ECONNRESET)\r
return ret;\r
#endif\r
- ESP_LOGI(TAG, "check connect_socket");\r
- ret = show_socket_error_code(connect_socket);\r
- if(ret == ECONNRESET)\r
+ ESP_LOGD(TAG, "check connect_socket");\r
+ ret = get_socket_error_code(connect_socket);\r
+ if(ret != 0) {\r
+ ESP_LOGW(TAG, "connect socket error %d %s", ret, strerror(ret));\r
+ }\r
+ if(ret != 0)\r
return ret;\r
return 0;\r
}\r
+/* 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.
+*/
+
+
#ifndef __TCP_PERF_H__
#define __TCP_PERF_H__
extern "C" {
#endif
-/*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_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_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
+#define EXAMPLE_ESP_WIFI_MODE_AP CONFIG_TCP_PERF_WIFI_MODE_AP //TRUE:AP FALSE:STA
+#define EXAMPLE_ESP_TCP_MODE_SERVER CONFIG_TCP_PERF_SERVER //TRUE:server FALSE:client
+#define EXAMPLE_ESP_TCP_PERF_TX CONFIG_TCP_PERF_TX //TRUE:send FALSE:receive
+#define EXAMPLE_ESP_TCP_DELAY_INFO CONFIG_TCP_PERF_DELAY_DEBUG //TRUE:show delay time info
+
+/*AP info and tcp_server info*/
+#define EXAMPLE_DEFAULT_SSID CONFIG_TCP_PERF_WIFI_SSID
+#define EXAMPLE_DEFAULT_PWD CONFIG_TCP_PERF_WIFI_PASSWORD
+#define EXAMPLE_DEFAULT_PORT CONFIG_TCP_PERF_SERVER_PORT
+#define EXAMPLE_DEFAULT_PKTSIZE CONFIG_TCP_PERF_PKT_SIZE
+#define EXAMPLE_MAX_STA_CONN 1 //how many sta can be connected(AP mode)
+
+#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 /*CONFIG_TCP_PERF_SERVER_IP*/
-#define PACK_BYTE_IS 97 //'a'
+
+#define EXAMPLE_PACK_BYTE_IS 97 //'a'
#define TAG "tcp_perf:"
+/* FreeRTOS event group to signal when we are connected to wifi*/
+extern EventGroupHandle_t tcp_event_group;
+#define WIFI_CONNECTED_BIT BIT0
-extern int connectedflag;
extern int total_data;
-#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
+#if EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO
extern int total_pack;
extern int send_success;
extern int send_fail;
extern int delay_classify[5];
-#endif/*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
+#endif/*EXAMPLE_ESP_TCP_PERF_TX && EXAMPLE_ESP_TCP_DELAY_INFO*/
//using esp as station
//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_code(int socket);
+int show_socket_error_reason(int socket);
//check working socket
-int check_socket_error_code();
+int check_working_socket();
#ifdef __cplusplus
config UDP_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 UDP_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 UDP_PERF_SERVER_PORT
int "UDP server port"
- default 4567
- help
- Which will the udp server use.
+ default 4567
+ help
+ Which will the udp server use.
config UDP_PERF_SERVER_IP
string "UDP server ip"
- default "192.168.4.1"
- help
- IP of UDP server.
+ depends on UDP_PERF_ESP_IS_CLIENT
+ default "192.168.4.1"
+ help
+ IP of UDP server.
- Ignore in UDP server.
+ Ignore in UDP server.
config UDP_PERF_PKT_SIZE
int "Size of UDP packet"
- default 1460
- help
- the data send&recv packet size.
+ default 1460
+ help
+ the data send&recv packet size.
endmenu
+/* udp_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 <errno.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#include "freertos/event_groups.h"
#include "esp_log.h"
#include "esp_err.h"
{
ESP_LOGI(TAG, "task udp_conn start.");
/*wating for connecting to AP*/
- do
- {
- vTaskDelay(100);
- }
- while (!connectedflag);
+ xEventGroupWaitBits(udp_event_group, WIFI_CONNECTED_BIT,false, true, portMAX_DELAY);
ESP_LOGI(TAG, "sta has connected to ap.");
/*create udp socket*/
int socket_ret;
-#if ESP_UDP_MODE_SERVER
+#if EXAMPLE_ESP_UDP_MODE_SERVER
+ ESP_LOGI(TAG, "create udp server after 3s...");
vTaskDelay(3000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_udp_server.");
socket_ret=create_udp_server();
-#else /*ESP_UDP_MODE_SERVER*/
+#else /*EXAMPLE_ESP_UDP_MODE_SERVER*/
+ ESP_LOGI(TAG, "create udp client after 20s...");
vTaskDelay(20000 / portTICK_RATE_MS);
ESP_LOGI(TAG, "create_udp_client.");
socket_ret = create_udp_client();
#endif
- if(ESP_FAIL == socket_ret) {
+ if(socket_ret == ESP_FAIL) {
ESP_LOGI(TAG, "create udp socket error,stop.");
vTaskDelete(NULL);
}
TaskHandle_t tx_rx_task;
xTaskCreate(&send_recv_data, "send_recv_data", 4096, NULL, 4, &tx_rx_task);
- int pps;
+ /*waiting udp connected success*/
+ xEventGroupWaitBits(udp_event_group, UDP_CONNCETED_SUCCESS,false, true, portMAX_DELAY);
+ int bps;
while (1) {
total_data = 0;
vTaskDelay(3000 / portTICK_RATE_MS);//every 3s
- pps = total_data / 3;
-
-#if ESP_UDP_PERF_TX
- ESP_LOGI(TAG, "udp send %d byte per sec! total pack: %d \n", pps, success_pack);
+ bps = total_data / 3;
+
+ if (total_data <= 0) {
+ int err_ret = check_connected_socket();
+ if (err_ret == -1) { //-1 reason: low level netif error
+ ESP_LOGW(TAG, "udp send & recv stop.\n");
+ break;
+ }
+ }
+
+#if EXAMPLE_ESP_UDP_PERF_TX
+ ESP_LOGI(TAG, "udp send %d byte per sec! total pack: %d \n", bps, success_pack);
#else
- ESP_LOGI(TAG, "udp recv %d byte per sec! total pack: %d \n", pps, success_pack);
-#endif /*ESP_UDP_PERF_TX*/
+ ESP_LOGI(TAG, "udp recv %d byte per sec! total pack: %d \n", bps, success_pack);
+#endif /*EXAMPLE_ESP_UDP_PERF_TX*/
}
close_socket();
vTaskDelete(tx_rx_task);
void app_main(void)
{
-#if ESP_WIFI_MODE_AP
- ESP_LOGI(TAG, "ESP_WIFI_MODE_AP\n");
+#if EXAMPLE_ESP_WIFI_MODE_AP
+ ESP_LOGI(TAG, "EXAMPLE_ESP_WIFI_MODE_AP");
wifi_init_softap();
-#else /*ESP_WIFI_MODE_AP*/
- ESP_LOGI(TAG, "ESP_WIFI_MODE_STA\n");
+#else /*EXAMPLE_ESP_WIFI_MODE_AP*/
+ ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
#endif
xTaskCreate(&udp_conn, "udp_conn", 4096, NULL, 5, NULL);
-// 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
+/* udp_perf Example\r
+\r
+ This example code is in the Public Domain (or CC0 licensed, at your option.)\r
+\r
+ Unless required by applicable law or agreed to in writing, this\r
+ software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\r
+ CONDITIONS OF ANY KIND, either express or implied.\r
+*/\r
\r
#include <string.h>\r
#include <sys/socket.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_log.h"\r
#include "udp_perf.h"\r
\r
\r
+/* FreeRTOS event group to signal when we are connected to WiFi and ready to start UDP test*/\r
+EventGroupHandle_t udp_event_group;\r
+\r
\r
static int mysocket;\r
\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
break;\r
case SYSTEM_EVENT_STA_DISCONNECTED:\r
esp_wifi_connect();\r
+ xEventGroupClearBits(udp_event_group, WIFI_CONNECTED_BIT);\r
break;\r
case SYSTEM_EVENT_STA_CONNECTED:\r
break;\r
ESP_LOGI(TAG, "event_handler:SYSTEM_EVENT_STA_GOT_IP!");\r
ESP_LOGI(TAG, "got ip:%s\n",\r
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));\r
- connectedflag=1;\r
+ xEventGroupSetBits(udp_event_group, WIFI_CONNECTED_BIT);\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
+ xEventGroupSetBits(udp_event_group, WIFI_CONNECTED_BIT);\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
+ xEventGroupClearBits(udp_event_group, WIFI_CONNECTED_BIT);\r
break;\r
default:\r
break;\r
//wifi_init_sta\r
void wifi_init_sta()\r
{\r
+ udp_event_group = xEventGroupCreate();\r
+ \r
tcpip_adapter_init();\r
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL) );\r
\r
ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
wifi_config_t wifi_config = {\r
.sta = {\r
- .ssid = DEFAULT_SSID,\r
- .password = DEFAULT_PWD\r
+ .ssid = EXAMPLE_DEFAULT_SSID,\r
+ .password = EXAMPLE_DEFAULT_PWD\r
},\r
};\r
\r
\r
ESP_LOGI(TAG, "wifi_init_sta finished.");\r
ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",\r
- DEFAULT_SSID,DEFAULT_PWD);\r
+ EXAMPLE_DEFAULT_SSID,EXAMPLE_DEFAULT_PWD);\r
}\r
//wifi_init_softap\r
void wifi_init_softap()\r
{\r
+ udp_event_group = xEventGroupCreate();\r
+ \r
tcpip_adapter_init();\r
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));\r
\r
ESP_ERROR_CHECK(esp_wifi_init(&cfg));\r
wifi_config_t wifi_config = {\r
.ap = {\r
- .ssid = DEFAULT_SSID,\r
+ .ssid = EXAMPLE_DEFAULT_SSID,\r
.ssid_len=0,\r
- .max_connection=MAX_STA_CONN,\r
- .password = DEFAULT_PWD,\r
+ .max_connection=EXAMPLE_MAX_STA_CONN,\r
+ .password = EXAMPLE_DEFAULT_PWD,\r
.authmode=WIFI_AUTH_WPA_WPA2_PSK\r
},\r
};\r
- if (strlen(DEFAULT_PWD) ==0) {\r
+ if (strlen(EXAMPLE_DEFAULT_PWD) ==0) {\r
wifi_config.ap.authmode = WIFI_AUTH_OPEN;\r
}\r
\r
ESP_ERROR_CHECK(esp_wifi_start());\r
\r
ESP_LOGI(TAG, "wifi_init_softap finished.SSID:%s password:%s \n",\r
- DEFAULT_SSID, DEFAULT_PWD);\r
+ EXAMPLE_DEFAULT_SSID, EXAMPLE_DEFAULT_PWD);\r
}\r
\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, "create_udp_server()");\r
+ ESP_LOGI(TAG, "create_udp_server() port:%d", EXAMPLE_DEFAULT_PORT);\r
mysocket = socket(AF_INET, SOCK_DGRAM, 0);\r
if (mysocket < 0) {\r
- show_socket_error_code(mysocket);\r
+ show_socket_error_reason(mysocket);\r
return ESP_FAIL;\r
}\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_port = htons(EXAMPLE_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
+ show_socket_error_reason(mysocket);\r
close(mysocket);\r
return ESP_FAIL;\r
}\r
esp_err_t create_udp_client()\r
{\r
ESP_LOGI(TAG, "create_udp_client()");\r
+ ESP_LOGI(TAG, "connecting to %s:%d",\r
+ EXAMPLE_DEFAULT_SERVER_IP, EXAMPLE_DEFAULT_PORT);\r
mysocket = socket(AF_INET, SOCK_DGRAM, 0);\r
if (mysocket < 0) {\r
- show_socket_error_code(mysocket);\r
+ show_socket_error_reason(mysocket);\r
return ESP_FAIL;\r
}\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_SERVER_IP);\r
+ remote_addr.sin_port = htons(EXAMPLE_DEFAULT_PORT);\r
+ remote_addr.sin_addr.s_addr = inet_addr(EXAMPLE_DEFAULT_SERVER_IP);\r
\r
return ESP_OK;\r
}\r
ESP_LOGI(TAG, "task send_recv_data start!\n");\r
\r
int len;\r
- char databuff[DEFAULT_PKTSIZE];\r
+ char databuff[EXAMPLE_DEFAULT_PKTSIZE];\r
\r
/*send&receive first packet*/\r
socklen = sizeof(remote_addr);\r
- memset(databuff, PACK_BYTE_IS, DEFAULT_PKTSIZE);\r
-#if ESP_UDP_MODE_SERVER\r
+ memset(databuff, EXAMPLE_PACK_BYTE_IS, EXAMPLE_DEFAULT_PKTSIZE);\r
+#if EXAMPLE_ESP_UDP_MODE_SERVER\r
ESP_LOGI(TAG, "first recvfrom:");\r
- len = recvfrom(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
+ len = recvfrom(mysocket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
#else\r
ESP_LOGI(TAG, "first sendto:");\r
- len = sendto(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr));\r
+ len = sendto(mysocket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr));\r
#endif\r
\r
if (len > 0) {\r
ESP_LOGI(TAG, "transfer data with %s:%u\n",\r
inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port));\r
+ xEventGroupSetBits(udp_event_group, UDP_CONNCETED_SUCCESS);\r
} else {\r
- show_socket_error_code(mysocket);\r
+ show_socket_error_reason(mysocket);\r
close(mysocket);\r
vTaskDelete(NULL);\r
- }\r
+ } /*if (len > 0)*/\r
\r
-#if ESP_UDP_PERF_TX\r
+#if EXAMPLE_ESP_UDP_PERF_TX\r
vTaskDelay(500 / portTICK_RATE_MS);\r
#endif\r
ESP_LOGI(TAG, "start count!\n");\r
- while(1)\r
- {\r
- /*you can add delay time for fixed-frequency*/\r
- //vTaskDelay(5 / portTICK_RATE_MS);\r
-#if ESP_UDP_PERF_TX\r
- len = sendto(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr));\r
+ while(1) {\r
+#if EXAMPLE_ESP_UDP_PERF_TX\r
+ len = sendto(mysocket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr));\r
#else\r
- len = recvfrom(mysocket, databuff, DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
+ len = recvfrom(mysocket, databuff, EXAMPLE_DEFAULT_PKTSIZE, 0, (struct sockaddr *)&remote_addr, &socklen);\r
#endif\r
if (len > 0) {\r
total_data += len;\r
success_pack++;\r
} else {\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
- //vTaskDelay(1/portTICK_RATE_MS);\r
- }\r
- }\r
+ if (LOG_LOCAL_LEVEL >= ESP_LOG_DEBUG) {\r
+ show_socket_error_reason(mysocket);\r
+ }\r
+ } /*if (len > 0)*/\r
+ } /*while(1)*/\r
}\r
\r
\r
-char* tcpip_get_reason(int err)\r
+int get_socket_error_code(int socket)\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
+ int result;\r
+ u32_t optlen = sizeof(int);\r
+ if(getsockopt(socket, SOL_SOCKET, SO_ERROR, &result, &optlen) == -1) {\r
+ ESP_LOGE(TAG, "getsockopt failed");\r
+ return -1;\r
}\r
+ return result;\r
}\r
\r
-int show_socket_error_code(int socket)\r
+int show_socket_error_reason(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
+ int err = get_socket_error_code(socket);\r
+ ESP_LOGW(TAG, "socket error %d %s", err, strerror(err));\r
+ return err;\r
}\r
\r
+int check_connected_socket()\r
+{\r
+ int ret;\r
+ ESP_LOGD(TAG, "check connect_socket");\r
+ ret = get_socket_error_code(mysocket);\r
+ if(ret != 0) {\r
+ ESP_LOGW(TAG, "socket error %d %s", ret, strerror(ret));\r
+ }\r
+ return ret;\r
+}\r
\r
void close_socket()\r
{\r
+/* udp_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.
+*/
+
+
#ifndef __UDP_PERF_H__
#define __UDP_PERF_H__
extern "C" {
#endif
-/*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_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_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'
+#define EXAMPLE_ESP_WIFI_MODE_AP CONFIG_UDP_PERF_WIFI_MODE_AP //TRUE:AP FALSE:STA
+#define EXAMPLE_ESP_UDP_MODE_SERVER CONFIG_UDP_PERF_SERVER //TRUE:server FALSE:client
+#define EXAMPLE_ESP_UDP_PERF_TX CONFIG_UDP_PERF_TX //TRUE:send FALSE:receive
+#define EXAMPLE_PACK_BYTE_IS 97 //'a'
+/*AP info and tcp_server info*/
+#define EXAMPLE_DEFAULT_SSID CONFIG_UDP_PERF_WIFI_SSID
+#define EXAMPLE_DEFAULT_PWD CONFIG_UDP_PERF_WIFI_PASSWORD
+#define EXAMPLE_DEFAULT_PORT CONFIG_UDP_PERF_SERVER_PORT
+#define EXAMPLE_DEFAULT_PKTSIZE CONFIG_UDP_PERF_PKT_SIZE
+#define EXAMPLE_MAX_STA_CONN 1 //how many sta can be connected(AP mode)
+
+#ifdef CONFIG_UDP_PERF_SERVER_IP
+#define EXAMPLE_DEFAULT_SERVER_IP CONFIG_UDP_PERF_SERVER_IP
+#else
+#define EXAMPLE_DEFAULT_SERVER_IP "192.168.4.1"
+#endif /*CONFIG_UDP_PERF_SERVER_IP*/
+
#define TAG "udp_perf:"
+/* FreeRTOS event group to signal when we are connected to WiFi and ready to start UDP test*/
+extern EventGroupHandle_t udp_event_group;
+#define WIFI_CONNECTED_BIT BIT0
+#define UDP_CONNCETED_SUCCESS BIT1
-extern int connectedflag;
extern int total_data;
extern int success_pack;
//send or recv data task
void send_recv_data(void *pvParameters);
+//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_code(int socket);
+int show_socket_error_reason(int socket);
+
+//check connected socket. return: error code
+int check_connected_socket();
//close all socket
void close_socket();