name: domain-iot
description: “用于构建物联网应用程序时使用。关键词:IoT, 物联网, 传感器, MQTT, 设备, 边缘计算, 遥测, 执行器, 智能家居, 网关, 协议”
user-invocable: false
物联网领域
第3层:领域约束
领域约束 → 设计影响
| 领域规则 |
设计约束 |
Rust 实现含义 |
| 不可靠的网络 |
离线优先 |
本地缓冲 |
| 电源限制 |
高效代码 |
休眠模式,最小化内存分配 |
| 资源限制 |
小体积 |
在需要时使用 no_std |
| 安全性 |
加密通信 |
TLS,签名固件 |
| 可靠性 |
自我恢复 |
看门狗,错误处理 |
| OTA 更新 |
安全升级 |
回滚能力 |
关键约束
网络不可靠性
规则:网络随时可能中断
原因:无线,远程位置
RUST:本地队列,带退避的重试机制
电源管理
规则:最小化功耗
原因:电池寿命,能源成本
RUST:休眠模式,高效算法
设备安全
规则:所有通信加密
原因:可能存在物理接触
RUST:TLS,签名消息
向下追溯 ↓
从约束到设计(第2层):
“需要离线优先设计”
↓ m12-lifecycle: 带持久化的本地缓冲区
↓ m13-domain-error: 带退避的重试
“需要电源效率”
↓ domain-embedded: no_std 模式
↓ m10-performance: 最小化内存分配
“需要可靠的消息传递”
↓ m07-concurrency: 带超时的异步
↓ MQTT: QoS 级别
环境对比
| 环境 |
技术栈 |
依赖包 |
| Linux 网关 |
tokio + std |
rumqttc, reqwest |
| MCU 设备 |
embassy + no_std |
embedded-hal |
| 混合环境 |
拆分工作负载 |
两者皆有 |
关键依赖包
| 用途 |
包名 |
| MQTT (std) |
rumqttc, paho-mqtt |
| 嵌入式 |
embedded-hal, embassy |
| 异步 (std) |
tokio |
| 异步 (no_std) |
embassy |
| 日志 (no_std) |
defmt |
| 日志 (std) |
tracing |
设计模式
| 模式 |
目的 |
实现方式 |
| 发布/订阅 |
设备通信 |
MQTT 主题 |
| 边缘计算 |
本地处理 |
上传前过滤 |
| OTA 更新 |
固件升级 |
签名 + 回滚 |
| 电源管理 |
电池寿命 |
休眠 + 唤醒事件 |
| 存储转发 |
网络可靠性 |
本地队列 |
代码模式:MQTT 客户端
use rumqttc::{AsyncClient, MqttOptions, QoS};
async fn run_mqtt() -> anyhow::Result<()> {
let mut options = MqttOptions::new("device-1", "broker.example.com", 1883);
options.set_keep_alive(Duration::from_secs(30));
let (client, mut eventloop) = AsyncClient::new(options, 10);
// 订阅命令
client.subscribe("devices/device-1/commands", QoS::AtLeastOnce).await?;
// 发布遥测数据
tokio::spawn(async move {
loop {
let data = read_sensor().await;
client.publish("devices/device-1/telemetry", QoS::AtLeastOnce, false, data).await.ok();
tokio::time::sleep(Duration::from_secs(60)).await;
}
});
// 处理事件
loop {
match eventloop.poll().await {
Ok(event) => handle_event(event).await,
Err(e) => {
tracing::error!("MQTT 错误: {}", e);
tokio::time::sleep(Duration::from_secs(5)).await;
}
}
}
}
常见错误
| 错误 |
违反的领域规则 |
修复方法 |
| 无重试逻辑 |
数据丢失 |
指数退避 |
| 无线电常开 |
电池耗尽 |
发送间隔休眠 |
| 未加密的 MQTT |
安全风险 |
TLS |
| 无本地缓冲区 |
网络中断 = 数据丢失 |
本地持久化 |
追溯至第1层
| 约束 |
第2层模式 |
第1层实现 |
| 离线优先 |
存储转发 |
本地队列 + 刷新 |
| 电源效率 |
休眠模式 |
基于定时器的唤醒 |
| 网络可靠性 |
重试 |
tokio-retry, backoff |
| 安全性 |
TLS |
rustls, native-tls |
相关技能
| 何时使用 |
参见 |
| 嵌入式模式 |
domain-embedded |
| 异步模式 |
m07-concurrency |
| 错误恢复 |
m13-domain-error |
| 性能 |
m10-performance |