关于 domain-iot
面向 Rust IoT 开发的领域技能,说明网络不稳定、功耗和设备安全等约束如何影响设计,并涵盖网关与 MCU 环境。
主要功能
- 01离线优先与本地缓冲
- 02低功耗与睡眠模式
- 03加密通信与固件签名
- 04OTA 更新与回滚
- 05网关和 MCU 技术栈参考
适用场景
- 01为网络中断设计数据暂存与重试
- 02减少电池设备的无线活动
- 03规划带回滚能力的固件升级
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill domain-iot安装后在 Claude Code 中输入/domain-iot确认已加载。
详细介绍
IoT 领域
第 3 层:领域约束
领域约束 → 设计影响
| 领域规则 | 设计约束 | Rust 影响 |
|---|---|---|
| 网络不可靠 | 离线优先 | 本地缓冲 |
| 电源限制 | 高效代码 | 睡眠模式、尽量少分配 |
| 资源限制 | 小型化 | 必要时使用 no_std |
| 安全性 | 加密通信 | TLS、签名固件 |
| 可靠性 | 自我恢复 | 看门狗、错误处理 |
| OTA 更新 | 安全升级 | 回滚能力 |
关键约束
网络不可靠
RULE: Network can fail at any time
WHY: Wireless, remote locations
RUST: Local queue, retry with backoff
电源管理
RULE: Minimize power consumption
WHY: Battery life, energy costs
RUST: Sleep modes, efficient algorithms
设备安全
RULE: All communication encrypted
WHY: Physical access possible
RUST: TLS, signed messages
向下追溯 ↓
从约束追溯到设计(第 2 层):
"Need offline-first design"
↓ m12-lifecycle: Local buffer with persistence
↓ m13-domain-error: Retry with backoff
"Need power efficiency"
↓ domain-embedded: no_std patterns
↓ m10-performance: Minimal allocations
"Need reliable messaging"
↓ m07-concurrency: Async with timeout
↓ MQTT: QoS levels
环境比较
| 环境 | 技术栈 | Crate |
|---|---|---|
| Linux 网关 | tokio + std | rumqttc、reqwest |
| MCU 设备 | embassy + no_std | embedded-hal |
| 混合型 | 拆分工作负载 | 两者 |
关键 Crate
| 用途 | Crate |
|---|---|
| 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);
// Subscribe to commands
client.subscribe("devices/device-1/commands", QoS::AtLeastOnce).await?;
// Publish telemetry
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;
}
});
// Process events
loop {
match eventloop.poll().await {
Ok(event) => handle_event(event).await,
Err(e) => {
tracing::error!("MQTT error: {}", e);
tokio::time::sleep(Duration::from_secs(5)).await;
}
}
}
}
常见错误
| 错误 | 违反的领域规则 | 修复方法 |
|---|---|---|
| 没有重试逻辑 | 数据丢失 | 指数退避 |
| 无线电始终开启 | 电池耗电 | 发送间隔期间休眠 |
| MQTT 未加密 | 安全风险 | TLS |
| 没有本地缓冲区 | 网络中断 = 数据丢失 | 在本地持久化 |
追溯到第 1 层
| 约束 | 第 2 层模式 | 第 1 层实现 |
|---|---|---|
| 离线优先 | 存储转发 | 本地队列 + 刷新 |
| 电源效率 | 睡眠模式 | 基于计时器唤醒 |
| 网络可靠性 | 重试 | tokio-retry、退避 |
| 安全性 | TLS | rustls、native-tls |
相关技能
| 适用场景 | 参见 |
|---|---|
| 嵌入式模式 | domain-embedded |
| 异步模式 | m07-concurrency |
| 错误恢复 | m13-domain-error |
| 性能 | m10-performance |
评论
支持 Markdown