物联网领域技能Skill domain-iot

本技能用于指导使用Rust语言构建物联网(IoT)应用程序,涵盖从设备端到网关端的开发。它提供了针对物联网领域特定约束(如网络不可靠、电源限制、资源受限和安全性要求)的设计模式、实现建议和最佳实践。核心内容包括MQTT通信、边缘计算、OTA更新、电源管理和本地缓冲等关键模式,并推荐了适用于不同环境(如Linux网关和MCU设备)的Rust库和框架。关键词:物联网开发,Rust IoT,嵌入式系统,MQTT协议,边缘计算,智能家居,传感器网络,设备安全,OTA更新,电源管理。

嵌入式软件 3 次安装 52 次浏览 更新于 2/27/2026

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