[ESP32][esp-idf] AP+STA实现无线桥接 中转wifi信号 路由器

一、引言

无线中继的主要作用是扩展WiFi信号,扩展WiFi后,令原本覆盖不到WiFi的地方也可以有WiFi,免去布线的烦恼。两个无线路由器桥接到一起,可以实现WiFi信号全覆盖。

(1)实现的功能

WiFi模块能连接路由器,然后手机能连接WiFi模块,然后手机通过WiFi模块连接到路由器,能通过WiFi模块上网。

AP模式

指的无线接入点,创建一个无线网络的模式,家里的路由器就是最好的例子,通俗易懂的理解AP模式就是创造一个wifi然后我们用手机之类的设备去连接wifi,可以参考手机开个热点,可能不一定非常准确但是我们先这样理解

STA模式

每一个连接到热点上的手机都可以称为STA站点,也就是我们的ESP32在STA模式下工作就可以连接路由器发出的wifi

二、修改配置

  1. 在cfg图形化界面中,输入CONFIG_LWIP_IP_FORWARD,勾选CONFIG_LWIP_IP_FORWARD。
  2. 在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

}

四、介绍

  1. 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,支持用户配置数据缓存与指令缓存。

2. 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 射频性能优越,在高温下也能稳定工作。

3. 丰富的 IO 接口

ESP32-S3 拥有 45 个可编程 GPIO 以及 SPI、I2S、I2C、PWM、RMT、ADC、UART、SD/MMC 主机控制器和 TWAITM 控制器等常用外设接口。其中的 14 个 GPIO 可被配置为 HMI 交互的电容触摸输入端。此外,ESP32-S3 搭载了超低功耗协处理器 (ULP),支持多种低功耗模式,广泛适用于各类低功耗应用场景。

4. 完善的安全机制

ESP32-S3 为物联网设备提供了完善的安全机制和保护措施,防止各类恶意攻击和威胁。它支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。ESP32-S3 还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

5. 支持 AI 加速

ESP32-S3 MCU 增加了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)。AI 开发者们通过 ESP-DSP 和 ESP-NN 库使用这些向量指令,可以实现高性能的图像识别、语音唤醒和识别等应用。ESP-WHO 和 ESP-Skainet 也将支持此功能。

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jianqiang.xue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值