现象:HTTPS建立连接的同时,MQTT也建立连接。双方都在签名证书,导致CPU抢占,致使看门狗超时。
解决:在tls层加互斥锁,防止同时建立连接。
修改文件:x\Espressif\components\esp-tls\esp_tls_mbedtls.c
部分代码如下。
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
SemaphoreHandle_t _semaphore = NULL;
/**
* @brief Create TLS/SSL server session
*/
int esp_mbedtls_server_session_create(esp_tls_cfg_server_t *cfg, int sockfd, esp_tls_t *tls)
{
if (tls == NULL || cfg == NULL) {
return -1;
}
static bool fast = false;
if (!fast) {
fast = true;
_semaphore = xSemaphoreCreateMutex();
}
tls->role = ESP_TLS_SERVER;
tls->sockfd = sockfd;
xSemaphoreTake(_semaphore, portMAX_DELAY);
esp_err_t esp_ret = esp_create_mbedtls_handle(NULL, 0, cfg, tls);
xSemaphoreGive(_semaphore);
if (esp_ret != ESP_OK) {
ESP_LOGE(TAG, "create_ssl_handle failed, returned [0x%04X] (%s)", esp_ret, esp_err_to_name(esp_ret));
ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_ESP, esp_ret);
tls->conn_state = ESP_TLS_FAIL;
return -1;
}
tls->read = esp_mbedtls_read;
tls->write = esp_mbedtls_write;
int ret;
while ((ret = mbedtls_ssl_handshake(&tls->ssl)) != 0) {
if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
ESP_LOGE(TAG, "mbedtls_ssl_handshake returned -0x%04X", -ret);
mbedtls_print_error_msg(ret);
tls->conn_state = ESP_TLS_FAIL;
return ret;
}
}
return 0;
}