如何把 2 美元的 ESP32-C3 变成全屋广告拦截器(浏览器刷机,约 30 秒)
【免费下载链接】esp32-c3-adblockPi-hole-class DNS ad-blocker on a $2 ESP32-C3 (no PSRAM): 537k domains as 40-bit FNV-1a hashes in flash, binary-searched. UDP DNS sinkhole + web dashboard. https://youtube.com/shorts/RaxszOUMi8E?feature=share项目地址: https://gitcode.com/GitHub_Trending/es/esp32-c3-adblock
给全屋设备去掉广告,硬件成本大约 2 美元。esp32-c3-adblock 就是一个跑在 $2 ESP32-C3 广告拦截器上的 Pi-hole 式 DNS 拦截器:不需要 PSRAM,RAM 占用约 50 KB,预置了 14 万多个广告与追踪域名。项目内置了一个浏览器安装页面,桌面版 Chrome 打开即可写固件,全程不用装工具链。
🔌如何刷机:不装工具链的 30 秒流程
原理一句话讲清:安装页里的按钮由乐鑫官方的 ESP Web Tools 组件驱动,它借助浏览器的 Web Serial 权限直接操作 USB 串口,把清单文件里声明的 5 个二进制逐个写到指定地址。整页只有一个绿色按钮,位于 docs/index.html,清单在 docs/manifest.json 中。
清单同时声明了目标芯片(chipFamily限定为 ESP32-C3,防止误刷到其他芯片)和写入偏移,与分区表一一对应:
| 文件 | 大小 | Flash 偏移 | 职责 |
|---|---|---|---|
bootloader.bin | ~19 KB | 0x0 | 上电后的第一级引导程序 |
partitions.bin | ~3 KB | 0x8000 | 分区表(双 App 槽 + OTA 布局) |
boot_app0.bin | ~8 KB | 0xE000 | app0 槽位的引导扇区 |
firmware.bin | ~1.24 MB | 0x10000 | 主固件:DNS 拦截 + Web 面板 + OTA |
littlefs.bin | ~1.3 MB | 0x2B0000 | 拦截规则文件系统,14 万+ 域名 |
偏移与 partitions.csv 中的分区布局完全对应,首次写入前还会询问是否整片擦除(new_install_prompt_erase)。
准备:一块 4 MB Flash 的 ESP32-C3(SuperMini 即可)、一根能传数据的数据线、桌面版 Chrome 或 Edge。Linux 用户注意系统里的 ModemManager 会抢占串口,需先停掉。
操作:
git clone https://gitcode.com/GitHub_Trending/es/esp32-c3-adblock用 Chrome 打开docs/index.html,点「⚡ Connect & Install」,允许串口权限并选中设备(Linux 下通常是/dev/ttyACM0)。等进度条走完约 30 秒,设备自动重启。若按钮没反应,在docs/目录起一个本地服务再访问:python3 -m http.server 8000,然后打开http://localhost:8000。
验证方法放到下一节。
📶如何配网并验证广告拦截生效
重启后设备会开一个开放热点C3-AdBlock-XXXX,并带强制门户页。手机连上它,选择家里 Wi-Fi、输入密码,配网完成——这不需要再碰 USB。以后想换网络,在面板点「Forget WiFi」,或开机时按住 BOOT 键即可重新进配网页。
组网建议:把 C3 的 IP 填到路由器的 secondary DNS,或对单台设备单独指定。验证用两条命令,预期结果如下:
dig @<c3-ip> doubleclick.net # 返回 0.0.0.0,说明已被拦截 dig @<c3-ip> github.com # 返回真实 IP,说明正常转发黑名单能装多少:容量上限与内存开销
这个项目省内存的诀窍:域名不以字符串形式放 RAM,而是压缩成 40 位 FNV-1a 哈希,每个域只占 5 字节,排序后存在 flash 里,查询时二分查找。14 万个域名约 0.67 MB flash,RAM 只花约 50 KB,单次命中查询约 10 ms(含 WiFi 往返、约 18 次 flash 读取)。
当前双 App 槽布局(为固件 OTA 让路)留给黑名单约 1.3 MB,上限约 25 万域名。想要 53 万域名的「终极版」,需要换用单 App 分区表,代价是放弃固件 OTA,取舍写在各分区方案的注释里。哈希位宽选 40 位也是算过的:14 万域名按生日上界碰撞概率约 0,53 万时约 1 个域名可能被误拦。
如何维护:Web 面板与无线更新
刷机只是唯一一次需要 USB 的操作。之后访问http://c3adblock.local(mDNS 自动发现),可看每个客户端的拦截统计、拉黑设备、添加自定义域名。
后续更新全走 WiFi:面板里直接上传固件firmware.bin或新的黑名单文件,也可以配置远程地址定时拉取。想自己定制黑名单,构建脚本在 tools/build_blocklist.py:
python3 tools/build_blocklist.py data/blocklist.bin它接受 hosts 文件、纯域名列表、AdGuard/AdBlock 规则混合输入;默认源约 10 万条目。
一个必须做的安全动作:自行编译时,把 src/secrets.example.h 复制为src/secrets.h并修改WEB_USER/WEB_PASS/OTA_PASS。面板里所有会改状态的接口(封禁、加黑名单、上传、OTA)都靠这套 Basic Auth 把关;如果沿用CHANGE_ME_*占位值,等于把密码公开在仓库里,固件启动时会给出警告横幅。
⚠️刷机失败时按这个顺序排查
- 按钮灰色 / 找不到串口:确认是桌面版 Chrome 或 Edge(页面在浏览器不支持时会自动隐藏按钮);换一根数据线,部分线只能充电不能传数据。
- Linux 下串口被抢、设备反复复位:停掉 ModemManager 并阻止它再抢 303a 厂商 ID 的设备:
sudo systemctl stop ModemManager echo 'ATTRS{idVendor}=="303a", ENV{ID_MM_DEVICE_IGNORE}="1"' | sudo tee /etc/udev/rules.d/99-esp-no-modemmanager.rules sudo udevadm control --reload-rules && sudo udevadm trigger- 写写中途设备反复重启:多为供电不足——射频发射瞬间电压跌落。换手机充电头供电,或用 USB-A 转 USB-C 短线直接插路由器背板 USB 口。
- 刷完找不到
C3-AdBlock-XXXX热点:按住 BOOT 键同时上电,重新进入配网页。
成本对比与扩展方向
| 工具链编译刷机 | 浏览器网页刷机 | |
|---|---|---|
| 前置条件 | 安装 PlatformIO、配置 secrets | 桌面版 Chrome / Edge |
| 耗时 | 编译 + 上传,数分钟起 | 约 30 秒 |
| USB 占用 | 刷机期间 | 仅此一次,之后走 OTA |
| 黑名单 | 需单独构建blocklist.bin | littlefs.bin已内置 |
两个可以继续折腾的方向:一是打印外壳,仓库自带 C3 SuperMini 的 3D 打印件 hardware/esp32-c3-supermini-enclosure.stl,0.2 mm 层高、15% 填充即可,注意别把短边上的蛇形天线焊盘埋进实心塑料里;二是等固件的 DHCP 功能落地后,让 C3 自己把自身 IP 分给网内设备做 DNS,真正做到插电即用。
【免费下载链接】esp32-c3-adblockPi-hole-class DNS ad-blocker on a $2 ESP32-C3 (no PSRAM): 537k domains as 40-bit FNV-1a hashes in flash, binary-searched. UDP DNS sinkhole + web dashboard. https://youtube.com/shorts/RaxszOUMi8E?feature=share项目地址: https://gitcode.com/GitHub_Trending/es/esp32-c3-adblock
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考