ESP IDF wifi配网
时间: 2024-10-09 17:00:34 浏览: 62
ESP-IDF(Espressif IoT Development Framework)是一个由Espressif Systems提供的开源框架,用于快速开发基于Espressif芯片(如ESP32和ESP8266)的物联网应用,包括Wi-Fi网络功能。配网(也称为网络连接配置)是指设备初次启动时通过Wi-Fi连接到路由器的过程。
在ESP-IDF中,配网通常是通过`esp_wifi_set_config()`函数设置Wi-Fi网络配置,然后调用`esp_wifi_start()`开始无线连接。开发者需要提供有效的SSID(网络名称)、密码以及认证模式等信息。流程通常包含以下几个步骤:
1. 初始化WiFi模块:通过`esp_wifi_init()`设置硬件配置。
2. 设置网络配置:创建一个`esp_event_handler_t`结构体并注册回调函数,用于处理Wi-Fi事件,如连接成功、失败等。
3. 配置网络参数:设置静态IP地址、子网掩码、默认网关和DNS服务器,如果需要自动获取则可以设置为0。
4. 开始Wi-Fi连接:调用`esp_wifi_start()`尝试连接预设的网络。
重要的是,在实际项目中,你需要确保应用程序在断电或重启后能保存和恢复配置,这通常通过存储库管理(例如Flash或NVS)实现。
相关问题
esp idf wifi tcp数据发送例程
以下是 ESP-IDF 中使用 WiFi TCP 发送数据的示例代码:
```c
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "tcpip_adapter.h"
#define EXAMPLE_ESP_WIFI_SSID "your_wifi_ssid"
#define EXAMPLE_ESP_WIFI_PASS "your_wifi_password"
#define EXAMPLE_ESP_MAXIMUM_RETRY 3
static const char *TAG = "example";
static EventGroupHandle_t s_wifi_event_group;
const int WIFI_CONNECTED_BIT = BIT0;
static int s_retry_num = 0;
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
}
ESP_LOGI(TAG,"connect to the AP fail");
} else if (event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
}
void wifi_init_sta(void)
{
s_wifi_event_group = xEventGroupCreate();
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_create_default());
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_sta finished.");
xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT, false, true, portMAX_DELAY);
}
void tcp_client_task(void *pvParameters)
{
char buffer[128];
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
vTaskDelete(NULL);
return;
}
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("192.168.1.100");
server_address.sin_port = htons(8080);
int err = connect(sock, (struct sockaddr *)&server_address, sizeof(server_address));
if (err != 0) {
ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
close(sock);
vTaskDelete(NULL);
return;
}
while (1) {
sprintf(buffer, "Hello from ESP32!");
int err = send(sock, buffer, strlen(buffer), 0);
if (err < 0) {
ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
break;
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
shutdown(sock, 0);
close(sock);
vTaskDelete(NULL);
}
void app_main()
{
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);
}
```
以上代码实现了一个 TCP 客户端任务,与 IP 地址为 192.168.1.100、端口号为 8080 的服务器建立连接,并每隔 2 秒发送一条字符串数据。在使用时需要将 EXAMPLE_ESP_WIFI_SSID 和 EXAMPLE_ESP_WIFI_PASS 替换为实际的 WiFi SSID 和密码,并且根据实际情况修改服务器的 IP 地址和端口号。
esp idf wifi tcp数据发送接收不同数组例程
下面是ESP-IDF的WiFi TCP数据发送与接收不同数组的例程:
发送方代码:
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/sockets.h"
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
#define HOST_IP_ADDR "192.168.1.100" // 远程主机IP地址
#define HOST_PORT 12345 // 远程主机端口号
static const char *TAG = "tcp_send";
void wifi_init_sta() {
static const wifi_sta_config_t sta_config = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(ESP_IF_WIFI_STA, &sta_config);
esp_wifi_start();
}
void tcp_send_task(void *pvParameters) {
char send_buf[1024] = {0};
while (1) {
int sockfd;
struct sockaddr_in dest_addr;
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd == -1) {
ESP_LOGE(TAG, "Failed to create socket. errno=%d", errno);
break;
}
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
dest_addr.sin_port = htons(HOST_PORT);
if (connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) != 0) {
ESP_LOGE(TAG, "Failed to connect. errno=%d", errno);
close(sockfd);
break;
}
ESP_LOGI(TAG, "Connected to server");
sprintf(send_buf, "Hello from ESP32!");
if (send(sockfd, send_buf, strlen(send_buf), 0) == -1) {
ESP_LOGE(TAG, "Failed to send. errno=%d", errno);
close(sockfd);
break;
}
ESP_LOGI(TAG, "Sent data");
close(sockfd);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
}
void app_main() {
nvs_flash_init();
tcpip_adapter_init();
esp_event_loop_create_default();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_init_sta();
xTaskCreate(tcp_send_task, "tcp_send_task", 4096, NULL, 5, NULL);
}
```
接收方代码:
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/sockets.h"
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
#define HOST_PORT 12345 // 监听端口号
static const char *TAG = "tcp_recv";
void wifi_init_sta() {
static const wifi_sta_config_t sta_config = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(ESP_IF_WIFI_STA, &sta_config);
esp_wifi_start();
}
void tcp_recv_task(void *pvParameters) {
char recv_buf[1024] = {0};
while (1) {
int sockfd, new_sockfd;
struct sockaddr_in dest_addr;
socklen_t addr_len = sizeof(dest_addr);
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd == -1) {
ESP_LOGE(TAG, "Failed to create socket. errno=%d", errno);
break;
}
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
dest_addr.sin_port = htons(HOST_PORT);
if (bind(sockfd, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) != 0) {
ESP_LOGE(TAG, "Failed to bind. errno=%d", errno);
close(sockfd);
break;
}
if (listen(sockfd, 5) != 0) {
ESP_LOGE(TAG, "Failed to listen. errno=%d", errno);
close(sockfd);
break;
}
ESP_LOGI(TAG, "Listening...");
new_sockfd = accept(sockfd, (struct sockaddr *)&dest_addr, &addr_len);
if (new_sockfd < 0) {
ESP_LOGE(TAG, "Failed to accept. errno=%d", errno);
close(sockfd);
break;
}
ESP_LOGI(TAG, "Connected to client");
while (1) {
int len = recv(new_sockfd, recv_buf, sizeof(recv_buf) - 1, 0);
if (len < 0) {
ESP_LOGE(TAG, "Failed to receive. errno=%d", errno);
break;
} else if (len == 0) {
ESP_LOGI(TAG, "Connection closed");
break;
} else {
recv_buf[len] = '\0';
ESP_LOGI(TAG, "Received data: %s", recv_buf);
}
}
close(new_sockfd);
close(sockfd);
}
vTaskDelete(NULL);
}
void app_main() {
nvs_flash_init();
tcpip_adapter_init();
esp_event_loop_create_default();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_init_sta();
xTaskCreate(tcp_recv_task, "tcp_recv_task", 4096, NULL, 5, NULL);
}
```
以上代码中,发送方通过WiFi连接到远程主机并向其发送数据,接收方在本地监听指定端口,并接收来自远程主机的数据。发送方和接收方都使用了1024字节的数组来存储数据,但实际上可以根据需要调整数组大小。
阅读全文