引言:无线中继的主要作用是扩展WiFi信号,扩展WiFi后,令原本覆盖不到WiFi的地方也可以有WiFi,免去布线的烦恼。两个无线路由器桥接到一起,可以实现WiFi信号全覆盖。
实现的功能:WiFi模块能连接路由器,然后手机能连接WiFi模块,然后手机通过WiFi模块连接到路由器,能通过WiFi模块上网。
AP模式,指的无线接入点,创建一个无线网络的模式,家里的路由器就是最好的例子,通俗易懂的理解AP模式就是创造一个wifi然后我们用手机之类的设备去连接wifi,可以参考手机开个热点,可能不一定非常准确但是我们先这样理解
STA模式,每一个连接到热点上的手机都可以称为STA站点,也就是我们的ESP32在STA模式下工作就可以连接路由器发出的wifi
在cfg图形化界面中,输入CONFIG_LWIP_IP_FORWARD,勾选CONFIG_LWIP_IP_FORWARD。
在cfg图形化界面中,输入CONFIG_LWIP_IPV4_NAPT,勾选CONFIG_LWIP_IPV4_NAPT。
配置宏
# Set up wifi hotspot and share network
CONFIG_LWIP_IP_FORWARD=y
CONFIG_LWIP_IPV4_NAPT=y
demo.c代码如下:
#include <string.h>
#include <sys/param.h>
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_netif.h"
#include "lwip/inet.h"
#include "lwip/lwip_napt.h"
// 热点名称 密码 可连接数量
#define AP_WIFI_SSID "lisun"
#define AP_WIFI_PASS "xjq12345"
#define AP_MAX_STA_CONN 4
// 路由器wifi名称 密码
#define STA_WIFI_SSID "xjq"
#define STA_WIFI_PASS "xjq12345"
static const char *TAG = "LiSun";
static esp_netif_t* _esp_netif_sta = NULL;
static esp_netif_t* _esp_netif_ap = NULL;
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_AP_STACONNECTED) {
wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *)event_data;
ESP_LOGI(TAG, "station " MACSTR " join, AID=%d",
MAC2STR(event->mac), event->aid);
} else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
wifi_event_ap_stadisconnected_t *event = (wifi_event_ap_stadisconnected_t *)event_data;
ESP_LOGI(TAG, "station " MACSTR " leave, AID=%d",
MAC2STR(event->mac), event->aid);
}
}
static void sta_start_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
esp_wifi_connect();
}
static void got_ip_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
//No need to log, wifi driver logs automatically
esp_netif_dns_info_t dns;
if (esp_netif_get_dns_info(_esp_netif_sta, ESP_NETIF_DNS_MAIN, &dns) == ESP_OK) {
dhcps_dns_setserver((const ip_addr_t *)&dns.ip);
ESP_LOGI(TAG, "set dns to:" IPSTR, IP2STR(&dns.ip.u_addr.ip4));
}
}
static void wifi_init_softap(void)
{
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
wifi_config_t wifi_config = {
.ap = {
.ssid = AP_WIFI_SSID,
.ssid_len = strlen(AP_WIFI_SSID),
.password = AP_WIFI_PASS,
.max_connection = AP_MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK
},
};
if (strlen(AP_WIFI_PASS) == 0)
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
wifi_config_t cfg1 = {
.sta = {
.ssid = STA_WIFI_SSID,
.password = STA_WIFI_PASS,
.threshold = {.rssi=0, .authmode = WIFI_AUTH_WPA2_PSK},
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &cfg1));
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_START, sta_start_handler, NULL));
ESP_ERROR_CHECK(esp_wifi_start());
esp_netif_ip_info_t ip_info;
esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"), &ip_info);
char ip_addr[16];
inet_ntoa_r(ip_info.ip.addr, ip_addr, 16);
ESP_LOGI(TAG, "Set up softAP with IP: %s", ip_addr);
ESP_LOGI(TAG, "wifi_init_softap finished. SSID:'%s' password:'%s'", AP_WIFI_SSID, AP_WIFI_PASS);
}
void app_main(void)
{
// Initialize networking stack
ESP_ERROR_CHECK(esp_netif_init());
// Create default event loop needed by the main app
ESP_ERROR_CHECK(esp_event_loop_create_default());
// Initialize NVS needed by Wi-Fi
ESP_ERROR_CHECK(nvs_flash_init());
// Initialize Wi-Fi including netif with default config
_esp_netif_ap = esp_netif_create_default_wifi_ap();
_esp_netif_sta = esp_netif_create_default_wifi_sta();
// Initialise ESP32 in SoftAP mode
wifi_init_softap();
ip_addr_t dnsserver;
// Enable DNS (offer) for dhcp server
dhcps_offer_t dhcps_dns_value = OFFER_DNS;
dhcps_set_option_info(6, &dhcps_dns_value, sizeof(dhcps_dns_value));
// Set custom dns server address for dhcp server 默认跟随路由器 【推荐换成国内DNS】
dnsserver.u_addr.ip4.addr = htonl(0xC0A80301);
dnsserver.type = IPADDR_TYPE_V4;
dhcps_dns_setserver(&dnsserver);
#if IP_NAPT
// !!! 必须启动sta后再设置,不然ap无网络 !!! Set to ip address of softAP netif (Default is 192.168.4.1)
u32_t napt_netif_ip = 0xC0A80401;
ip_napt_enable(htonl(napt_netif_ip), 1);
#endif
}
ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
Wi-Fi + Bluetooth 5 (LE)
ESP32-S3 集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。ESP32-S3 的 Wi-Fi 和 Bluetooth LE 射频性能优越,在高温下也能稳定工作。
丰富的 IO 接口
ESP32-S3 拥有 45 个可编程 GPIO 以及 SPI、I2S、I2C、PWM、RMT、ADC、UART、SD/MMC 主机控制器和 TWAITM 控制器等常用外设接口。其中的 14 个 GPIO 可被配置为 HMI 交互的电容触摸输入端。此外,ESP32-S3 搭载了超低功耗协处理器 (ULP),支持多种低功耗模式,广泛适用于各类低功耗应用场景。
完善的安全机制
ESP32-S3 为物联网设备提供了完善的安全机制和保护措施,防止各类恶意攻击和威胁。它支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。ESP32-S3 还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。
支持 AI 加速
ESP32-S3 MCU 增加了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)。AI 开发者们通过 ESP-DSP 和 ESP-NN 库使用这些向量指令,可以实现高性能的图像识别、语音唤醒和识别等应用。ESP-WHO 和 ESP-Skainet 也将支持此功能。
更多推荐
[ESP32][esp-idf] AP+STA实现无线桥接 中转wifi信号 路由器
发布评论