视频;
https://www.bilibili.com/opus/1011714834051366936
开发板首选项:
https://dl.espressif.com/dl/package_esp32_index.json
在使用arduino 开发过程中,遇到C:\User\南岸,路径有中文,唯一有效的解决方法就是新创建window 账户英文,方法如下:
方法一:创建新的本地管理员账户(最安全、最推荐)
这是微软官方推荐的做法,无需修改任何现有设置,零风险。
以管理员身份运行命令提示符:
•在任务栏的搜索框中输入 cmd或 命令提示符。
•在右侧点击 “以管理员身份运行”。
创建新用户:
•在打开的黑色窗口中,输入以下命令(将 NewUser替换为你想要的英文名,Password123替换为你的密码):
net user NewUser Password123 /add
•按回车执行。看到“命令成功完成”的提示即表示用户创建成功。
3.将新用户设置为管理员:
•继续输入以下命令(NewUser要和你上一步设置的名字一致):
net localgroup administrators NewUser /add
•按回车执行。
切换并使用新用户:
•点击屏幕左下角的 开始按钮 -> 点击当前用户的头像。
•选择新创建的英文用户(如 NewUser)进行登录。
•首次登录需要时间初始化。
•今后,所有软件开发(如 Arduino)、编程和安装软件都在这个新的英文用户下进行,从此彻底告别中文路径问题。
优点:绝对安全,不会影响你原有中文账户里的任何文件和设置。两个账户可以随时切换。
缺点:需要在新用户下重新安装部分软件(如 Arduino IDE)。
二、利用家里电信宽带提供的IPV6 全球唯一公网地址为ESP32 wifi提供ipv6
打电话给电信,电信说是2023以后不再提供ipv4 动态公网IP,这条路走不通了。
联想到tplink路由器上有IPV6设置,打电话给电信,电信说他们提供的ipv6是唯一的地址,那么我们就可以利用ipv6来自己组网了,远程访问家里的摄像头ESP32-CAM。
核心答案
硬件支持:ESP32 芯片的无线 (Wi-Fi) 和网络 (TCP/IP) 协议栈在硬件层面完全支持 IPv6。
软件依赖:ESP32 的联网能力主要由 Arduino 核心 for ESP32 和 ESP-IDF 提供。这些 SDK 中的 LWIP(轻量级IP协议栈)已经包含了完整的 IPv6 功能。
现状:默认的 Arduino 示例代码通常只配置为使用 IPv4。你需要主动在代码中启用和配置 IPv6。
如何让 ESP32-CAM 支持 IPv6?
你需要完成以下两个关键步骤:
步骤一:在代码中启用 IPv6 并配置网络
你需要在 setup()函数中,在连接 Wi-Fi 之前或之后,正确配置 IPv6。
经典方法 (Arduino IDE):
#include <WiFi.h>
const char* ssid = "你的Wi-Fi名称";
const char* password = "你的Wi-Fi密码";
void setup() {
Serial.begin(115200);
// 启动Wi-Fi,获取IPv4地址(传统方式)
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi.");
// !!!关键步骤:启用IPv6并等待获取地址
// 方法1:使用 WiFi.enableIpV6() 和 WiFi.localIPv6()
if (WiFi.enableIpV6()) {
Serial.println("IPv6 Enabled");
} else {
Serial.println("Failed to enable IPv6");
}
// 等待并打印IPv6地址
Serial.print("IPv4 Address: ");
Serial.println(WiFi.localIP());
// 等待获取IPv6全球地址
**delay(5000); // 等待DHCPv6或SLAAC过程完成**
Serial.print("IPv6 Address: ");
// 注意:localIPv6() 可能会返回链路本地地址(fe80::开头)
// 要获取全球单播地址(2408:, 2409:等),需要循环检查所有地址
Serial.println(WiFi.localIPv6());
// 更可靠的方法:使用IPv6地址进行网络操作
// 接下来的代码(如启动服务器、发送数据)应使用IPv6地址
}
void loop() {
// 你的主循环代码
}
更现代/可靠的方法 (ESP-IDF 或 配置选项):
在 WiFi.begin()之前,设置 WiFi 模式以优先使用 IPv6:
// 在 setup() 中,begin() 之前调用
WiFi.setEnableIpV6(true); // 尝试启用IPv6
// 然后继续连接 WiFi
WiFi.begin(ssid, password);
步骤二:获取并打印正确的全球 IPv6 地址
WiFi.localIPv6()有时只会返回一个链路本地地址 (fe80::/10),这个地址只能在本地网络使用。要获取可以访问互联网的全球单播地址 (2408::/16, 2409::/16等),你需要使用更高级的方法。
// 在连接WiFi并启用IPv6后,添加以下代码来查找全球地址
void printGlobalIPv6Address() {
esp_ip6_addr_t ip6_addr;
tcpip_adapter_get_ip6_global_addr(TCPIP_ADAPTER_IF_STA, &ip6_addr);
// 将地址转换为可读字符串
char ip6_str[40]; // IPv6地址最长39字符+1结束符
sprintf(ip6_str, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
IP6_ADDR_BLOCK1(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK2(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK3(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK4(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK5(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK6(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK7(&ip6_addr.u_addr.ip6),
IP6_ADDR_BLOCK8(&ip6_addr.u_addr.ip6));
Serial.print("Global IPv6 Address: ");
Serial.println(ip6_str);
}
// 在 setup() 中连接成功后调用这个函数
重要前提和注意事项
网络环境支持 IPv6:这是最重要的前提!你的无线路由器必须已经分配到了 IPv6 前缀,并开启了 DHCPv6 或 SLAAC 功能。你可以先用手机或电脑连接同一个 Wi-Fi,测试 test-ipv6.com来确认网络支持。
库版本:确保你使用的是最新版本的 Arduino ESP32 核心库。旧版本对 IPv6 的支持可能不完善或有 Bug。
双栈支持:启用 IPv6 后,ESP32-CAM 将同时拥有 IPv4 和 IPv6 地址(双栈模式),大多数现有代码(如 HTTP 服务器、MQTT 客户端)可以继续使用 IPv4 正常工作。
防火墙:和所有设备一样,拥有了公网 IPv6 地址的 ESP32-CAM 也需要注意网络安全,确保路由器的防火墙规则不会阻止必要的通信。
总结
问题
答案
硬件是否支持?
是,ESP32芯片原生支持。
软件是否支持?
是,但需要代码配置,非默认开启。
如何启用?
在代码中使用 WiFi.enableIpV6()或 WiFi.setEnableIpV6(true)。
如何获取地址?
使用 WiFi.localIPv6(),但更推荐用 tcpip_adapter_get_ip6_global_addr获取全球地址。
最关键的前提?
你的路由器网络必须支持并分配IPv6地址。
所以,请放心,只要你的网络环境支持,完全可以通过修改代码让 ESP32-CAM 获取并使用 IPv6 地址。
打印公网IP 实际上通过以下方法:
// 等待获取IPv6全球地址
delay(5000); // 等待DHCPv6或SLAAC过程完成
Serial.print("IPv6 local Address: ");
// 注意:localIPv6() 可能会返回链路本地地址(fe80::开头)
// 要获取全球单播地址(2408:, 2409:等),需要循环检查所有地址
IPAddress ipaddr = WiFi.linkLocalIPv6();
Serial.println(ipaddr.toString().c_str());
Serial.print("IPv6 gocal Address: ");
IPAddress globalIPv6ipaddr = WiFi.globalIPv6();
Serial.println(globalIPv6ipaddr.toString().c_str());
2800

被折叠的 条评论
为什么被折叠?



