- Published on
小米温湿度计 2 (LYWSD03MMC) 刷机 BTHome V2 固件与 Rust 边缘监测系统部署教程
- Authors

- Name
- bin | Rust & SyncGet
- @x
小米温湿度计 2 (LYWSD03MMC) 刷机 BTHome V2 与边缘监测系统全攻略
在物联网 DIY 项目中,小米温湿度计 2 (LYWSD03MMC) 因其超高性价比成为首选。本文将指导你如何通过刷入开源固件,解决原厂固件的数据加密和上传频率限制问题,并利用 Rust 构建一套安全的边缘监测系统。
一、硬件刷机指南:解锁 BTHome V2 协议
通过刷写自定义固件,可以让传感器支持 BTHome V2 协议,实现 Linux 主机免配对直接抓取数据包。
1.1 刷机准备
- 硬件设备:小米温湿度计 2 (型号:
LYWSD03MMC)。 - 环境要求:建议使用带有蓝牙功能的 PC 或安卓手机,并配合 Chrome 浏览器。
- 刷机工具:Telink Flasher (puzman.cz) —— 业内公认最稳定的在线刷机平台。
1.2 核心刷机步骤
- 连接蓝牙:打开工具网页,点击 Connect,在设备列表中选择
LYWSD03MMC。 - 激活设备:连接后即可看到温度计的详细信息。现在新买的小米温湿度计2版本都比较新,基本上都无法直接刷机。执行下方命令后,按q 扫描二维码,米家登陆(登陆前确保已手机米家app已链接温湿度计),登陆后可查看到温度计设备的kye以及ID。填入正确后点login.

bash <(curl -L https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor/raw/master/run.sh)
- 固件刷写:在 login上方 中选择最新版自定义固件,直接点第一个ATC_v57.bin,点击 Start Flashing。
- 注意:刷机过程中保持设备在 1 米范围内,等待进度达到 100%。
1.3 性能调优配置 (Config)
刷机完成后,重新连接名为 ATC_XXXXXX 的设备:
- Advertising Type: 必须选择 BTHome V2。
- Interval (间隔): 推荐 5000ms。过快会损耗电池,过慢影响实时性。
- 发射功率: 推荐 +3.0 dBm。避免设置过高(+10dBm)导致信号反射干扰。
- Sensor Settings: 务必勾选 Show Battery 以同步监控电量。
二、后端开发:基于 Rust 的数据采集系统
该系统负责监听蓝牙广播并转化为 WebSocket 流。
2.1 Rust 后端逻辑 (src/main.rs)
针对安全性,本人对 WebSocket 端口和路径进行了混淆处理:
// 端口混淆策略:3XXXX | 路径验证:/v2/monitor/stream
use anyhow::Result;
use serde::Serialize;
use tokio::net::TcpListener;
// ... 引入 btleplug 等蓝牙协议库
#[derive(Serialize, Clone, Debug, Default)]
struct SensorData {
temp: f32,
humi: f32,
batt: u8,
}
#[tokio::main]
async fn main() -> Result<()> {
let sensor_data = Arc::new(std::sync::Mutex::new(SensorData::default()));
let ws_data = sensor_data.clone();
// 启动混淆端口的 WS 服务
let addr = "0.0.0.0:3XXXX";
let listener = TcpListener::bind(addr).await.expect("无法绑定端口");
// 路径验证回调:提升接口隐蔽性
while let Ok((stream, _)) = listener.accept().await {
let data = ws_data.clone();
tokio::spawn(async move {
let callback = |req: &http::Request<()>, resp: http::Response<()>| {
if req.uri().path() == "/v2/monitor/stream" { Ok(resp) }
else { Err(http::Response::builder().status(404).body(()).unwrap()) }
};
// 处理 WebSocket 连接逻辑...
});
}
Ok(())
}
三、网络架构:内网穿透与 Caddy 反向代理
为了让公网安全访问内网温湿度数据,我们采用 Caddy + 加密隧道 的架构。
3.1 Caddyfile 安全配置
通过反向代理实现 SSL 终结,并将流量安全转发至内网 10.x.x.x 网段。
代码段
# 混淆域名配置
your-domain-proxy.com {
encode gzip zstd
# WebSocket 动态数据流转发
handle /v2/monitor/stream* {
reverse_proxy 10.x.x.x:3XXXX {
header_up Host {host}
header_up Connection "Upgrade"
header_up Upgrade "websocket"
}
}
# 静态监控面板资源
handle {
root * /var/www/monitor-panel
file_server
try_files {path} /index.html
}
}
四、系统验证与故障排除
4.1 蓝牙信号验证
在部署好采集端后,使用以下命令检查 Linux 蓝牙子系统是否正确识别:
Bash
sudo btmgmt find
指标建议:
设备名:应显示为
ATC_XXXXXX。RSSI (信号强度):建议在
-60至-80之间。若低于-90,请调整传感器位置或微增发射功率。
4.2 常见问题 FAQ
Q: 刷机后搜不到信号? A: 检查是否被手机米家 App 占用,刷机后需彻底断开其他连接。
Q: Linux 报 I/O Error? A: 部分蓝牙适配器固件会死锁,尝试拔掉主机电源 30 秒进行硬复位。
4.3 本站演示 Demo
- 首页右侧边栏:第二个小挂件
🦀 概念:所有权 (Ownership) 确保内存零开销管理,无需 GC。