ESP32-C3, esp-idf 4.3.5, 连入指定无线网后同指定ip收发数据,提供个例程
时间: 2024-01-13 07:03:39 浏览: 29
以下是一个简单的 ESP32-C3 示例代码,可以连接到指定的 Wi-Fi 网络并使用指定的 IP 地址发送和接收数据。请注意,此示例代码使用 ESP-IDF 4.3.5 版本。
```c
#include <stdio.h>
#include <string.h>
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "esp_eth.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#include "lwip/dns.h"
#include "lwip/sockets.h"
/* FreeRTOS event group to signal when we are connected */
static EventGroupHandle_t wifi_event_group;
const int CONNECTED_BIT = BIT0;
static const char *TAG = "example";
/* Wi-Fi configuration */
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"
#define EXAMPLE_ESP_WIFI_MODE_AP WIFI_MODE_APSTA
#define EXAMPLE_ESP_MAXIMUM_RETRY 5
/* IP address and port to connect to */
#define EXAMPLE_DEFAULT_IP "192.168.1.100"
#define EXAMPLE_DEFAULT_PORT 8080
/* Socket file descriptor */
int sockfd;
/* Event handler for Wi-Fi events */
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch(event->event_id) {
case SYSTEM_EVENT_STA_START:
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
esp_wifi_connect();
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
/* Initializes Wi-Fi */
static void wifi_init_sta(void)
{
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 = WIFI_SSID,
.password = WIFI_PASSWORD,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(EXAMPLE_ESP_WIFI_MODE_AP));
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.");
/* Wait for Wi-Fi connection */
xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
}
/* Connects to server */
static void connect_to_server(const char* ip, int port)
{
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr(ip);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(port);
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sockfd < 0) {
ESP_LOGE(TAG, "Failed to create socket: errno %d", errno);
return;
}
ESP_LOGI(TAG, "Socket created, connecting to server...");
int err = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
if (err != 0) {
ESP_LOGE(TAG, "Failed to connect to server: errno %d", errno);
return;
}
ESP_LOGI(TAG, "Successfully connected to server");
}
/* Sends data to server */
static void send_data(const char* data)
{
int err = send(sockfd, data, strlen(data), 0);
if (err < 0) {
ESP_LOGE(TAG, "Failed to send data: errno %d", errno);
return;
}
ESP_LOGI(TAG, "Sent data: %s", data);
}
/* Receives data from server */
static void receive_data(char* buffer, int buffer_size)
{
int len = recv(sockfd, buffer, buffer_size - 1, 0);
if (len < 0) {
ESP_LOGE(TAG, "Failed to receive data: errno %d", errno);
return;
}
buffer[len] = '\0';
ESP_LOGI(TAG, "Received data: %s", buffer);
}
void app_main()
{
/* Initialize NVS */
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
/* Initialize TCP/IP stack */
tcpip_adapter_init();
/* Initialize Wi-Fi */
wifi_init_sta();
/* Connect to server */
connect_to_server(EXAMPLE_DEFAULT_IP, EXAMPLE_DEFAULT_PORT);
/* Send and receive data */
send_data("Hello, server!");
char buffer[128];
receive_data(buffer, sizeof(buffer));
/* Clean up */
shutdown(sockfd, 0);
close(sockfd);
}
```
请注意,此代码仅连接到指定的 Wi-Fi 网络并使用指定的 IP 地址发送和接收数据。您需要根据您的需求进行修改和调整。