- I'm using esp-idf version 3.0.5
- I have ESP32 connected to a GSM module via UART.
- I use loboris example (https://github.com/loboris/ESP32-PPPOS-EXAMPLE) to create the PPPOS connection and to pass the data to TCPIP layer.
- Also I'm using do while loop for read the response of the server (https_request example similar code)
- GSM Task (uart) and HTTPS Task have the same priority
The problem is when the program is reading the file from server, it returns a -0x0050 (MBEDTLS_ERR_NET_CONN_RESET ) and it stops de download. This happens sometimes at 40 seconds from downloading, sometimes at 100, sometimes at 200... it varies
I've tried the follow command to see if it happens from a PC and it's server problem:
curl -i -v --http1.1 --limit-rate 1000 https://server_domain/file.txt
But it doesn't seem so as the download correctly finishes.
As you see I try to simulate slow connection, because the GSM Uart baudrate is 19200, that would be 2400 bytes/s.
- I've seen the return error comes from mbedtls_ssl_handshake() call that is inside the the mbedtls_ssl_read() call.
This is how the do while loop for reading looks like, deleted a few comment code
Code: Select all
do
{
len = BUFFSIZE;
ret = mbedtls_ssl_read(&ssl, (unsigned char *)bufferRead, len);
if(ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)
{
continue;
}
if(ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
{
ret = 0;
break;
}
if( ret < 0 ) /* receive error */
{
break;
}
else if( (ret > 0) && (!resp_body_start) ) /* reading header first and a piece of body */
{
if( (!http_200_flag) && (strstr(bufferRead, "200") == NULL) )
{
break;
}
http_200_flag = true;
resp_body_start = https_readPastHttpHeader( bufferRead, ret, &index );
if( (resp_body_start) && (index > 0))
{
i_write_len = ret - index;
if( i_write_len > 0 )
{
//save data to partition
saveDataToPartition( &bufferRead );
}
}
else
{
break;
}
}
else if( (ret > 0) && (resp_body_start) ) /* already read the header, reading body */
{
//save data to partition
saveDataToPartition( &bufferRead );
}
else if( ret == 0 ) /* packet over */
{
break;
}
}
while(1);
I read the data from mbedtls_ssl_read in chunks of 2048 bytes (size of bufferRead) and write the data in NVM memory, by printing the timestamp I see the task reads data each 16384 bytes (8 * 2048)
Code: Select all
rTime: 638638 //rTime -> timestamp reported by esp_logtime()
Write OK of 2048 bytes to 0x00000000 //this address is relative, not actually 0x0000 address!
rTime: 638648
Write OK of 2048 bytes to 0x00000800
rTime: 638648
Write OK of 2048 bytes to 0x00001000
rTime: 638648
Write OK of 2048 bytes to 0x00001800
rTime: 638648
Write OK of 2048 bytes to 0x00002000
rTime: 638648
Write OK of 2048 bytes to 0x00002800
rTime: 638658
Write OK of 2048 bytes to 0x00003000
rTime: 638658
Write OK of 2048 bytes to 0x00003800
rTime: 647298
Write OK of 2048 bytes to 0x00004000
rTime: 647308
Write OK of 2048 bytes to 0x00004800
rTime: 647308
Write OK of 2048 bytes to 0x00005000
rTime: 647308
Write OK of 2048 bytes to 0x00005800
rTime: 647308
Write OK of 2048 bytes to 0x00006000
rTime: 647308
Write OK of 2048 bytes to 0x00006800
rTime: 647308
Write OK of 2048 bytes to 0x00007000
rTime: 647308
Write OK of 2048 bytes to 0x00007800
rTime: 656638
Write OK of 2048 bytes to 0x00008000
rTime: 656648
Write OK of 2048 bytes to 0x00008800
rTime: 656648
Write OK of 2048 bytes to 0x00009000
rTime: 656648
Write OK of 2048 bytes to 0x00009800
rTime: 656648
Write OK of 2048 bytes to 0x0000A000
rTime: 656658
Write OK of 2048 bytes to 0x0000A800
rTime: 656658
Write OK of 2048 bytes to 0x0000B000
rTime: 656658
Write OK of 2048 bytes to 0x0000B800
rTime: 665228
Write OK of 2048 bytes to 0x0000C000
rTime: 665238
Write OK of 2048 bytes to 0x0000C800
rTime: 665238
Write OK of 2048 bytes to 0x0000D000
rTime: 665238
Write OK of 2048 bytes to 0x0000D800
rTime: 665238
Write OK of 2048 bytes to 0x0000E000
rTime: 665248
Write OK of 2048 bytes to 0x0000E800
rTime: 665248
Write OK of 2048 bytes to 0x0000F000
rTime: 665248
Write OK of 2048 bytes to 0x0000F800
rTime: 673878
Write OK of 2048 bytes to 0x00010000
rTime: 673888
Write OK of 2048 bytes to 0x00010800
rTime: 673888
Write OK of 2048 bytes to 0x00011000
rTime: 673888
Write OK of 2048 bytes to 0x00011800
rTime: 673888
Write OK of 2048 bytes to 0x00012000
rTime: 673898
Write OK of 2048 bytes to 0x00012800
rTime: 673898
Write OK of 2048 bytes to 0x00013000
rTime: 673898
Write OK of 2048 bytes to 0x00013800
rTime: 683208
Write OK of 2048 bytes to 0x00014000
rTime: 683218
Write OK of 2048 bytes to 0x00014800
rTime: 683218
Write OK of 2048 bytes to 0x00015000
rTime: 683218
Write OK of 2048 bytes to 0x00015800
rTime: 683218
Write OK of 2048 bytes to 0x00016000
rTime: 683228
Write OK of 2048 bytes to 0x00016800
rTime: 683228
Write OK of 2048 bytes to 0x00017000
rTime: 683228
Write OK of 2048 bytes to 0x00017800
rTime: 691798
Write OK of 2048 bytes to 0x00018000
rTime: 691808
Write OK of 2048 bytes to 0x00018800
rTime: 691808
Write OK of 2048 bytes to 0x00019000
rTime: 691808
Write OK of 2048 bytes to 0x00019800
rTime: 691808
Write OK of 2048 bytes to 0x0001A000
rTime: 691818
Write OK of 2048 bytes to 0x0001A800
rTime: 691818
Write OK of 2048 bytes to 0x0001B000
rTime: 691818
Write OK of 2048 bytes to 0x0001B800
rTime: 701998
Write OK of 2048 bytes to 0x0001C000
rTime: 702008
Write OK of 2048 bytes to 0x0001C800
rTime: 702008
Write OK of 2048 bytes to 0x0001D000
rTime: 702008
Write OK of 2048 bytes to 0x0001D800
rTime: 702008
Write OK of 2048 bytes to 0x0001E000
rTime: 702008
Write OK of 2048 bytes to 0x0001E800
rTime: 702008
Write OK of 2048 bytes to 0x0001F000
rTime: 702008
Write OK of 2048 bytes to 0x0001F800
rTime: 711328
Write OK of 2048 bytes to 0x00020000
rTime: 711338
Write OK of 2048 bytes to 0x00020800
rTime: 711338
Write OK of 2048 bytes to 0x00021000
rTime: 711338
Write OK of 2048 bytes to 0x00021800
rTime: 711338
Write OK of 2048 bytes to 0x00022000
rTime: 711348
Write OK of 2048 bytes to 0x00022800
rTime: 711348
Write OK of 2048 bytes to 0x00023000
rTime: 711348
Write OK of 2048 bytes to 0x00023800
rTime: 719918
Write OK of 2048 bytes to 0x00024000
rTime: 719928
Write OK of 2048 bytes to 0x00024800
rTime: 719928
Write OK of 2048 bytes to 0x00025000
rTime: 719928
Write OK of 2048 bytes to 0x00025800
rTime: 719928
Write OK of 2048 bytes to 0x00026000
rTime: 719938
Write OK of 2048 bytes to 0x00026800
rTime: 719938
Write OK of 2048 bytes to 0x00027000
rTime: 719938
Write OK of 2048 bytes to 0x00027800
rTime: 732148
Write OK of 2048 bytes to 0x00028000
rTime: 732158
Write OK of 2048 bytes to 0x00028800
rTime: 732158
Write OK of 2048 bytes to 0x00029000
rTime: 732158
Write OK of 2048 bytes to 0x00029800
rTime: 732158
Write OK of 2048 bytes to 0x0002A000
rTime: 732168
Write OK of 2048 bytes to 0x0002A800
rTime: 732168
Write OK of 2048 bytes to 0x0002B000
rTime: 732168
Write OK of 2048 bytes to 0x0002B800
rTime: 739348
Receive error: -0x50 //received MBEDTLS_ERR_NET_CONN_RESET
Bytes read: 0x0002C000
elapsed: 110140 //110 seconds
Could be some bug that has been solved?
Been reading releases page and seen a lot of lwip improvements but dunno if it's related
https://github.com/espressif/esp-idf/releases
Also, those are the calls I use before initializing HTTPS connection, there's something missing maybe?
Code: Select all
mbedtls_ssl_init(&ssl);
mbedtls_x509_crt_init(&cacert);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_ssl_config_init(&conf);
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0)) != 0)
mbedtls_x509_crt_parse(&cacert, server_root_cert_pem_start, server_root_cert_pem_end-server_root_cert_pem_start);
mbedtls_ssl_set_hostname(&ssl, https_webServer)
mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)
mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
mbedtls_ssl_conf_read_timeout(&conf, SSL_READ_TIMEOUT_MS);
mbedtls_ssl_setup(&ssl, &conf)
mbedtls_net_init(&server_fd)
mbedtls_net_connect(&server_fd, https_webServer, https_webPort, MBEDTLS_NET_PROTO_TCP)
mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);
mbedtls_ssl_handshake(&ssl)
mbedtls_ssl_get_verify_result(&ssl) //verify returns ok
mbedtls_ssl_write(&ssl, (const unsigned char *)buffer + written_bytes, length_request - written_bytes)
//this write would be the GET header
Code: Select all
GET https://server_domain/file.bin HTTP/1.1
Host: server_domain
Connection: Keep-Alive
User-Agent: ESP32
Accept: */*
Any advise of how can I find the problem would be very apreciated.
Thanks in advance
Edit: is it possible to redirect debug messages to, lets say, uart ch 2? the default uart ch is connected to other microcontroller which I need not to receive garbage info, so I have the debug esp_log messages disabled...