ESP32-cam 教程

视频;
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());
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值