news 2026/8/31 6:29:52

Arduino IDE板级包路径配置与ESP32/ESP8266环境搭建实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arduino IDE板级包路径配置与ESP32/ESP8266环境搭建实战

各位做嵌入式开发的朋友应该都有过这种经历:想给 Arduino IDE 装一块新的开发板支持包,结果不是下载卡在 0%,就是安装完发现 C 盘被塞得满满当当,还有时候明明按照教程加了 JSON 地址,开发板管理器里却怎么也搜不到目标型号。我这次就围绕 Arduino IDE 的板级包路径配置,把常见的安装失败、路径异常、空间占用问题,以及离线安装方案全部梳理一遍,配合完整实操演示,希望帮大家一次把环境调顺。

这篇文章适合刚入门嵌入式开发、正在折腾 ESP32 或 ESP8266 的初学者,也适合已经在用 Arduino IDE 但经常被板卡安装问题困扰的开发者。学完之后,你能掌握板级包路径的原理,学会查看和自定义包存储目录,能独立完成 ESP32 与 ESP8266 开发环境的搭建,也清楚遇到下载失败、空间不足、IDE 打不开等异常时该怎么排查和解决。

1. 背景与核心概念

1.1 什么是 Arduino IDE 板级包

Arduino IDE 相信大家都不陌生,它是最常见的嵌入式开发入门工具之一,支持多种型号的开发板。所谓“板级包”,英文里通常叫 Board Package,可以理解为一套让 IDE 认识并编译某种开发板的“驱动和工具链集合”。

举个例子,我们常用的 Arduino Uno、Mega 这类官方板卡,IDE 默认就内置了支持。但当你开始使用 ESP32、ESP8266、STM32、RP2040 等非官方或者第三方主控芯片的开发板时,IDE 默认并不认识它们。这时候就需要安装对应的板级包。

板级包通常包含以下内容:

组成部分作用
核心库与硬件定义让 IDE 识别芯片型号、引脚定义、时钟频率等
编译器与工具链将写好的 C/C++ 代码编译成二进制固件
烧录工具通过 USB/串口/网络等方式将固件写入开发板
示例程序与驱动提供该开发板对应的外设示例和板级驱动库

简单理解就是:Arduino IDE 是一个空屋子,板级包就是根据你要用的开发板类型,往屋子里放入对应的“家具和工具”。没有这块包,你的代码写得再好,IDE 也不知道该用什么编译器和参数去生成固件。

1.2 为什么需要重点关注板级包路径

很多新手在配置 ESP32 或 ESP8266 开发环境时,会遇到以下场景:

  1. 开发板管理器里添加了 JSON 地址,但是下载板级包时进度条不动,或者总是中途失败。
  2. 好不容易装完,发现 C 盘可用空间少了好几个 G。
  3. 重装系统后,板级包全部丢失,需要重新下载。
  4. 手动下载了离线安装包,却不知道放在哪个目录才能生效。

这些问题,归根结底都和“板级包路径配置”有关。Arduino IDE 在安装板级包时,会先把支持包下载到本机的数据目录,再解压到对应的 packages 目录。这个默认路径往往位于系统盘(Windows 上是 C 盘),一旦包体积变大,空间告急就成了必然结果。

理解了路径配置,你才能做到:知道包装到了哪里、如何迁移到非系统盘、如何让离线包识别生效,以及出了问题之后如何彻底清理重装。

1.3 常见应用场景

路径配置与板级包管理在以下场景中非常常用:

  • 从 Arduino Uno 升级到 ESP32 / ESP8266 时,搭建第一套物联网开发环境。
  • 公司或学校机房的电脑安装了 arduino ide,但普通用户没有系统盘写入权限。
  • 使用离线安装包在内网环境给多台电脑批量部署开发环境。
  • C 盘空间不足,需要把板级包迁移到 D 盘或其他数据目录。
  • 手头有一块 Arduino Nano、ESP32-CAM 等特定板子,需要精确安装对应版本的 core 包,避免版本冲突。

可以说,只要不是永远只玩官方 Arduino 板卡,你就迟早会碰到底层包管理的问题。

2. 环境准备与版本说明

2.1 Arduino IDE 版本说明

在配置板级包路径时,Arduino IDE 的版本会影响操作入口和目录结构,目前市面比较常见的是 1.8.x 和 2.x 两个大版本。

  • Arduino IDE 1.x:经典版本,界面朴素,配置项集中在“文件 → 首选项”里,数据目录通常叫Arduino15
  • Arduino IDE 2.x:新版 IDE,界面更现代,支持自动补全、串口监视器增强等功能,数据目录同样叫Arduino15,但某些设置项目的入口有调整。

本文以 Arduino IDE 2.x 的操作为主,1.x 版本的相关差异我也会在关键位置说明。如果你电脑上安装的版本不同,界面细节可能略有差异,但底层路径原理是相通的。

2.2 操作系统与依赖环境

板级包路径配置属于 IDE 自身的管理机制,与操作系统的用户目录策略关系较大,常见环境如下:

  • Windows:推荐 Windows 10 或 Windows 11,本文的路径演示以 Windows 为主。
  • macOS:数据目录在~/Library/Arduino15
  • Linux:数据目录在~/.arduino15

另外,ESP32、ESP8266 的编译过程依赖 Python 环境,但 Arduino IDE 在安装板级包时会自动下载配套工具链,一般不需要我们手动安装 Python。只要网络正常,IDE 会自动把事情做完。

如果你在内网,无法直接访问外网,或者下载速度非常慢,就需要准备离线安装包。这个方案后面会详细演示。

2.3 示例项目结构

在演示后续操作之前,我们先约定示例的目录结构。假设我的电脑用户名为devuser,那么 Windows 下 Arduino IDE 的默认数据目录为:

C:\Users\devuser\AppData\Local\Arduino15

板级包装完后,会存在该目录的packages子文件夹下,例如:

C:\Users\devuser\AppData\Local\Arduino15\packages\esp32 C:\Users\devuser\AppData\Local\Arduino15\packages\esp8266

如果你的用户目录不一样,把devuser换成自己的用户名即可。下面我会先讲解目录原理,再带大家走一遍完整实操。

3. 核心知识点拆解:板级包路径配置原理

3.1 Arduino15 数据目录是什么

Arduino IDE 安装后,除了程序文件,还会在用户目录下生成一个数据目录。这个目录存放的内容包括:

  • 开发板管理器索引文件。
  • 已安装的板级包(packages)。
  • 库管理器索引和已安装的第三方库(libraries)。
  • 首选项配置。
  • 日志和缓存文件。

目录在不同平台路径如下:

操作系统默认数据目录
Windows%LOCALAPPDATA%\Arduino15
macOS~/Library/Arduino15
Linux~/.arduino15

这里%LOCALAPPDATA%在 Windows 上通常展开为C:\Users\用户名\AppData\Local。注意它和 Arduino IDE 安装目录不是同一个地方,IDE 安装目录一般只在 C 盘 Program Files 或自定义路径下。

3.2 板级包在 packages 目录中的组织结构

当你在“开发板管理器”中安装 ESP32 板级包后,IDE 会把文件放在:

Arduino15\packages\esp32\

目录内部常见结构为:

packages/ └── esp32/ ├── hardware/ │ └── esp32/ │ └── 2.x.x/ # 版本号 ├── tools/ │ ├── cmake/ │ ├── ninja/ │ ├── python/ │ └── xtensa-esp32-elf/ # 编译工具链 └── platforms.txt # 板级描述文件

不同芯片厂商的包结构略有区别,但hardwaretools是相对通用的存在。tools里头装的往往就是编译器和烧录工具链,这部分体积通常比较大,也是占用 C 盘空间的主力。

3.3 开发板管理器地址与 JSON 索引

在 IDE 里添加第三方开发板,核心操作是在“文件 → 首选项 → 设置 → 附加开发板管理器网址”中填写 JSON 索引地址。IDE 会请求这个 JSON 文件,得到该厂商所有开发板包的版本、下载链接、依赖工具信息,然后展示在开发板管理器中。

目前常用地址如下:

ESP32: https://espressif.github.io/arduino-esp32/package_esp32_index.json ESP8266: https://arduino.esp8266.com/stable/package_esp8266com_index.json

如果你同时使用多个厂商的开发板,可以把多个 URL 分行填写,每行一个地址。

3.4 自定义数据目录的几种方式

很多用户希望把板级包安装到非系统盘,却不知道从哪里下手。这里列三种常见思路,大家可以根据自己情况选择:

  1. 修改系统级环境变量或 IDE 启动参数。 有些版本的 Arduino IDE 支持通过启动参数或环境变量指定数据目录,但不同版本支持程度不一,需要以实际版本的文档为准。修改前务必备份当前数据目录。

  2. 移动目录并使用符号链接。 把已有的Arduino15整个目录剪切到 D 盘,然后在原位置建立一个符号链接,指向新位置。这样 IDE 仍然去原路径读写,但实际文件已经落在 D 盘。这种方式对 IDE 自身透明,是目前比较常用的做法。

  3. 使用 sketchbook 下的 hardware 目录。 手动下载的板级包,如果按特定目录结构放入“项目文件夹/hardware”,IDE 也会识别。这种方法适合离线安装特定硬件库,不需要借助开发板管理器,但需要自己保证目录结构正确。

对于新手,我更推荐第一种或第二种,理解清楚原理后再尝试第三种。下面我们在实操环节,把在线安装、离线安装和符号链接迁移都演示一遍。

4. 完整实战:板级包路径配置与 ESP32/ESP8266 环境搭建

4.1 准备工作

首先保证 Arduino IDE 已经正确安装并可正常打开。如果还没安装,请到官网下载适合你操作系统的版本,并使用默认选项安装。

然后确认当前系统盘剩余空间。如果你想完整安装 ESP32、ESP8266 两套板级包,建议预留至少 3GB 以上的可用空间。

为了防止过程中出现异常,建议关闭 IDE 里的自动更新提示,避免安装板级包的同时 IDE 又去下载其他组件,干扰进度。

4.2 添加开发板管理器地址

打开 Arduino IDE,进入:

文件 → 首选项 → 设置

找到“附加开发板管理器网址”(Additional Boards Manager URLs),点击右侧的小图标打开编辑窗口。

把以下两个地址都填进去:

https://espressif.github.io/arduino-esp32/package_esp32_index.json https://arduino.esp8266.com/stable/package_esp8266com_index.json

保存后,进入:

工具 → 开发板 → 开发板管理器

在搜索框中输入esp32esp8266,就能看到对应的板级包条目。点击安装即可,这个过程会从 JSON 中的地址下载压缩包并解压到本地 Arduino15 目录。

这里有个建议:首次安装不要贪多。ESP32 的完整工具链比较大,点击安装后需要耐心等待。如果想要确认下载位置,可以在系统监视器中观察网络和磁盘活动。

4.3 查看板级包实际下载路径

安装完成后,我们打开文件管理器,在地址栏输入:

%LOCALAPPDATA%\Arduino15

回车后就能看到 Arduino15 目录。正常情况下可以看到packages文件夹。进入packages\esp32packages\esp8266,可以查看对应板级包内容。

如果只看在线安装,其实到这一步环境已经可用了。接下来的重点是如何手动干预路径和离线部署。

4.4 离线安装包的使用

很多用户卡在“下载太慢”这一步,这时候我们可以改用离线安装包方式。

离线板级包通常是一份已经整理好的目录结构,或者是一个自解压压缩包,里面包含了hardwaretools等文件夹。使用流程如下:

第一步,手动下载对应版本的离线包到本地,放在比如D:\arduino_packages目录。

第二步,关闭 Arduino IDE。

第三步,因为 packages 中的文件路径是严格约定的,所以需要把离线包里的内容合并到 Arduino15 的packages目录里。示例:

D:\arduino_packages\esp32_offline\packages\esp32 合并到 %LOCALAPPDATA%\Arduino15\packages\esp32

可以用系统自带的复制/覆盖方式,或者用命令行:

xcopy D:\arduino_packages\esp32_offline\packages\* %LOCALAPPDATA%\Arduino15\packages\ /E /I /Y

第四步,重新打开 Arduino IDE。此时在开发板选择列表中,如果已经能看到对应板型,说明离线包生效。

要注意的是,离线包版本和 IDE 版本需要兼容,尽量选择与你的 IDE 版本匹配的离线包。同时,如果你的packages目录中已经存在同名版本文件,覆盖之前建议先备份原目录。

4.5 将 Arduino15 数据目录迁移到 D 盘

如果你因为 C 盘空间问题想迁移整个 Arduino15 目录,推荐使用符号链接方式。操作步骤如下:

第一步,关闭 Arduino IDE。

第二步,复制目录到目标位置。先在 D 盘创建一个文件夹,例如:

D:\ArduinoData

然后将C:\Users\devuser\AppData\Local\Arduino15整个复制到D:\ArduinoData\Arduino15

第三步,删除原目录。确认目标目录内容完整后,删除原来的 Arduino15 文件夹。这一步一定要先确认复制成功、内容完整,避免误删。

第四步,以管理员身份打开 CMD,执行一下命令建立符号链接:

mklink /J "C:\Users\devuser\AppData\Local\Arduino15" "D:\ArduinoData\Arduino15"

这里的/J表示创建目录联接,不需要额外权限,比符号链接更保险,普通的目录访问和写入都会自动重定向到 D 盘。

第五步,打开 Arduino IDE,查看开发板列表是否正常。如果一切正常,就说明迁移成功。

这种方式的优点在于:IDE 感知不到路径变化,因为原路径仍然可访问,同时实际写入发生在 D 盘,节约系统盘空间。

4.6 验证环境是否可烧录

完成板级包装载后,我们通过一个小例子验证环境。

打开 Arduino IDE,选择对应开发板,比如“ESP32 Dev Module”或者“NodeMCU 1.0 (ESP-12E Module)”。

新建一个工程,输入经典的点亮板载 LED 或使用串口打印的示例代码:

void setup() { // 初始化串口,波特率 115200 Serial.begin(115200); delay(1000); Serial.println("ESP32 Board Package Test OK"); } void loop() { delay(1000); }

这里代码逻辑非常简单:上电后串口打印一条测试信息。如果你的板子没有 USB 转串口,可能需要额外的 USB 转 TTL 模块,或者先安装板载串口芯片驱动。选择好端口后,点击上传按钮,如果控制台出现上传成功,说明板级包路径配置与工具链都正常。

5. 常见问题与排查思路

5.1 问题现象表格

在配置板级包和路径过程中,下面这些问题很常见,我整理了一个简表,方便快速对照:

问题现象常见原因解决思路
开发板管理器下载速度缓慢或卡在 0%网络访问被限制或访问外网不稳定使用离线包安装;更换时段重试;配置代理后重试
添加 JSON 地址后搜不到对应开发板URL 填写错误、没有点击“好”按钮保存检查 URL 是否有空格、是否换行保存;重新打开开发板管理器
安装板级包后 C 盘空间骤减Arduino15 位于系统盘,工具链体积大迁移 Arduino15 到其他盘并建立目录联接
IDE 打开时提示找不到核心库packages 目录被误删或路径被改动恢复备份;重新安装对应板级包
手动覆盖离线包后开发板列表仍然为空目录结构不对;版本不匹配对比 packages 目录结构;确认离线包版本是否支持当前 IDE
上传时提示“A fatal error occurred”串口被占用;没装驱动;板子没进入下载模式拔掉串口调试工具;关闭串口监视器;按住 Boot 键再上传
Arduino IDE 2.3.0 上传 Nano 板失败Nano 板没有原生 USB;需要安装对应 bootloader;新版 IDE 对某些老 bootloader 兼容性变化确认板型选择;检查 bootloader 版本;尝试换用老版本 IDE 或更新固件

5.2 下载失败或速度慢的深度排查

如果你遇到下载板级包一直失败的场景,可以按下面步骤排查:

  1. 先确认是否能正常访问 JSON 地址。用浏览器打开发布板管理器里的 URL,如果能打开,说明网络基本可达。
  2. 查看 IDE 日志。IDE 的详细日志会输出到控制台,开启“文件 → 首选项 → 显示详细输出”后再次尝试安装,观察具体卡在哪一步。
  3. 尝试手动下载安装。在 JSON 文件中找到对应包的下载链接,用下载工具下载回来,再按离线包方式放置。
  4. 如果公司网络设置了代理,需要在 IDE 的系统代理设置中正确配置。

整体原则是:先用最小的步骤定位问题,不要反复点击安装造成多个半成品文件。

5.3 修改路径后出现异常怎么办

如果你使用了符号链接或目录迁移,之后发现 IDE 无法识别板卡,可以这样排查:

  • 确认目录联接是否生效。在 CMD 中执行:
dir C:\Users\devuser\AppData\Local

查看 Arduino15 是否带有<JUNCTION>标记。

  • 确认原文件夹是否被删除。如果原文件夹依然存在且里面也有内容,IDE 可能优先读取了未迁移完成的部分,容易造成识别混乱。
  • 如果怀疑目录损坏,可以暂时去掉联接,把备份目录重新放回原路径,观察是否恢复正常。

这里强调的是:任何路径操作前都要备份。特别是覆盖、删除、移动 packages 这种操作,一旦选错文件夹,可能导致整个开发环境不可用。

5.4 板级包占用空间过大问题

板级包占用空间大并不是异常,因为工具链、编译器、Python 环境都在里面。比如说 ESP32 的完整包体积可能达到 1GB 以上,ESP8266 相对小一些,但也会有几百 MB。因此在做嵌入式开发时,不要把 C 盘塞得太满,及时清理不需要的旧版本包。

你可以在 Arduino15\packages\esp32\hardware\esp32 下看到多个版本文件夹,比如 2.0.14、2.0.15、2.0.17。确认项目使用其中一个版本后,其他不需要的版本可以手动删除,只留下自己项目实际依赖的版本,能节省不少空间。

6. 最佳实践与工程建议

6.1 目录规划与命名

建议给 Arduino 数据目录单独规划一个清晰的位置,比如:

D:\Embedded\ArduinoData\Arduino15

不要直接用中文路径或者带空格的目录名,虽然大多数时候没问题,但个别工具链对路径中的空格和中文比较敏感,容易在编译时出现奇怪报错。

6.2 版本管理与锁定

在实际项目中,项目依赖的板级包版本最好固定下来,避免其他人拉取代码后,因为安装了不同版本的 core,导致编译行为不一致。

如果你使用的是 Arduino IDE 2.x,可以在项目目录的sketch.yaml或依赖说明中记录板级包版本。如果你使用的是 1.x,则需要人工记录版本号。团队协作时,最好在 README 中写明:

Arduino IDE: 2.x ESP32 core: 2.0.17 ESP8266 core: 3.1.2

这样同事或客户复现环境时,能快速对齐。

6.3 网络环境不佳时的离线部署策略

对于内网开发环境,建议准备一份完整的离线包存档,并同时保存对应的 JSON 索引文件。这样即使没有外网,也能通过离线包完成大部分开发板的板级包安装。

离线包建议按以下方式归档:

D:\Embedded\OfflinePackages\ ├── esp32\ │ └── 2.0.17\ │ ├── hardware\ │ └── tools\ ├── esp8266\ │ └── 3.1.2\ │ ├── hardware\ │ └── tools\ └── README.md

归档后,可以在 README 中记录每个包的下载来源、适用 IDE 版本、校验信息,方便后续复用。

6.4 权限与安全注意事项

如果你的办公电脑不是个人电脑,或者涉及公司内部资料,应当遵守最小权限原则:

  • 路径配置只需要修改当前用户目录时,不要以管理员身份运行 IDE,避免不必要的权限提升。
  • 不从非官方、不信任的渠道下载板级包,防止源码被植入恶意代码。
  • 进行目录迁移、删除操作前,备份整个 Arduino15 目录或至少备份 packages 目录。
  • 如果在生产环境或培训机房批量部署,先在一台测试机上验证完整流程,再推广到其他机器。

6.5 定期清理与维护

嵌入式开发过程中会不断更换开发板型号、版本,导致 packages 目录越来越臃肿。建议每隔一段时间检查Arduino15\packages下各个厂商目录,删除不再使用的旧版本。

清理时应该注意:先关闭 IDE,不要删除正在使用的版本。可以参考开发板管理器里当前高亮显示的版本,那就是最新安装或正在使用的版本。

6.6 使用版本控制工具管理环境配置

对于工作环境,我建议把以下内容纳入版本控制:

  • 附加开发板管理器网址列表。
  • 板级包版本清单。
  • 项目依赖说明。
  • 自定义脚本,比如一键迁移目录、一键安装离线包。

这样就算电脑重装系统,也能快速恢复环境,不用来回记忆配置步骤。

7. 总结

本文围绕 Arduino IDE 板级包路径配置展开,先从板级包的概念讲起,解释了 Arduino15 数据目录的组成和原理,然后分别演示了在线添加开发板管理器地址、查看板级包路径、使用离线包安装,以及把 Arduino15 迁移到 D 盘的完整实操。最后整理了常见报错、排查思路和工程建议,像 ESP32、ESP8266 这类常用第三方开发板的安装流程,大家照本文再走一遍,基本不会有什么大问题。

对于这一次的实操,我的最大体会是:先把路径原理搞清楚,再遇到各种安装失败问题时就不会靠运气了。很多所谓“玄学问题”,本质上都是目录写入失败、JSON 地址没保存、或者工具链下载不完整导致的。希望这篇教程能帮你少走一些弯路。如果你后面在配置 STM32、RP2040 等板级包时遇到类似情况,排查思路也是通用的,可以顺着本文的路径查看和备份思路继续延展。如果这篇文章对你有帮助,建议收藏备用,也欢迎在评论区交流你踩到的坑和解决方法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 6:27:55

conda环境管理实战:从创建环境到Jupyter运行NumPy

这可能是很多人在学习数据分析时遇到的第一个“隐形坎”&#xff1a;课程视频里&#xff0c;老师熟练地敲着命令&#xff0c;几秒钟装好了 NumPy&#xff0c;顺手打开了 Jupyter Notebook&#xff0c;然后开始写代码。你跟着做&#xff0c;却发现要么conda半天没反应&#xff0…

作者头像 李华
网站建设 2026/8/31 6:27:50

原生影视APP源码拆解:播放器内核与运营功能全解析

简介&#xff1a;这是一套面向影视类App开发者与个人站长的完整原生Android影视应用源码&#xff0c;基于2022年最新稳定版本构建&#xff0c;专为快速搭建高可用、高流畅度的视频聚合平台而设计。资源共2000个文件&#xff0c;涵盖1286个Java类文件&#xff08;核心业务逻辑&a…

作者头像 李华
网站建设 2026/8/31 6:26:44

多Agent协作实战:Hermes与DeepSeek Harness从配置到排错

最近后台收到不少读者留言&#xff0c;都在问同一个问题&#xff1a;单个 Agent 玩明白了&#xff0c;但多个 Agent 怎么协作&#xff1f;它们真的能像团队一样分工干活&#xff0c;还是只是把几个 API 调用串在一起充样子&#xff1f;正好这段时间在搭 Agent 开发环境&#xf…

作者头像 李华
网站建设 2026/8/31 6:26:29

TensorFlow vs PyTorch:深度学习框架选型与实战指南

TensorFlow vs PyTorch&#xff01;两大框架对比&#xff0c;新手该选哪个&#xff1f;如果你是一个刚踏入深度学习大门的新手&#xff0c;大概率会在第一个周末就卡在一个问题上&#xff1a;到底先学 TensorFlow 还是 PyTorch&#xff1f;网上搜一圈&#xff0c;答案五花八门。…

作者头像 李华
网站建设 2026/8/31 6:25:51

绿联DH4300 Plus评测:四盘位8G内存+NFC一碰连接的家庭私有云

这次我们要看的不是某个开源模型&#xff0c;而是一台真正适合家庭用户直接搬回家的私有云设备&#xff1a;绿联私有云 DH4300 Plus 8G 版。这台机器最吸引人的点有三个&#xff1a;四盘位 8TB 容量、8GB 大内存&#xff0c;以及手机上很少见的 NFC 一碰连接。简单说&#xff0…

作者头像 李华
网站建设 2026/8/31 6:23:41

真人跑团综艺制作全流程:从TRPG规则到角色卡与发音统一

最近整理一档真人跑团综艺的制作流程时&#xff0c;最让我头疼的并不是怪物数值怎么填、技能等级怎么算&#xff0c;而是一堆看上去特别琐碎、实际上每期都会翻车的“流程问题”&#xff1a;玩家名字读法不统一、地名一会儿叫“裂隙”一会儿叫“裂谷”、录到一半发现有人没开麦…

作者头像 李华