资讯动态

Tasmota 如何用 QEMU 在本地模拟 ESP32 固件启动并打开 WebUI

发布时间:2026/9/13 12:17:06 来源:尧图企业网站定制
Tasmota 如何用 QEMU 在本地模拟 ESP32 固件启动并打开 WebUI【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota不需要 ESP32 硬件也可以在本地把 Tasmota 固件跑起来并点开它的 WebUI。仓库的 tools/qemu/tasmota-qemu.sh 脚本完成了整条链路用 PlatformIO 编译当前 Tasmota 检出中的 ESP32 固件、生成 QEMU 能识别的 flash 镜像、克隆并构建 Espressif 的 QEMU fork最后引导固件——串口控制台始终可用当使用支持 WiFi 的 fork 时还能在浏览器里访问 WebUI。完整的操作说明在 tools/qemu/README.md。前置条件amd64 宿主机脚本面向 amd64 平台运行 QEMUxtensa-softmmu。一份 Tasmota 源码检出脚本编译的是当前检出包括你的本地改动不是重新克隆的副本。脚本以 platformio.ini 是否存在来判断检出有效。python3 和网络脚本会在工作目录里创建虚拟环境并自行安装 PlatformIO首次运行还要拉取编译工具链、克隆并构建 QEMU fork比较慢后续运行有缓存。QEMU 构建依赖Debian/Ubuntugit build-essential ninja-build pkg-config python3-venv libglib2.0-dev libpixman-1-dev libgcrypt20-dev libslirp-dev flex bison。缺依赖时脚本会打印清单并提示用INSTALL_DEPS1重跑——注意这会执行sudo apt-get update和系统级apt-get install需要管理员权限安装范围是上面列出的全部构建包。两个有副作用的行为运行前要知道NET_WIFI1会把 WiFi 凭据写入tasmota/user_config_override.h的一个受管代码块中用#undef/#define覆盖STA_SSID1、STA_PASS1等。该块有明确的分隔标记且幂等——重复运行只重写这一块文件其余部分保持不变。run步骤会自动终止针对同一工作目录先前启动的 QEMU 进程只匹配命令行引用了本工作目录的qemu-system-xtensa以释放端口转发。构建产物、QEMU 构建和日志都放在仓库根目录下的tasmota-qemu/gitignored不会污染源码树。最短路径一条命令启动并打开 WebUI从tools/qemu/目录执行在仓库根目录执行时用tools/qemu/tasmota-qemu.sh前缀效果相同路径解析一致NET_WIFI1 ./tasmota-qemu.sh # build - image - wifi QEMU - boot, joins emulated AP # 固件加入模拟 AP 后在宿主机浏览器访问 open http://localhost:8080不带参数时执行的是all命令即按顺序执行build - make-image - qemu-setup - run四步build用 PlatformIO 编译$TASMOTA_ENVNET_WIFI1时自动切换为单核环境tasmota32solo1定义见 platformio_tasmota_env32.inimake-image把build_output/firmware/env.factory.bin补零填充为 QEMU 接受的 flash 镜像FLASH_SIZE仅支持2MB/4MB/8MB/16MB默认4MBqemu-setup克隆并构建所选 QEMU forkNET_WIFI1时强制使用wifi变体run引导固件串口输出始终可见同时 tee 到tasmota-qemu/qemu.log。run会打印 WebUI 地址http://localhost:8080即宿主机 8080 端口转发到 guest 的 80 端口以及退出方式Ctrl-A后按X。NET_WIFI1 为什么能打开 WebUI普通组合默认tasmota32环境 stock QEMU下固件只能拿到串口控制台WebUI 不会响应。要让网络可达文档说明有三件事必须同时对齐NET_WIFI1一次性把它们全部设置好活过早期 IDF 初始化。完整双核的tasmota32构建在 QEMU 下的esp_timer_impl_init中 panic空中断向量单核的tasmota32solo1构建不会所以NET_WIFI1选择它。活过 WiFi 拉起。Tasmota 的 WiFi blobs 会访问 RF 寄存器0x6003xxxxstock QEMU 不模拟这些寄存器LoadStorePIFAddrErrorwifi变体Ebiroll/calib fork模拟了它们所以NET_WIFI1强制QEMU_VARIANTwifi。拿到宿主机可达的 IP。该 fork 会广播一个名为Open Wifi的开放 AP。NET_WIFI1把 station 凭据写入tasmota/user_config_override.h的受管块固件于是以 station 模式加入它、通过 slirp DHCP 获得地址10.0.2.15:8080 - :80的端口转发才真正可达。结果验证串口控制台是第一个判据run启动后即可看到固件启动过程全程记录在tasmota-qemu/qemu.log。Web 服务器起来之后日志中出现Web server activeNET_WIFI1的后台监听器会自动代你下发SetOption128 1解决下面一节提到的 referer 问题UI 开箱即可点击。此时在宿主机浏览器打开http://localhost:8080应能加载 Tasmota 控制台页面并点击进入子页面。如果 8080 不通先确认 QEMU 仍在运行、日志中没有 panic。只有/能加载、子页面报 ERR_EMPTY_RESPONSE这是首次使用的预期现象不是崩溃。原因Tasmota 的 referer 检查只接受 host 为自身主机名或本地 IP10.0.2.15的Referer经过宿主机端口转发时浏览器发出的是Referer: http://localhost:8080/host 是localhost两者都不匹配于是/之后的每个页面都被空响应丢弃。NET_WIFI1已自动处理。如果你是手动跑了一次普通run例如全新镜像需要手工执行./tasmota-qemu.sh fixui # sends SetOption128 1 (disable referer check)该设置会持久化到 flash。注意重新make-image会擦除 flash但下一次NET_WIFI1运行会自动重新应用。只想要串口控制台无网络如果不需要 WebUI只验证固件能否在模拟器中启动并观察串口输出可以用 stock fork 的最快路径./tasmota-qemu.sh # stock fork, serial console only限制要清楚stock fork 没有 WiFi 模拟只有 OpenCores 以太网 MACTasmota 不会拉起它认识的网络接口所以 WebUI 和 MQTT 在网络侧都不可达。需要网络访问就用NET_WIFI1。启动 panic 时的排查run以-no-reboot启动guest 首次复位时 QEMU 直接退出而不是循环重启并把串口 tee 到tasmota-qemu/qemu.logpanic 回溯因此不会滚走。符号化最后一条 panic./tasmota-qemu.sh decode # decodes tasmota-qemu/qemu.log ./tasmota-qemu.sh decode some-other.log # decodes a specific logdecode会去掉0xffffffff哨兵帧取每个pc:sp对的 PC再对匹配的firmware.elf跑addr2line。落在应用 flash0x4018xxxx及以上的帧最有价值解析成??的地址在闭源 WiFi/BT blobs 里无符号——通常是固件触碰了模拟器不建模的射频硬件。分不清问题是 QEMU 还是固件时跑 smoketest它用与 Tasmota 相同的 IDF/工具链构建一个最小 Arduino 应用并引导。最小应用能跑说明 QEMU 本身没问题问题在 Tasmota 的构建同样 panic则是 QEMU/IDF 基线起不来应该修 QEMU 而不是 Tasmota。常用环境变量变量默认值含义NET_WIFI01 一次性网络配方wifi fork tasmota32solo1 模拟 AP 凭据TASMOTA_ENVtasmota32PlatformIO 环境必须是 ESP32 环境NET_WIFI_ENVtasmota32solo1NET_WIFI1使用的环境QEMU_VARIANTstockstock无 WiFi或wifiEbiroll/calib forkFLASH_SIZE4MB仅2MB/4MB/8MB/16MBWEB_PORT_HOST8080转发到 guest:80的宿主机端口INSTALL_DEPS01 用 apt-get 安装 QEMU 构建依赖需要 sudoUSE_SYSTEM_QEMU01 直接使用 PATH 中的qemu-system-xtensaMINIMAL1是可选分支编译裁剪过的tasmota32safeboot环境用于测试某个 Tasmota 驱动的初始化是否破坏 QEMU 启动不是默认路径。停止 QEMU 与已知限制交互退出Ctrl-A然后X。脚本之外也可以清理进程但这会杀掉所有qemu-system-xtensa进程不限于本次运行确认没有其他 QEMU 会话再用for p in $(pgrep -f qemu-system-xtensa); do kill -9 $p; done。已知限制wififork 比固件的 IDF 旧其 RF 寄存器模型足以完成关联但不是完整的 WiFi 栈stock 构建下 WebUI 不响应这是模拟器能力边界而非固件故障。【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价