现象:HTTPS建立连接的同时,MQTT也建立连接。双方都在签名证书,导致CPU抢占,致使看门狗超时。
解决:在tls层加互斥锁,防止同时建立连接。
修改文件:xEspressifcomponentsesp-tlsesp_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;
}
上一篇:[N76E003][PCA9540BD][IIC扩展器] 一组IIC变两组IIC 使用方法
下一篇:[ESP32][esp-idf] AP+STA实现无线桥接 中转wifi信号
推荐阅读最新更新时间:2024-11-13 12:07
设计资源 培训 开发板 精华推荐
- DK-DEV-4SE530NES,Stratix IV E FPGA 开发板提供了一个用于开发和原型设计高性能的硬件平台
- EVAL-AD5433SDZ,使用 AD5433、10 位、高带宽乘法 DAC 和并行接口的评估板
- 涂鸦四路继电器开关
- EVAL-AD7685SDZ,用于 AD7685BRMZ 10 引脚 MSOP 的 16 位、250 kSPS PulSAR ADC 评估板
- 使用 NXP Semiconductors 的 TDA8933B 的参考设计
- 使用 ROHM Semiconductor 的 BD49K37G-TL 的参考设计
- VIN = 12V、VOUT = 5V、3A 时 ADP2302 降压稳压器的典型应用
- 用于光网络的光收发器
- AP3015典型应用LCD/OLED偏置电源典型应用
- TLE 4286 G 5V 稳压器的典型应用