espconn reconnect callback
espconn reconnect callback
Postby rith87 » Tue Feb 21, 2017 6:25 pm
I'm using the ESP to download a 500 kB file. If my download speed is fast and I download the file in < 17s, everything is good. However, if the ESP download speed is slow, the reconnect callback is called and reports that the connection has been reset. Is there any way to understand why the connection is reset?
Re: espconn reconnect callback
Postby rith87 » Thu Feb 23, 2017 6:28 pm
I managed to repro this issue with the following code:
Code: Select all
#define HTTP_HEADER "Connection: keep-alive\r\n\
Cache-Control: no-cache\r\n\
User-Agent: rBoot-Sample/1.0\r\n\
Accept: */*\r\n\r\n"
void ICACHE_FLASH_ATTR user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
os_printf("Block received: %d\n", length);
}
void ICACHE_FLASH_ATTR user_tcp_discon_cb(void *arg)
{
os_printf("Time [%d]: ", system_get_time());
os_printf("Disconnect callback\n");
}
void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg)
{
char request[REQUEST_SIZE] = {0};
os_printf("Connect callback\n");
espconn *conn = (espconn *) arg;
espconn_regist_recvcb(conn, user_tcp_recv_cb);
espconn_regist_disconcb(conn, user_tcp_discon_cb);
os_sprintf(request,
"GET %s HTTP/1.1\r\nHost: %s\r\n%s\r\n",
OTA_PATH, OTA_HOST, HTTP_HEADER);
os_printf("Time [%d]:", system_get_time());
os_printf("Request: %s\n", request);
espconn_sent(conn, (uint8_t *) request, os_strlen((char*)request));
}
void ICACHE_FLASH_ATTR user_tcp_recon_cb(void *arg, sint8 errType)
{
os_printf("Time [%d]: ", system_get_time());
os_printf("Reconnect: %d\n", errType);
}
/******************************************************************************
* FunctionName : user_check_ip
* Description : check whether get ip addr or not
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_check_ip(void)
{
struct ip_info ipconfig;
//disarm timer first
os_timer_disarm(&test_timer);
//get ip info of ESP8266 station
wifi_get_ip_info(STATION_IF, &ipconfig);
if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0)
{
os_printf("got ip !!! \r\n");
#if 1
// Connect to tcp server as NET_DOMAIN
user_tcp_conn.proto.tcp = &user_tcp;
user_tcp_conn.type = ESPCONN_TCP;
user_tcp_conn.state = ESPCONN_NONE;
const char esp_server_ip[4] = OTA_IP;
uint32_t keepalive_time = 60;
os_memcpy(user_tcp_conn.proto.tcp->remote_ip, esp_server_ip, 4);
user_tcp_conn.proto.tcp->remote_port = 80;
user_tcp_conn.proto.tcp->local_port = espconn_port(); //local port of ESP8266
espconn_regist_connectcb(&user_tcp_conn, user_tcp_connect_cb); // register connect callback
espconn_regist_reconcb(&user_tcp_conn, user_tcp_recon_cb); // register reconnect callback as error handler
espconn_set_opt(&user_tcp_conn, ESPCONN_KEEPALIVE);
espconn_set_keepalive(&user_tcp_conn, ESPCONN_KEEPIDLE, &keepalive_time);
espconn_connect(&user_tcp_conn);
#endif
}
else
{
if ((wifi_station_get_connect_status() == STATION_WRONG_PASSWORD ||
wifi_station_get_connect_status() == STATION_NO_AP_FOUND ||
wifi_station_get_connect_status() == STATION_CONNECT_FAIL))
{
os_printf("connect fail !!! \r\n");
}
else
{
//re-arm timer to check ip
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = SSID_PASSWORD;
struct station_config stationConf;
os_printf("Set station config\n");
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
#ifdef ADD_HEAP_PRINT_OUT
void ICACHE_FLASH_ATTR
user_heap_print_out()
{
LOG_STATEMENT(INFO, "Remaining heap:%d\n", system_get_free_heap_size());
}
void ICACHE_FLASH_ATTR
user_routine_heap_print_out()
{
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_heap_print_out, NULL);
os_timer_arm(&test_timer, 3000, 1);
}
#endif
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
extern "C" ICACHE_FLASH_ATTR void user_init(void)
{
// Initialize UART
uart_init(BIT_RATE_115200, BIT_RATE_115200);
// Configure the UART
os_printf("\r\nSystem init...\r\n");
do_global_ctors();
os_printf("\r\nGlobal constructors invoked\r\n");
user_set_station_config();
}
Re: espconn reconnect callback
Postby AlexLuo » Wed Nov 22, 2017 7:42 am
I don't have the experience about it.
It's good for me about the reconnect call back working after reset, but don't know if the reconnect callback response when the connection broken. I would like to try it but it did happen after I disconnect the server.
For your case, please verify the reset from server side or client side. If it's from server side, you can check the configuration on server.
Thank you for sharing your experience. If possible, can disconnect wifi or tcp connection to see the reconnect callback response -- it still happen?
It's good for me about the reconnect call back working after reset, but don't know if the reconnect callback response when the connection broken. I would like to try it but it did happen after I disconnect the server.
For your case, please verify the reset from server side or client side. If it's from server side, you can check the configuration on server.
Thank you for sharing your experience. If possible, can disconnect wifi or tcp connection to see the reconnect callback response -- it still happen?
Who is online
Users browsing this forum: No registered users and 120 guests
Login
Newbies Start Here
Are you new to ESP8266?
Unsure what to do?
Dunno where to start?
Start right here!
Latest SDK
Documentation
Complete listing of the official ESP8266 related documentation release by ESPRESSIF!
Must read here!
- All times are UTC+08:00
- Top
- Delete all board cookies
About Us
Espressif Systems is a fabless semiconductor company providing cutting-edge low power WiFi SoCs and wireless solutions for wireless communications and Internet of Things applications. We are the manufacturer of ESP8266EX.