eg/perf:modify udp_perf and some mistakes

modify udp_perf to be similar with tcp_perf.
change indentation and some mistakes of codes.
edit README.
This commit is contained in:
chenyudong
2017-03-21 20:06:32 +08:00
parent 5ecc88cb33
commit 8a163e3db0
13 changed files with 730 additions and 526 deletions

View File

@@ -1,84 +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
#choice
# prompt "TCP_PERF_MODE "
# default MODE_TCP_SHIELDBOX
# help
# This option set 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.
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".
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.
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.
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.
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.
default "1234567890"
help
WiFi password (WPA or WPA2) for the example to use.
config TCP_PERF_SEVER_PORT
int "TCP sever port"
int "TCP sever port"
default 4567
help
Which will the tcp sever use.
Which will the tcp sever use.
config TCP_PERF_SERVER_IP
string "TCP server ip"
string "TCP server ip"
default "192.168.4.1"
help
IP of TCP server.
Ignore in TCP sever.
IP of TCP server.
Ignore in TCP sever.
config TCP_PERF_PKT_SIZE
int "Size of TCP packet"
int "Size of TCP packet"
default 1460
help
the data send&recv packet size.
the data send&recv packet size.
endmenu

View File

@@ -7,90 +7,87 @@ Using this example to test tcp throughput performance.
esp<->esp or esp<->ap
step1:
init wifi as AP/STA using config SSID/PASSWORD.
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.
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.
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;
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};
int totle_pack = 0;
int send_success = 0;
int send_fail = 0;
int delay_classify[5] = { 0 };
#endif
#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, "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;
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();
ESP_LOGI(TAG, "creat_tcp_sever.");
socret=creat_tcp_sever();
#else /*ESP_TCP_MODE_SEVER*/
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);
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 /*ESP_TCP_PERF_TX*/
xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task);
#endif
int pps;
while (1) {
totle_data = 0;
vTaskDelay(3000 / portTICK_RATE_MS);//every 3s
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\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],
delay_classify[1], delay_classify[2], delay_classify[3], delay_classify[4]);
#endif /*ESP_TCP_DELAY_INFO*/
#else
ESP_LOGI(TAG, "tcp recv %d byte per sec!\n", pps);
#endif /*ESP_TCP_PERF_TX*/
}
close_socket();
vTaskDelete(tx_rx_task);
vTaskDelete(NULL);
}
@@ -101,9 +98,9 @@ void app_main(void)
#if ESP_WIFI_MODE_AP
ESP_LOGI(TAG, "ESP_WIFI_MODE_AP\n");
wifi_init_softap();
#else
#else /*ESP_WIFI_MODE_AP*/
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA\n");
wifi_init_sta();
#endif
xTaskCreate(&tcp_conn,"tcp_conn",4096,NULL,5,NULL);
xTaskCreate(&tcp_conn, "tcp_conn", 4096, NULL, 5, NULL);
}

View File

@@ -1,18 +1,6 @@
#include "tcp_perf.h"
extern int connectedflag;
extern int totle_data;
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
extern int totle_pack;
extern int send_success;
extern int send_fail;
extern int delay_classify[5];
#endif
/* FreeRTOS event group to signal when we are connected & ready to make a request */
static EventGroupHandle_t wifi_event_group;
/*socket*/
@@ -34,20 +22,21 @@ static esp_err_t event_handler(void *ctx, system_event_t *event)
case SYSTEM_EVENT_STA_CONNECTED:
break;
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "event_handler:SYSTEM_EVENT_STA_GOT_IP!\n");
ESP_LOGI(TAG, "ip:%s\n",ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
ESP_LOGI(TAG, "event_handler:SYSTEM_EVENT_STA_GOT_IP!");
ESP_LOGI(TAG, "got ip:%s\n",
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
connectedflag=1;
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);
MAC2STR(event->event_info.sta_connected.mac),
event->event_info.sta_connected.aid);
connectedflag=1;
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);
MAC2STR(event->event_info.sta_disconnected.mac),
event->event_info.sta_disconnected.aid);
break;
default:
break;
@@ -58,138 +47,136 @@ static esp_err_t event_handler(void *ctx, system_event_t *event)
//send data
void send_data(void *pvParameters)
{
int len=0;
char databuff[DEFAULT_PKTSIZE];
memset(databuff,97,DEFAULT_PKTSIZE);
vTaskDelay(100/portTICK_RATE_MS);
ESP_LOGI(TAG,"start sending...");
while(1)
{
int len = 0;
char databuff[DEFAULT_PKTSIZE];
memset(databuff, PACK_BYTE_IS, DEFAULT_PKTSIZE);
vTaskDelay(100/portTICK_RATE_MS);
ESP_LOGI(TAG, "start sending...");
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
//delaytime
struct timeval tv_start;
struct timeval tv_finish;
unsigned int send_delay_ms;
totle_pack++;
gettimeofday(&tv_start,NULL);
#endif
len=send(connect_soc, databuff, DEFAULT_PKTSIZE, 0);
//delaytime
struct timeval tv_start;
struct timeval tv_finish;
unsigned long send_delay_ms;
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
while(1) {
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
gettimeofday(&tv_finish,NULL);
#endif
if(len>0)
{
totle_data+=len;
//vTaskDelay(1000/portTICK_RATE_MS);
totle_pack++;
gettimeofday(&tv_start, NULL);
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
//send function
len = send(connect_soc, databuff, DEFAULT_PKTSIZE, 0);
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
send_success++;
send_delay_ms=(tv_finish.tv_sec-tv_start.tv_sec)*1000
+(tv_finish.tv_usec-tv_start.tv_usec)/1000;
//ESP_LOGI(TAG, "send_delay_ms=%d",send_delay_ms);
if(send_delay_ms<30)
delay_classify[0]++;
else if(send_delay_ms<100)
delay_classify[1]++;
else if(send_delay_ms<300)
delay_classify[2]++;
else if(send_delay_ms<1000)
delay_classify[3]++;
else
delay_classify[4]++;
#endif
}
else
{
gettimeofday(&tv_finish, NULL);
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
if(len > 0) {
totle_data += len;
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
send_fail++;
#endif
/*for faster send&receive,don't show error code.
*if it can't work as expectations,unnote the two lines here
**/
//perror("data_count error");
//vTaskDelay(500/portTICK_RATE_MS);
}
}
send_success++;
send_delay_ms = (tv_finish.tv_sec - tv_start.tv_sec) * 1000
+ (tv_finish.tv_usec - tv_start.tv_usec) / 1000;
//ESP_LOGI(TAG, "send_delay_ms=%ld",send_delay_ms);
if(send_delay_ms < 30)
delay_classify[0]++;
else if(send_delay_ms < 100)
delay_classify[1]++;
else if(send_delay_ms < 300)
delay_classify[2]++;
else if(send_delay_ms < 1000)
delay_classify[3]++;
else
delay_classify[4]++;
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
}/*if(len > 0)*/
else {
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
send_fail++;
#endif /*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
/*for faster sending,don't show error code
*if it can't work as expectations,unnote the two lines here
**/
//perror("data_count error");
//vTaskDelay(500/portTICK_RATE_MS);
}
}
}
//send data
//receive data
void recv_data(void *pvParameters)
{
int len=0;
char databuff[DEFAULT_PKTSIZE];
while(1)
{
len=recv(connect_soc, databuff, DEFAULT_PKTSIZE, 0);
if(len>0)
{
totle_data+=len;
}
else
{
perror("data_count error");
vTaskDelay(500/portTICK_RATE_MS);
}
}
int len = 0;
char databuff[DEFAULT_PKTSIZE];
while (1) {
len = recv(connect_soc, databuff, DEFAULT_PKTSIZE, 0);
if (len > 0) {
totle_data += len;
}
else {
perror("recv_data error");
vTaskDelay(500 / portTICK_RATE_MS);
}
}
}
//use this esp32 as a tcp sever. return 0:success -1:error
int creat_tcp_sever()
{
ESP_LOGI(TAG, "sever socket....port=%d\n",DEFAULTPORT);
sever_socket = socket(AF_INET, SOCK_STREAM, 0);
if(sever_socket < 0)
{
perror("socket() error:");
return -1;
}
sever_addr.sin_family = AF_INET;
sever_addr.sin_port = htons(DEFAULTPORT);
sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sever_socket,(struct sockaddr*)&sever_addr,sizeof(sever_addr))<0)
{
perror("bind() error");
close(sever_socket);
return -1;
}
if(listen(sever_socket,5)<0)
{
perror("listen() error");
close(sever_socket);
return -1;
}
connect_soc = accept(sever_socket,(struct sockaddr*)&client_addr,&socklen);
if(connect_soc<0)
{
perror("accept() error");
close(sever_socket);
return -1;
}
/*connection establishednow can send/recv*/
ESP_LOGI(TAG, "tcp connection established!");
return 0;
ESP_LOGI(TAG, "sever socket....port=%d\n", DEFAULT_PORT);
sever_socket = socket(AF_INET, SOCK_STREAM, 0);
if (sever_socket < 0) {
perror("socket() error:");
return -1;
}
sever_addr.sin_family = AF_INET;
sever_addr.sin_port = htons(DEFAULT_PORT);
sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sever_socket, (struct sockaddr*)&sever_addr, sizeof(sever_addr)) < 0) {
perror("bind() error");
close(sever_socket);
return -1;
}
if (listen(sever_socket, 5) < 0) {
perror("listen() error");
close(sever_socket);
return -1;
}
connect_soc = accept(sever_socket, (struct sockaddr*)&client_addr, &socklen);
if (connect_soc<0) {
perror("accept() error");
close(sever_socket);
return -1;
}
/*connection establishednow can send/recv*/
ESP_LOGI(TAG, "tcp connection established!");
return 0;
}
//use this esp32 as a tcp client. return 0:success -1:error
int creat_tcp_client()
{
ESP_LOGI(TAG, "client socket....severip:port=%s:%d\n",DEFAULTSEVERIP,DEFAULTPORT);
connect_soc = socket(AF_INET, SOCK_STREAM, 0);
if(connect_soc < 0)
{
perror("socket failed!");
return -1;
}
sever_addr.sin_family = AF_INET;
sever_addr.sin_port = htons(DEFAULTPORT);
sever_addr.sin_addr.s_addr = inet_addr(DEFAULTSEVERIP);
printf("connecting to sever...");
if(connect(connect_soc, (struct sockaddr *)&sever_addr, sizeof(sever_addr)) < 0)
{
perror("connect to sever error!");
return -1;
}
ESP_LOGI(TAG,"connect to sever success!");
return 0;
ESP_LOGI(TAG, "client socket....severip:port=%s:%d\n",
DEFAULT_SEVER_IP, DEFAULT_PORT);
connect_soc = socket(AF_INET, SOCK_STREAM, 0);
if (connect_soc < 0) {
perror("socket failed!");
return -1;
}
sever_addr.sin_family = AF_INET;
sever_addr.sin_port = htons(DEFAULT_PORT);
sever_addr.sin_addr.s_addr = inet_addr(DEFAULT_SEVER_IP);
ESP_LOGI(TAG, "connecting to sever...");
if (connect(connect_soc, (struct sockaddr *)&sever_addr, sizeof(sever_addr)) < 0) {
perror("connect to sever error!");
return -1;
}
ESP_LOGI(TAG, "connect to sever success!");
return 0;
}
//wifi_init_sta
@@ -197,54 +184,56 @@ void wifi_init_sta()
{
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
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 = DEFAULTSSID,
.password = DEFAULTPWD
.ssid = DEFAULT_SSID,
.password = DEFAULT_PWD
},
};
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_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",DEFAULTSSID,DEFAULTPWD);
ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",
DEFAULT_SSID,DEFAULT_PWD);
}
//wifi_init_softap
void wifi_init_softap()
{
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
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 = DEFAULTSSID,
.ssid = DEFAULT_SSID,
.ssid_len=0,
.max_connection=MAXSTACONN,
.password = DEFAULTPWD,
.max_connection=MAX_STA_CONN,
.password = DEFAULT_PWD,
.authmode=WIFI_AUTH_WPA_WPA2_PSK
},
};
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_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, "wifi_init_softap finished.SSID:%s password:%s \n",DEFAULTSSID,DEFAULTPWD);
ESP_LOGI(TAG, "wifi_init_softap finished.SSID:%s password:%s \n",
DEFAULT_SSID, DEFAULT_PWD);
}
void close_socket()
{
close(connect_soc);
close(sever_socket);
close(connect_soc);
close(sever_socket);
}

View File

@@ -24,12 +24,12 @@ 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_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_PKTSIZE CONFIG_TCP_PERF_PKT_SIZE
#define MAXSTACONN 1 //how many sta can be connected(AP mode)
#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
@@ -37,9 +37,20 @@ extern "C" {
#define ESP_TCP_DELAY_INFO CONFIG_TCP_PERF_DELAY_DEBUG //TRUE:show delay time info
#define PACK_BYTE_IS 97 //'a'
#define TAG "tcp_perf:"
extern int connectedflag;
extern int totle_data;
#if ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO
extern int totle_pack;
extern int send_success;
extern int send_fail;
extern int delay_classify[5];
#endif/*ESP_TCP_PERF_TX && ESP_TCP_DELAY_INFO*/
//using esp as station
void wifi_init_sta();
@@ -67,5 +78,6 @@ void close_socket();
}
#endif
#endif
#endif /*#ifndef __TCP_PERF_H__*/