【发布时间】:2021-04-07 12:19:14
【问题描述】:
我正在通过 ESP-IDF 框架在 C/C++ 中使用 ESP32-S2-Saola-1M 板开发项目。一开始,我在 AP 模式下初始化 Wi-Fi,并启动 HTTP WebServer 以通过浏览器从用户那里获取 WiFi 数据。用户通过页面保存他的 Wi-Fi 数据(SSID 和 Passwd)后, HTTP 服务器应该关闭并且 Wi-Fi 从 AP 模式切换到 STA 模式 - 连接到用户的 Wi-Fi。我对这部分有问题。我不知道如何优雅地原则上正确地解决这个问题。那么有人可以向我描述任何解决方案或更好的想法吗?
我想过使用带有 while 循环和 POST 处理程序的方法。在通过 POST 请求从页面获取数据后,处理程序保存它们并将一些 bool 属性(例如,下面代码中的 hasData)设置为 true,并且 while 在方法中断/停止和应用程序中的其他代码可以继续。信号量之类的东西。简单地说:
- 启动 Wi-Fi(AP 模式)
- 启动网络服务器
- 等到用户发送他的 Wi-Fi 数据
- 停止网络服务器
- 停止 Wi-Fi AP 模式 -> 切换到 STA 模式
- 下一步行动...(测量、发送数据、深度睡眠等)
伪代码:
bool hasData = false;
static esp_err_t postHandler(httpd_req_t *request)
{
.
. //saves data from POST request
.
hasData = true;
return ESP_OK;
}
void waitForUser(void)
{
while(hasData != true) {
//just wait
}
}
static const httpd_uri_t postData = {
.uri = "/connection",
.method = HTTP_POST,
.handler = postHandler,
.user_ctx = NULL
};
static httpd_handle_t start_webserver(void)
{
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
if (httpd_start(&server, &config) == ESP_OK) {
httpd_register_uri_handler(server, &postData);
return server;
}
return NULL;
}
void stop_webserver(httpd_handle_t server)
{
if (server) {
httpd_stop(server);
}
}
void wifiAPInit(void)
{
.
. //Initialize wifi config for AP mode and start wifi
.
}
void app_main(void)
{
.
. //Initialize NVS and others...
.
httpd_handle_t server = NULL;
wifiAPinit();
server = start_webserver();
waitForUser();
stop_webserver(server);
.
. // start Wifi in STA mode and continue...
.
}
这个原则正确吗?
感谢您的建议!
【问题讨论】:
-
我不明白“切换到STA模式并连接到wifi”它连接到什么wifi?
-
我的意思是ESP连接到用户的Wi-Fi作为站