首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

ESP32-C3 广告拦截

摘要

日本語 README A Pi-hole-style DNS ad-blocker that runs on a $2 ESP32-C3 — no PSRAM required . 📰 Featured on Tom's Hardware , XDA Developers , and Korben . The trick everyone misses: you don't need to kee...

the flash ESP32 PSRAM RAM domains USB domain and you
2026-10-07 1 阅读 约9分钟阅读 jayhoon
分享:
字号:
日本语自述文件 一个 Pi-hole 式 DNS 广告拦截器,在 2 美元的 ESP32-C3 上运行 — 无需 PSRAM。 📰 Tom's Hardware、XDA Developers 和 Korben 上推荐。每个人都忽略的技巧:您不需要将阻止列表保留在 RAM 中。将域作为排序的 40 位哈希值存储在闪存中,并对它们进行二进制搜索。 140,000 多个域可容纳在约 0.7 MB 的闪存中,并在约 10 毫秒内完成匹配,使用约 50 KB 的 RAM。查询 ──▶ 提取域 ──▶ FNV-1a 哈希(+父后缀) ──▶ 对闪存哈希表进行二分搜索 ├─ hit ──▶ 答案 0.0.0.0(sinkholed) └─ miss ──▶ 转发到上游解析器,中继回复 大多数 ESP32 DNS 污水坑将块列表(域字符串)加载到 RAM 中,因此它们需要 PSRAM。该项目将固定的 5 字节(40 位)哈希值存储在闪存中: string-in-RAM 方法(闪存中的哈希值) 硬件 ESP32 + PSRAM (~$8) ESP32-C3,无 PSRAM (~$2) 141k 域 ~2.5 MB RAM 0.67 MB 闪存 RAM 使用了大部分 ~50 KB 查找字符串比较 ~18 次闪存读取(~10 毫秒,包括 WiFi RTT)冲突 n/a 141k 时为 0(537k 时为 1) 为什么是 40 位?这是此闪存预算的最佳选择。冲突遵循生日界限 - 在 141k 域名时,您得到的约为 0,在 537k 时约为 1(即,一个不幸的域名被过度阻止)。降至 32 位将节省 20% 的闪存,但在 250k 时会产生约 7 次冲突;使用 64 位会浪费每个域 3 个字节来解决您没有的问题。同样的技巧也适用于更大的芯片——它不是 C3 的解决方法。在 16 MB ESP32-S3 上,这些哈希值可容纳约 2.7M 域,而 8 MB PSRAM 中的字符串则可容纳约 466k。闪存中的哈希值基本上随处都击败了 PSRAM 中的字符串; C3 就让它变得不可否认。任何 ESP32-C3 板(在 C3 SuperMini 上测试),4 MB 闪存,无需 PSRAM 经典 ESP32(DevKit / WROOM,4 MB)还可以构建: pio run -e esp32dev -t upload(社区贡献,编译测试;C3 是测试目标)通过稳定的 USB 电源(手机充电器或路由器的 USB 端口)为其供电。廉价/松散的 USB-C→A 适配器可能会在 WiFi 传输期间关闭无线电。 USB-A → USB-C 适配器可使其直接插入大多数路由器背面的备用 USB 端口 - 无需电源,无需额外的盒子。 C3 SuperMini 的可打印案例:hardware/esp32-c3-supermini-enclosure.stl 打印说明:无需支撑; 0.2 毫米的层数,~15% 的填充就足够了。保持天线端畅通无阻。 C3 的 PCB 天线是 USB-C 端口对面短边上的锯齿形走线 - 不要将其埋在固体塑料中或在其附近放置金属,否则您的 RSSI 会受到影响。让通风口保持打开状态:电路板闲置温度约为 45–55 °C。构建和闪存 (PlatformIO) 一个 USB 闪存即可启动 — 之后,固件和阻止列表都通过 WiFi 进行更新(见下文)。 ⚠️ 使用当前的 PlatformIO — VSCode PlatformIO 扩展的捆绑核心,或在 venv 中使用 pip install -U platformio。 distro/apt platformio 包(例如 4.3.4)太旧,并且失败并出现 AttributeError: ... 'resultcallback' (问题 #4)。一键式浏览器安装程序即将推出(托管待定)。 # 1. 复制机密模板(gitignored,保持本地)并编辑它: # - WIFI_SSID / WIFI_PASS 是可选的 — 保留占位符并使用 # 设备上设置门户(如下)。 # - WEB_USER / WEB_PASS / OTA_PASS 不是可选的:它们控制仪表板的 # 状态更改端点(/ban、/addblock、/upload、/update、/setupdate、# /forgetwifi)和网络 OTA。选择真实的值——这些值过去对 LAN 上的任何人都开放。 cp src/secrets.example.h src/secrets.h # 然后编辑 src/secrets.h # 2. 构建 blocklist 哈希表(默认 = StevenBlack base + Hagezi Light, # ~100k 条目,WhatsApp/social safe) python3 tools/build_blocklist.py data/blocklist.bin # 3. 闪存固件 + blocklist 文件系统(唯一的 USB 闪存) pio run -t upload pio run -t uploadfs # 4. 观察它启动,记下 IP / 打开仪表板 pio 设备监视器 # -> http://c3adblock.local build_blocklist.py OUT.bin [SOURCE ...] 可以任意组合 URL 和本地文件,采用以下任何格式: 主机文件 — 0.0.0.0 ads.example.com tracker.example.com (包括线路上的所有域) 纯域列表 — 每行一个域 AdGuard / Adblock 基本规则 — ||ads.example.com^ 阻止,@@||ok.example.com^ 删除域(例如,镜像 AdGuard Home 白名单) 被阻止的域也会阻止其子域。 DNS 哈希列表无法表达的规则(正则表达式、通配符、$ 修饰符、化妆品 ## 规则)将被跳过并计数。 @@ 规则仅取消阻止该确切条目 - 它无法从被阻止的父域中划分出子域。如果无法下载源,则构建会停止,而不是默默地生成较小的列表(--allow-missing to override)。 WiFi 设置(无需重新刷新)如果无法连接(或者您从未设置过 Secrets.h ),它将启动一个带有强制门户的开放接入点 C3-AdBlock-XXXX — 从手机加入它,选择您的网络,输入密码,完成。稍后要将其移至新网络:单击仪表板上的“忘记 WiFi”,或在开机时按住“启动”按钮,然后设置门户就会返回。 ( /forgetwifi 现在需要身份验证,s
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱