ESP32 "No such file or directory" 原生 ESP-IDF 组件
ESP32 "No such file or directory" for native ESP-IDF component
我正在尝试移植 file_serving 示例以使用 HTTPS。
我试图将 spiff 文件服务器功能移动到 esp-idf 中现有的 https_server 示例,但我收到错误:httpd_server_init:创建 ctrl 套接字时出错 (112)
我意识到这可能不是最简单的方法,相反我应该重新编写原始 file_serving 示例代码以改为使用 https。启动服务器的函数在file_server.c:
/* Function to start the file server */
esp_err_t start_file_server(const char *base_path)
{
static struct file_server_data *server_data = NULL;
/* Validate file storage base path */
if (!base_path || strcmp(base_path, "/spiffs") != 0) {
ESP_LOGE(TAG, "File server presently supports only '/spiffs' as base path");
return ESP_ERR_INVALID_ARG;
}
if (server_data) {
ESP_LOGE(TAG, "File server already started");
return ESP_ERR_INVALID_STATE;
}
/* Allocate memory for server data */
server_data = calloc(1, sizeof(struct file_server_data));
if (!server_data) {
ESP_LOGE(TAG, "Failed to allocate memory for server data");
return ESP_ERR_NO_MEM;
}
strlcpy(server_data->base_path, base_path,
sizeof(server_data->base_path));
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.uri_match_fn = httpd_uri_match_wildcard;
ESP_LOGI(TAG, "Starting HTTP Server");
if (httpd_start(&server, &config) != ESP_OK) {
ESP_LOGE(TAG, "Failed to start file server!");
return ESP_FAIL;
}
/* URI handler for getting uploaded files */
httpd_uri_t file_download = {
.uri = "/*", // Match all URIs of type /path/to/file
.method = HTTP_GET,
.handler = download_get_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_download);
/* URI handler for uploading files to server */
httpd_uri_t file_upload = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file
.method = HTTP_POST,
.handler = upload_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_upload);
/* URI handler for deleting files from server */
httpd_uri_t file_delete = {
.uri = "/delete/*", // Match all URIs of type /delete/path/to/file
.method = HTTP_POST,
.handler = delete_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_delete);
return ESP_OK;
}
main 函数引用了 start_file_server,如下所示:
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
* Read "Establishing Wi-Fi or Ethernet Connection" section in
* examples/protocols/README.md for more information about this function.
*/
ESP_ERROR_CHECK(example_connect());
/* Initialize file storage */
ESP_ERROR_CHECK(init_spiffs());
/* Start the file server */
ESP_ERROR_CHECK(start_file_server("/spiffs"));
}
我有 https_server 示例 运行 并且我有 https_mbedtls 客户端连接到它并且没有验证我的自签名证书的有效性。同样的 https_mbedtls 客户端将用于连接 file_server (https)。
原始 file_server 示例包括 esp_http_server.h。我假设我需要改为包含 esp_https_server.h
以下是我对其所做的更改:
/* Function to start the file server */
esp_err_t start_file_server(const char *base_path)
{
static struct file_server_data *server_data = NULL;
/* Validate file storage base path */
if (!base_path || strcmp(base_path, "/spiffs") != 0) {
ESP_LOGE(TAG, "File server presently supports only '/spiffs' as base path");
return ESP_ERR_INVALID_ARG;
}
if (server_data) {
ESP_LOGE(TAG, "File server already started");
return ESP_ERR_INVALID_STATE;
}
/* Allocate memory for server data */
server_data = calloc(1, sizeof(struct file_server_data));
if (!server_data) {
ESP_LOGE(TAG, "Failed to allocate memory for server data");
return ESP_ERR_NO_MEM;
}
strlcpy(server_data->base_path, base_path,
sizeof(server_data->base_path));
//***********
httpd_handle_t server = NULL;
httpd_ssl_config_t config = HTTPD_SSL_CONFIG_DEFAULT();
//***********
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end");
conf.cacert_pem = cacert_pem_start;
conf.cacert_len = cacert_pem_end - cacert_pem_start;
extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start");
extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end");
conf.prvtkey_pem = prvtkey_pem_start;
conf.prvtkey_len = prvtkey_pem_end - prvtkey_pem_start;
//***********
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.uri_match_fn = httpd_uri_match_wildcard;
ESP_LOGI(TAG, "Starting HTTPS Server");
//***********
if (httpd_ssl_start(&server, &config) != ESP_OK) {
ESP_LOGE(TAG, "Failed to start file server!");
return ESP_FAIL;
}
/* URI handler for getting uploaded files */
httpd_uri_t file_download = {
.uri = "/*", // Match all URIs of type /path/to/file
.method = HTTP_GET,
.handler = download_get_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_download);
/* URI handler for uploading files to server */
httpd_uri_t file_upload = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file
.method = HTTP_POST,
.handler = upload_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_upload);
/* URI handler for deleting files from server */
httpd_uri_t file_delete = {
.uri = "/delete/*", // Match all URIs of type /delete/path/to/file
.method = HTTP_POST,
.handler = delete_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_delete);
return ESP_OK;
}
当我通过 ESP-IDF 命令行刷写时,出现以下错误:
../main/file_server.c:22:10: fatal error: esp_https_server.h: No such file or directory
#include "esp_https_server.h"
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
为了解决这个问题,我尝试将“REQUIRES esp_https_server”添加到主目录中的 CMakeLists.txt。这用
替换了之前的错误
../main/main.c:16:10: fatal error: esp_spiffs.h: No such file or directory
#include "esp_spiffs.h"
^~~~~~~~~~~~~~
compilation terminated.
在我的 CMakeLists.txt 看起来像这样之前找不到其他要求的地方也会发生同样的事情:
idf_component_register(SRCS "main.c" "file_server.c"
INCLUDE_DIRS "."
EMBED_FILES "favicon.ico" "upload_script.html"
EMBED_TXTFILES "certs/cacert.pem"
"certs/prvtkey.pem"
REQUIRES esp_https_server spiffs nvs_flash protocol_examples_common)
此时我得到的错误是再次无法找到esp_https_server.h
../main/file_server.c:22:10: fatal error: esp_https_server.h: No such file or directory
#include "esp_https_server.h"
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
我希望你能理解我所处的令人沮丧的困境,我将非常感谢任何关于如何修复这个“没有这样的文件或目录”错误的意见,或者任何关于如何将这个例子移植到 https 的提示.谢谢。
我的指导教授查看了问题并找到了解决方案。以下是需要进行的更改:
在 sdkconfig 文件中包含以下行:
CONFIG_ESP_HTTPS_SERVER_ENABLE=y
文件 file_server.c 中的“config”而不是“conf”,并且 http 服务器的配置是 https 配置的子组件,需要一个“httpd”。在“配置”之后:
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end");
config.cacert_pem = cacert_pem_start;
config.cacert_len = cacert_pem_end - cacert_pem_start;
extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start");
extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end");
config.prvtkey_pem = prvtkey_pem_start;
config.prvtkey_len = prvtkey_pem_end - prvtkey_pem_start;
//***********
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.httpd.uri_match_fn = httpd_uri_match_wildcard;
我正在尝试移植 file_serving 示例以使用 HTTPS。
我试图将 spiff 文件服务器功能移动到 esp-idf 中现有的 https_server 示例,但我收到错误:httpd_server_init:创建 ctrl 套接字时出错 (112)
我意识到这可能不是最简单的方法,相反我应该重新编写原始 file_serving 示例代码以改为使用 https。启动服务器的函数在file_server.c:
/* Function to start the file server */
esp_err_t start_file_server(const char *base_path)
{
static struct file_server_data *server_data = NULL;
/* Validate file storage base path */
if (!base_path || strcmp(base_path, "/spiffs") != 0) {
ESP_LOGE(TAG, "File server presently supports only '/spiffs' as base path");
return ESP_ERR_INVALID_ARG;
}
if (server_data) {
ESP_LOGE(TAG, "File server already started");
return ESP_ERR_INVALID_STATE;
}
/* Allocate memory for server data */
server_data = calloc(1, sizeof(struct file_server_data));
if (!server_data) {
ESP_LOGE(TAG, "Failed to allocate memory for server data");
return ESP_ERR_NO_MEM;
}
strlcpy(server_data->base_path, base_path,
sizeof(server_data->base_path));
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.uri_match_fn = httpd_uri_match_wildcard;
ESP_LOGI(TAG, "Starting HTTP Server");
if (httpd_start(&server, &config) != ESP_OK) {
ESP_LOGE(TAG, "Failed to start file server!");
return ESP_FAIL;
}
/* URI handler for getting uploaded files */
httpd_uri_t file_download = {
.uri = "/*", // Match all URIs of type /path/to/file
.method = HTTP_GET,
.handler = download_get_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_download);
/* URI handler for uploading files to server */
httpd_uri_t file_upload = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file
.method = HTTP_POST,
.handler = upload_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_upload);
/* URI handler for deleting files from server */
httpd_uri_t file_delete = {
.uri = "/delete/*", // Match all URIs of type /delete/path/to/file
.method = HTTP_POST,
.handler = delete_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_delete);
return ESP_OK;
}
main 函数引用了 start_file_server,如下所示:
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
* Read "Establishing Wi-Fi or Ethernet Connection" section in
* examples/protocols/README.md for more information about this function.
*/
ESP_ERROR_CHECK(example_connect());
/* Initialize file storage */
ESP_ERROR_CHECK(init_spiffs());
/* Start the file server */
ESP_ERROR_CHECK(start_file_server("/spiffs"));
}
我有 https_server 示例 运行 并且我有 https_mbedtls 客户端连接到它并且没有验证我的自签名证书的有效性。同样的 https_mbedtls 客户端将用于连接 file_server (https)。
原始 file_server 示例包括 esp_http_server.h。我假设我需要改为包含 esp_https_server.h
以下是我对其所做的更改:
/* Function to start the file server */
esp_err_t start_file_server(const char *base_path)
{
static struct file_server_data *server_data = NULL;
/* Validate file storage base path */
if (!base_path || strcmp(base_path, "/spiffs") != 0) {
ESP_LOGE(TAG, "File server presently supports only '/spiffs' as base path");
return ESP_ERR_INVALID_ARG;
}
if (server_data) {
ESP_LOGE(TAG, "File server already started");
return ESP_ERR_INVALID_STATE;
}
/* Allocate memory for server data */
server_data = calloc(1, sizeof(struct file_server_data));
if (!server_data) {
ESP_LOGE(TAG, "Failed to allocate memory for server data");
return ESP_ERR_NO_MEM;
}
strlcpy(server_data->base_path, base_path,
sizeof(server_data->base_path));
//***********
httpd_handle_t server = NULL;
httpd_ssl_config_t config = HTTPD_SSL_CONFIG_DEFAULT();
//***********
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end");
conf.cacert_pem = cacert_pem_start;
conf.cacert_len = cacert_pem_end - cacert_pem_start;
extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start");
extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end");
conf.prvtkey_pem = prvtkey_pem_start;
conf.prvtkey_len = prvtkey_pem_end - prvtkey_pem_start;
//***********
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.uri_match_fn = httpd_uri_match_wildcard;
ESP_LOGI(TAG, "Starting HTTPS Server");
//***********
if (httpd_ssl_start(&server, &config) != ESP_OK) {
ESP_LOGE(TAG, "Failed to start file server!");
return ESP_FAIL;
}
/* URI handler for getting uploaded files */
httpd_uri_t file_download = {
.uri = "/*", // Match all URIs of type /path/to/file
.method = HTTP_GET,
.handler = download_get_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_download);
/* URI handler for uploading files to server */
httpd_uri_t file_upload = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file
.method = HTTP_POST,
.handler = upload_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_upload);
/* URI handler for deleting files from server */
httpd_uri_t file_delete = {
.uri = "/delete/*", // Match all URIs of type /delete/path/to/file
.method = HTTP_POST,
.handler = delete_post_handler,
.user_ctx = server_data // Pass server data as context
};
httpd_register_uri_handler(server, &file_delete);
return ESP_OK;
}
当我通过 ESP-IDF 命令行刷写时,出现以下错误:
../main/file_server.c:22:10: fatal error: esp_https_server.h: No such file or directory #include "esp_https_server.h" ^~~~~~~~~~~~~~~~~~~~ compilation terminated.
为了解决这个问题,我尝试将“REQUIRES esp_https_server”添加到主目录中的 CMakeLists.txt。这用
替换了之前的错误../main/main.c:16:10: fatal error: esp_spiffs.h: No such file or directory #include "esp_spiffs.h" ^~~~~~~~~~~~~~ compilation terminated.
在我的 CMakeLists.txt 看起来像这样之前找不到其他要求的地方也会发生同样的事情:
idf_component_register(SRCS "main.c" "file_server.c"
INCLUDE_DIRS "."
EMBED_FILES "favicon.ico" "upload_script.html"
EMBED_TXTFILES "certs/cacert.pem"
"certs/prvtkey.pem"
REQUIRES esp_https_server spiffs nvs_flash protocol_examples_common)
此时我得到的错误是再次无法找到esp_https_server.h
../main/file_server.c:22:10: fatal error: esp_https_server.h: No such file or directory #include "esp_https_server.h" ^~~~~~~~~~~~~~~~~~~~ compilation terminated.
我希望你能理解我所处的令人沮丧的困境,我将非常感谢任何关于如何修复这个“没有这样的文件或目录”错误的意见,或者任何关于如何将这个例子移植到 https 的提示.谢谢。
我的指导教授查看了问题并找到了解决方案。以下是需要进行的更改:
在 sdkconfig 文件中包含以下行: CONFIG_ESP_HTTPS_SERVER_ENABLE=y
文件 file_server.c 中的“config”而不是“conf”,并且 http 服务器的配置是 https 配置的子组件,需要一个“httpd”。在“配置”之后:
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end");
config.cacert_pem = cacert_pem_start;
config.cacert_len = cacert_pem_end - cacert_pem_start;
extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start");
extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end");
config.prvtkey_pem = prvtkey_pem_start;
config.prvtkey_len = prvtkey_pem_end - prvtkey_pem_start;
//***********
/* Use the URI wildcard matching function in order to
* allow the same handler to respond to multiple different
* target URIs which match the wildcard scheme */
config.httpd.uri_match_fn = httpd_uri_match_wildcard;