以下是四博智联ESP32-C3模组在AP模式下作为TCP服务器的示例,分别使用ESP-IDF和Arduino。
ESP-IDF 示例
-
CMakeLists.txt 中添加网络库:
idf_component_register(SRCS "main.c" INCLUDE_DIRS "." REQUIRES esp_netif REQUIRES lwip REQUIRES freertos )
-
main.c 文件:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "lwip/sockets.h"
#define WIFI_SSID "ESP32-AP"
#define WIFI_PASS "123456789"
void wifi_init_ap() {
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_config_t ap_config = {
.ap = {
.ssid = WIFI_SSID,
.ssid_len = strlen(WIFI_SSID),
.max_connection = 4,
.authmode = WIFI_AUTH_WPA_WPA2_PSK,
.password = WIFI_PASS,
},
};
esp_wifi_set_mode(WIFI_MODE_AP);
esp_wifi_set_config(WIFI_IF_AP, &ap_config);
esp_wifi_start();
}
void tcp_server_task(void *pvParameters) {
char rx_buffer[128];
char addr_str[INET6_ADDRSTRLEN];
struct sockaddr_in6 dest_addr;
int listen_sock, accept_sock;
listen_sock = socket(AF_INET6, SOCK_STREAM, 0);
if (listen_sock < 0) {
perror("Unable to create socket");
return;
}
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin6_family = AF_INET6;
dest_addr.sin6_addr = in6addr_any;
dest_addr.sin6_port = htons(8080);
bind(listen_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
listen(listen_sock, 1);
while (1) {
socklen_t addr_len = sizeof(dest_addr);
accept_sock = accept(listen_sock, (struct sockaddr *)&dest_addr, &addr_len);
if (accept_sock < 0) {
perror("Unable to accept connection");
continue;
}
int len = recv(accept_sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
if (len > 0) {
rx_buffer[len] = 0; // Null-terminate
printf("Received: %s\n", rx_buffer);
}
close(accept_sock);
}
}
void app_main() {
nvs_flash_init();
wifi_init_ap();
xTaskCreate(tcp_server_task, "tcp_server_task", 4096, NULL, 5, NULL);
}
Arduino 示例
#include <WiFi.h>
const char* ssid = "ESP32-AP";
const char* password = "123456789";
WiFiServer server(8080);
void setup() {
Serial.begin(115200);
// 设置为AP模式
WiFi.softAP(ssid, password);
// 启动服务器
server.begin();
Serial.println("服务器已启动");
}
void loop() {
WiFiClient client = server.available();
if (client) {
String request = "";
while (client.connected() && !client.available()) {
delay(1);
}
while (client.available()) {
char c = client.read();
request += c;
}
Serial.print("接收到: ");
Serial.println(request);
client.stop();
}
}
说明
- ESP-IDF 示例使用低级API,创建一个TCP服务器并监听端口8080。
- Arduino 示例利用
WiFi
库,设置为AP模式并处理客户端连接。
确保在开发环境中正确配置ESP-IDF和Arduino库。希望这些示例对你有帮助!如有疑问,请告诉我。