用无线访问服务器怎么配置,ESP-IDF:通过http服务器配置wifi连接

我正在尝试使用ESP-IDF框架创建ESP32应用程序,我想通过http服务器进行wifi STA配置。设备会在启动时检查Flash中是否已设置配置。如果是这样,它将尝试连接到访问点,否则它将运行访问点和http服务器本身,然后用户需要连接wifi并在浏览器中转到192.168.4.1,才能选择ssid并输入密码。

提交表单后,我尝试连接选定的wifi接入点,但收到201错误代码(未找到ap)

访问点扫描:

const pathString = "links.video_link";

const getVideoURL = obj => pathString

.split('.')

.reduce((a, prop) => a[prop], obj);

配置保存功能:

esp_err_t index_get_handler(httpd_req_t *req)

{

wifi_scan_config_t scanConf = {

.ssid = NULL,

.bssid = NULL,

.channel = 0,

.show_hidden = 1

};

ESP_ERROR_CHECK(esp_wifi_scan_start(&scanConf, 0));

uint16_t apCount;

if( xQueueReceive( wifi_stations_count, &( apCount ), ( TickType_t ) 1000 ) == pdFALSE)

{

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于 ESP-IDF 4.3.5 的 ESP32-C3 的 WiFi 连接和数据收发的例程,同时也包含了重连机制。请确保你已经正确安装了 ESP-IDF 开发环境并且熟悉 ESP-IDF 开发流程。 ```c #include <stdio.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_event_loop.h" #include "esp_log.h" #include "esp_wifi.h" #include "esp_system.h" #include "nvs_flash.h" #include "lwip/err.h" #include "lwip/sys.h" #include "lwip/sockets.h" #define WIFI_SSID "your_wifi_ssid" // WiFi SSID #define WIFI_PASS "your_wifi_password" // WiFi 密码 #define HOST_IP_ADDR "192.168.0.100" // 目标 IP 地址 #define HOST_PORT 8080 // 目标端口号 static const char *TAG = "example"; /* WiFi 事件处理函数 */ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) { switch (event->event_id) { case SYSTEM_EVENT_STA_START: // 开始连接 WiFi ESP_LOGI(TAG, "Connecting to WiFi..."); esp_wifi_connect(); break; case SYSTEM_EVENT_STA_GOT_IP: // 成功获取到 IP 地址 ESP_LOGI(TAG, "Connected to WiFi! IP address: %s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); break; case SYSTEM_EVENT_STA_DISCONNECTED: // WiFi 断开连接 ESP_LOGI(TAG, "WiFi disconnected! Reconnecting..."); esp_wifi_connect(); break; default: break; } return ESP_OK; } /* 连接 WiFi */ static void wifi_init_sta(void) { // 初始化 WiFi tcpip_adapter_init(); wifi_event_group = xEventGroupCreate(); ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL) ); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); // 设置 WiFi STA 模式 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); wifi_config_t wifi_config = { .sta = { .ssid = WIFI_SSID, .password = WIFI_PASS, .bssid_set = 0 } }; ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); } /* 连接到目标服务器并发送/接收数据 */ static void tcp_client_task(void *pvParameters) { char rx_buffer[128]; char addr_str[128]; int addr_family; int ip_protocol; int sock = -1; struct sockaddr_in dest_addr; dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(HOST_PORT); addr_family = AF_INET; ip_protocol = IPPROTO_IP; inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1); while (1) { if (sock == -1) { // 创建套接字 sock = socket(addr_family, SOCK_STREAM, ip_protocol); if (sock < 0) { ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); break; } // 连接服务器 int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); if (err != 0) { ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno); close(sock); sock = -1; continue; } ESP_LOGI(TAG, "Successfully connected to server %s:%d", addr_str, HOST_PORT); } // 发送数据 char tx_buffer[] = "Hello, world!"; int err = send(sock, tx_buffer, sizeof(tx_buffer), 0); if (err < 0) { ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); break; } // 接收数据 int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0); if (len < 0) { ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno); break; } else if (len == 0) { ESP_LOGW(TAG, "Server closed the connection"); break; } else { rx_buffer[len] = 0; ESP_LOGI(TAG, "Received %d bytes: %s", len, rx_buffer); } // 延时 1 秒 vTaskDelay(1000 / portTICK_PERIOD_MS); } if (sock != -1) { ESP_LOGE(TAG, "Shutting down socket and restarting..."); shutdown(sock, 0); close(sock); } vTaskDelete(NULL); } void app_main(void) { // 初始化 NVS ESP_ERROR_CHECK(nvs_flash_init()); // 连接 WiFi wifi_init_sta(); // 创建数据收发任务 xTaskCreate(tcp_client_task, "tcp_client_task", 4096, NULL, 5, NULL); } ``` 这个例程中,我们先通过 `wifi_init_sta()` 函数连接到指定的 WiFi 网络,然后在 `tcp_client_task()` 函数中创建一个 TCP 客户端套接字,并连接到指定的 IP 地址和端口号。在发送和接收数据的过程中,如果出现错误或者连接断开,我们会关闭套接字并重新连接服务器。整个过程会一直循环执行,直到程序结束。 请注意,这个例程只是一个基本的示例,实际使用时需要根据具体需求进行调整。同时,为了保证代码的可读性和可维护性,我们省略了一些错误处理和异常情况的处理,实际使用时需要根据具体情况进行补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值