54 ESP32Wifi模块之开启AP+STA共存及IP_NAPT模式

56 ESP32 NAT_Router模式踩的坑记录 56.1 引言 今日前来加班,需要搞定ESP32 的NAT模式,还好一切顺利。之前是参考这个例程。 但我只是参考了例程的代码,没有按照他的步骤重新替换ESP-IDF里面的lwip的文件,导致nat_router似乎一下可以,一下又不行。 昨天晚上搜索问题的时候又重新搜到下面这个示例工程,之前在参考下图工程的时候,并没有仔细阅读步骤,导致迷迷糊糊的问题,并且不成功,今天认真阅读后经实践,成功实现nat_router功能。 56.2... 阅读详情
AI摘要

本文介绍了如何在ESP32模块中使用esp32WiFi模组实现AP+STA模式,并重点讲解了如何配置IP_NAPT模式,让手机通过WiFi模块间接连接路由器上网。教程详细到配置步骤和关键代码,适合初学者参考。

54.1 引言

探索完4G模块的应用、蓝牙模块的应用,最近开始了WiFi模块的使用。WiFi模块我们选择了广泛应用的esp32WiFi模组,所以就重新踏入了WiFi探索之旅。

然后项目上要用到WiFi的AP+STA模式,并且要开启NAT模式,就是WiFi模块能连接路由器,然后手机能连接WiFi模块,然后手机通过WiFi模块连接到路由器,能通过WiFi模块上网。

54.2 AP+STA+IP_NAPT代码

话不多说,先上app_main.c代码。这个代码也是网上搜集到的,自己理解后翻炒了一遍吧。。

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_wpa2.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
#include "lwip/opt.h"

#if IP_NAPT
#include "lwip/lwip_napt.h"
#endif

#include "lwip/err.h"
#include "lwip/sys.h"

#define MY_DNS_IP_ADDR 				0x08080808 // 8.8.8.8

//模块AP自己的SSID和PWD
#define HT_ESP32_AP_SSID 			CONFIG_ESP_AP_SSID
#define HT_ESP32_AP_PASS 			CONFIG_ESP_AP_PASSWORD
//连接路由的SSID和PWD
#define HT_ESP32_STA_SSID      		"hello"
#define HT_ESP32_STA_PASS      		"world"

#define HT_ESP32_MAXIMUM_RETRY		(10)

/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t 			s_wifi_event_group;

/* The event group allows multiple bits for each event, but we only care about one event
 * - are we connected to the AP with an IP? */
const int WIFI_CONNECTED_BIT = BIT0;

static const char *TAG = "wifi apsta";

static int s_retry_num = 0;

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:
    ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->event_info.got_ip.ip_info.ip));
    s_retry_num = 0;
    xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    break;
  case SYSTEM_EVENT_STA_DISCONNECTED:
    {

	
      if (s_retry_num < HT_ESP32_MAXIMUM_RETRY) 
	  {
		esp_wifi_connect();
		xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
		s_retry_num++;
		ESP_LOGI(TAG,"retry to connect to the AP");
      }
      ESP_LOGI(TAG,"connect to the AP failed:%d", event->event_info.disconnected.reason);
      break;
    }
  case SYSTEM_EVENT_AP_STACONNECTED:
    ESP_LOGI(TAG,"station connected");
    break;
  case SYSTEM_EVENT_AP_STADISCONNECTED:
    ESP_LOGI(TAG,"station disconnected");
    break;
  default:
    break;
  }
  return ESP_OK;
}

void wifi_init_sta()
{
    ip_addr_t dnsserver;
    //tcpip_adapter_dns_info_t dnsinfo;

    s_wifi_event_group = xEventGroupCreate();

    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL) );

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));


    /* ESP STATION CONFIG */
    wifi_config_t sta_config = {
	.sta = {
		    .ssid 		= HT_ESP32_STA_SSID,
		    .password 	= HT_ESP32_STA_PASS,
			/* 设置密码意味着工作站将连接到所有安全模式,包括WEP/WPA.
			 * However these modes are deprecated and not advisable to be used. Incase your Access point
			 * doesn't support WPA2, these mode can be enabled by commenting below line */
			.threshold.authmode = WIFI_AUTH_WPA2_PSK,
			.bssid_set = false,

			.pmf_cfg = {
				.capable = true,
				.required = false
			},
		},
    };

    /* ESP AP CONFIG */
    wifi_config_t ap_config = {
	.ap = {
	    .ssid 			= HT_ESP32_AP_SSID,
	    .channel 		= 0,
	    .authmode 		= WIFI_AUTH_WPA2_PSK,
	    .password 		= HT_ESP32_AP_PASS,
	    .ssid_hidden 	= 0,
	    .max_connection	= 4,
	    .beacon_interval = 100
	}
    };

    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &sta_config) );
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &ap_config) );

    // 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
    dnsserver.u_addr.ip4.addr = htonl(MY_DNS_IP_ADDR);
    dnsserver.type = IPADDR_TYPE_V4;
    dhcps_dns_setserver(&dnsserver);

    //tcpip_adapter_get_dns_info(TCPIP_ADAPTER_IF_AP, TCPIP_ADAPTER_DNS_MAIN, &dnsinfo);
   // ESP_LOGI(TAG, "DNS IP:" IPSTR, IP2STR(&dnsinfo.ip.u_addr.ip4));

    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "wifi_init_apsta finished.");
    ESP_LOGI(TAG, "connect to ap SSID: %s ", sta_config.sta.ssid);
}

static void htHrint_task(void *pvParameters)
{
	while(1)
	{
		ESP_LOGI(TAG, "hello world\r\n");
		vTaskDelay(1000 / portTICK_PERIOD_MS);	/* 延时1000ms*/
	}
}


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);

  // Setup WIFI
  wifi_init_sta();
//这里就是打开nat转换的代码,但是除了代码这里要有,还需要配置
#if IP_NAPT
  u32_t napt_netif_ip = 0xC0A80401; // Set to ip address of softAP netif (Default is 192.168.4.1)
  ip_napt_enable(htonl(napt_netif_ip), 1);
  ESP_LOGI(TAG, "------------------------>NAT is enabled");
#endif

	xTaskCreate(htHrint_task, "HTTask", 4096, NULL, 5, NULL);


}

54.3 IP_NAPT模式配置

上述代码中,已经有开启IP_NAPT模式的重要几行代码,但需要关注的是,IP_NAPT这个宏是在哪里开启的,这是本blog的价值所在。

对于新手(像我一样新的应该是不知道),这个可以通过idf.py menuconfig 图形界面进行配置,这个配置在下面这个链接是有相关说明的。

Project Configuration - ESP32 - — ESP-IDF 编程指南 latest 文档

 由上述图片可知,需要配置两个宏才能打开nat的转换功能。

配置步骤:

1.使用命令打开配置页面,并进入component config

idf.py menuconfig

 2.在component config找到LWIP,然后进入

 3. 进入后选中下图的这两个

 4.保存,编译,并重新下载程序即可

over!

ESP32将继续探究中.........

基于ESP32搭建物联网服务器三(AP模式与STA模式共存) 在该模式下,可以同时接受WIFI连接到ESP32,也可以把ESP32连接到已有的WIFI上。设置为AP和STA共存模式。设置ESP32AP模式与STA模式共存的库为。一、WiFi.begin(); 阅读详情

相关推荐

ESP32 STA AP模式下,设备连接 ESP的AP 后无法上网,无法访问域名上网(或者Failed to enable NAPT)

ESP32 STA AP模式下,设备连接 ESP的AP 后无法上网,无法访问域名上网(或者Failed to enable NAPT)1.可能是ESP STA模式未成功连接到路由器,确保 STA 成功连接到外部网络。2.检查 STA 和 AP 的网络配置是否正确,避免子网冲突。3.ESP32的NAPT功能未正确启用,确保 menuconfig 中已启用 IP_NAPT。4.DNS服务器未正确配置。

qq_34885669的博客 1539

ESP32中继模式STA+AP共存

esp32中继功能,sta+ap共存

yehe111的博客 3661

ESP32无线桥接避坑指南:为什么你的AP+STA模式上不了网?

本文深入解析ESP32无线桥接中AP+STA模式网络不通的常见问题,重点探讨NAPT启动时机、DNS配置等关键因素。通过实战案例和代码示例,提供从基础排查到高级优化的完整解决方案,帮助开发者快速定位并解决无线桥接中的网络连接问题。

weixin_26918763的博客 336

设计一个针对esp32的4g转网口,用eth接口的方案

下面是一个针对 ESP32(或 ESP32-S3/ESP32-C3 等)实现“4G 转网口”方案的设计说明和参考实现思路。该方案的总体目标是:使用 ESP32 搭配 4G 模块实现 WAN 接入(4G 网络),并通过 ESP32 外接的以太网 PHY 模块(如 LAN8720、IP101 等)提供有线以太网接口将互联网连接分享给下游设备。这相当于利用 ESP32 + 4G 模块创建一个简单的 4G 转 Ethernet 的网关设备。

qq_41126242的博客 5918

esp_wifi_repeater:功能齐全的WiFi中继器(正确:WiFi NAT路由器)

esp_wifi_repeater 功能齐全的WiFi中继器(正确的是:WiFi NAT路由器) 这是esp8266和esp8285上的WiFi NAT路由器的实现。 它还包括对具有ACL的数据包筛选防火墙,端口映射,流量整形,用于远程监视(或数据包嗅探)的挂钩,MQTT管理接口,简单的GPIO交互以及电源管理的支持。 对于在网格中覆盖多个路由器以覆盖更大区域的设置, 包含了新模式“ Automesh”。 如果您正在寻找将NAT功能集成到Arduino项目中的方法,请参阅 。 可在以下找到ESP32的类似基本NAT功能: : 。 典型的使用场景包括: 适用于现有WiFi网络的简单范围扩展器 电池供电的室外(网状)网络 为访客设置其他具有不同SSID /密码的WiFi网络 为物联网设备设置安全且受限制的网络 将WPA2企业网络转换为WPA-PSK 监控探针以进行WiFi流量

第10章:位同步与Gardner环路(1)

第10章(1)内容如下:一、位同步与载波同步的区别1、采样时钟相位偏差的影响2、采样时钟频率偏差的影响二、Gardner环路算法与插值方法1、插值滤波器2、Gardner误差检查算法三、Gardner环路中环路滤波器与数字振荡器设计1、环路滤波器2、数控振荡器(NCO)四、Gardner环路的可运行MATLAB代码五、参考资料六、致谢 最近搞懂了Gardner环路的一些知识,于是更新第10章——位同步。 如果你稍不留意的话,这可能是你在网上能看到的介绍Gardner环路及其MATLAB仿真最详细的一篇文章了

weixin_44283855的博客 1万+

ESP32/ESP8266中查看并修改DHCP的配置信息

1.DHCP 简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升IP地址的使用率。 简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。它遵循服务器-客户端模型,在WiFi架构中,AP(即热点,提供连网功能的设备)中运行DHCPS(即DHCP-Serve

物联网老王的博客,公众号同名 6237

LilyGO T-Watch学习(一)环境搭建,编译下载

1、安装arduino IDE, 安装后按照说明添加lib IDE上选择“项目->加载库->添加.ZIP库”,选择C:\Users\用户名\Documents\Arduino\libraries\下的TTGO_TWatch_Library-master.zip; 查看是否添加成功: 项目->加载库,滑到最后可看见已添加的TTGO... 参考:https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library 2、安装esp32 ardui

hxl5955的博客 2906

ESP-IDF+vscode开发ESP32 联网篇第八讲——Wi-Fi 协议与通信基础

本文系统梳理 ESP32 Wi‑Fi 通信基础:从 IEEE 802.11 的 PHY、MAC、LLC 协议层职责与信道接入机制出发,说明数据经 IP、TCP 到 MQTT 等应用层的封装与传输过程;结合 MQTT 往返示例,解析 ARP、IP、MAC、子网掩码、网关和 DNS 的协作关系。进一步介绍 ESP32 在 STA 与 SoftAP 模式下的 IP 获取、静态地址配置及 DHCP 使用,并区分局域网、广域网和跨网段通信,帮助开发者定位连接、路由与无线链路问题。

Pai_SM的博客 293

Visual C++与WPF混合开发:C++/CLI桥接技术实现现代化桌面应用

在桌面应用开发领域,混合编程技术是连接不同技术栈、复用核心资产的关键手段。其核心原理在于通过特定的桥接层,实现托管代码与非托管代码之间的互操作,从而打破语言和运行时环境的壁垒。这项技术的核心价值在于,它允许开发者将高性能、高稳定性的原生C++业务逻辑库,与现代化、高表现力的WPF用户界面无缝结合,避免了重写核心代码的巨大成本和风险。在工业控制、数据可视化、上位机软件等对性能和界面均有高要求的应用场景中,这种架构尤为适用。本文以C++/CLI作为桥接技术,详细演示了如何构建一个包含原生C++核心层、C++/C

weixin_33146151的博客 278

变压器铁心100Hz振动噪声的COMSOL磁致伸缩仿真全流程

磁致伸缩是铁磁材料在磁场作用下发生尺寸变化的现象,也是变压器铁心振动与噪声产生的根本原因。由于应变与磁通密度近似成平方关系,50Hz电网激励下铁心振动基频为100Hz。借助COMSOL多物理场仿真,可将磁场计算结果映射为结构应力和变形,完成“电磁—结构”单向耦合分析。该技术广泛应用于变压器振动噪声预测、结构优化及故障诊断等工程场景。本文从磁致伸缩物理机理出发,系统梳理了材料参数、等效建模、边界条件设置和结果校核等关键步骤,帮助工程师掌握从磁致伸缩到结构变形的完整仿真链路,解决实际工程对标难题。

weixin_33796177的博客 313

分享一个ESP32中继

esp32_nat_router

可可芯意的博客 2183

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

IP协议与NAT/NAPT技术

不要囿于应用,程序员应该了解的网络层原理。

geek! 2791

深度学习二分类实战:用Python+Keras搞定基因表达数据预测(附完整代码)

本文详细介绍了如何使用Python和Keras构建深度学习模型进行基因表达数据的二分类预测。通过数据预处理、特征选择、神经网络构建及优化策略,特别针对小样本场景提供了调参技巧和模型解释方法。文章还包含完整的代码示例,帮助读者快速掌握深度学习在生物信息学中的应用。

weixin_30642561的博客 245

抗性基因分析避坑指南:从数据库选择到结果解读的全流程经验分享

本文系统分享了抗性基因分析从数据库选择到结果解读的全流程避坑经验。针对宏基因组研究,重点剖析了SARG、BacMet等核心数据库的适用场景与组合策略,并提供了实验设计、序列比对阈值设定、丰度归一化及结果生物学解读的关键优化建议,旨在帮助研究者获得更可靠、深入的分析结果。

weixin_29233333的博客 200

ESP32 双网卡时默认路由选择机制分析

由于 ESP32 可以同时使用以太网和 Wi-Fi 接入网络,此篇博客用来分析 ESP32 双网卡(Wi-Fi & 以太网同时存在)时使用 TCP 等协议通信会使用哪个 IP。此处会以 websocket 例程为例进行测试分析。 注:对应的 IDF commit 为 c9646ff0b (HEAD, tag: v4.3) versions: Update version to 4.3.0。 1 环境配置 打开终端,按照 ESP-IDF 编程指南 搭建 IDF 环境,然后在工程对应的终端下输入 i

ESP 技术分享,推动万物互联 4568

HTML炫酷烟花④(完整代码)

HTML语言实现炫酷烟花的完整代码。

AIGC 9万+

ESP32 IDF开发 应用篇⑫Wifi STA模式和AP模式的使用

在前面章节已经为大家介绍了ESP32的基本应用,idf框架已经有了基本认识。从本章开始将带领大家一起探索esp32的核心功能wifi。(1) Wifi的3中工作模式•Station模式,也叫站点模式;•AP模式,也叫Soft-AP模式,可以理解为WiFi热点模式;•以上两种的集合模式,Station 兼Soft-AP,也是Mesh NetWork的实现基础;任何基于ESP32的WiFi功能开发,都是基于上面其中一种工作模式来进行开发。所以,它们是我们WiFi基础学习的重点。

lu330274924的博客 7146

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

四、ESP32单片机wifi的AP与STA模式使用

在ESP32的 WIFI 中有两种模式是我们今天需要认识的,我们平时的wifi也是一样,他们就是我们今天的主题,AP模式与STA模式 > AP模式,指的无线接入点,创建一个无线网络的模式,家里的路由器就是最好的例子,通俗易懂的理解AP模式就是创造一个wifi然后我们用手机之类的设备去连接wifi,可以参考手机开个热点,可能不一定非常准确但是我们先这样理解 > STA模式,每一个连接到热点上的手机都可以称为STA站点,也就是我们的ESP32在STA模式下工作就可以连接路由器发出的wifi

优信电子的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ESP32 (WIFI)-AP、STA模式(14)

ESP32 (WIFI)-AP模式

believe666的博客 6350

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

少走弯路,ESP32 下别混用wifi和蓝牙

乐鑫虽然这么说,但是实际上是存在问题的,同时使用WIFI和A2DP会不停重启或者压根找不到蓝牙,会有各种报错:单独启动蓝牙后打开wifi设置成sta都默认不会出现错误,但是蓝牙链接的时候立马报错,报了一个缓存区不足的问题。查了很久后发现乐鑫对一个国外用户回复在arduino方式下模式是支持wifi和蓝牙共存的,不需要再额外设置什么参数。各种调,后来才发觉是wifi和蓝牙冲突导致的,I2S虽然failed了,但是依然是正常的。乐鑫官方说wifi和蓝牙是可以共存的,但是要设置什么参数。

Sean.Pu的专栏 1万+

ESP32 STA+AP模式设置

配置步骤: 1.进入ap_sta所在目录,执行make menuconfig进行配置。 配置作为 AP 时其它设备访问该 AP 所需要的 SSID 和密码。依次进入配置选项Demo Configuration —>、AP Configuration —>,然后在[AP] SSID和[AP] Password中填写 SSID 和密码。 配置作为 STA 时需要连接到的 AP 的 ...

yubaili 5074

启用动态NVI的NAT的配置步骤及示例

启用动态NVI的NAT的配置步骤及示例 上节介绍了基于静态NVI接口的NAT配置方法,本节介绍的是基于动态NVI接口的NAT配置方法,具体步骤如表5-15所示。 表5-15  启用动态NVI的NAT配置步骤 步骤 命令 说明 Step 1  enable 例如: Router> enable 进入特权

Galdys的专栏 3685

第12章网络地址转换

内网 转换 目的地192.168.233.21 10.0.0.10 180.20.21.22源:192.168.233.21 源:10.0.0.10目的:180.2021.22 NAT 目的:180.21.21.22192.168.233.21————》10.0.0.10————》180.20.21.22192.168.233.21《————10.0.0.10《————180.20.21.22源180 NAT 源180目的192 目的10.0.0.10 1024 3458 6523 9631102

BryantLSY的博客 178
上一篇: 53 Command “python setup.py egg_info“ failed with error
下一篇: 55 Ubuntu搭建mosquitto并使用MQTT.fx测试问题记录
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值