Domain Iot

by actionbook5c40d3ad7851No license1.5K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 6 weeks ago

Use when building IoT apps. Keywords: IoT, Internet of Things, sensor, MQTT, device, edge computing, telemetry, actuator, smart home, gateway, protocol, 物联网, 传感器, 边缘计算, 智能家居

Instructions onlySoftware Development
AI-generated overview

Reference guidance for building IoT applications in Rust, covering MQTT, edge, power, security and OTA constraints.

What it does
This skill supplies domain constraints and design guidance for IoT software, mapping rules such as unreliable networks, power limits, resource limits and device security to Rust design implications. It lists environment stacks and crates for Linux gateways, MCU devices and hybrid setups, plus design patterns like pub/sub, edge compute, OTA updates and store-and-forward. It also includes an MQTT client code pattern and tables of common mistakes and related skills.
When to use it
Use it when designing or implementing IoT applications, especially in Rust, where offline-first behavior, power efficiency, encrypted communication or firmware updates matter. It is also relevant when choosing between std and no_std stacks or MQTT crates for gateway and embedded targets.
Requirements
No scripts or bundled assets; it is an instructions-only document. Applying its examples assumes a Rust toolchain and crates such as rumqttc, tokio, embassy or embedded-hal, and network access to an MQTT broker for the sample client.

IoT Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain RuleDesign ConstraintRust Implication
Unreliable networkOffline-firstLocal buffering
Power constraintsEfficient codeSleep modes, minimal alloc
Resource limitsSmall footprintno_std where needed
SecurityEncrypted commsTLS, signed firmware
ReliabilitySelf-recoveryWatchdog, error handling
OTA updatesSafe upgradesRollback capability

Critical Constraints

Network Unreliability

RULE: Network can fail at any timeWHY: Wireless, remote locationsRUST: Local queue, retry with backoff

Power Management

RULE: Minimize power consumptionWHY: Battery life, energy costsRUST: Sleep modes, efficient algorithms

Device Security

RULE: All communication encryptedWHY: Physical access possibleRUST: TLS, signed messages

Trace Down ↓

From constraints to design (Layer 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

Environment Comparison

EnvironmentStackCrates
Linux gatewaytokio + stdrumqttc, reqwest
MCU deviceembassy + no_stdembedded-hal
HybridSplit workloadsBoth

Key Crates

PurposeCrate
MQTT (std)rumqttc, paho-mqtt
Embeddedembedded-hal, embassy
Async (std)tokio
Async (no_std)embassy
Logging (no_std)defmt
Logging (std)tracing

Design Patterns

PatternPurposeImplementation
Pub/SubDevice commsMQTT topics
Edge computeLocal processingFilter before upload
OTA updatesFirmware upgradeSigned + rollback
Power mgmtBattery lifeSleep + wake events
Store & forwardNetwork reliabilityLocal queue

Code Pattern: MQTT Client

rust
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;            }        }    }}

Common Mistakes

MistakeDomain ViolationFix
No retry logicLost dataExponential backoff
Always-on radioBattery drainSleep between sends
Unencrypted MQTTSecurity riskTLS
No local bufferNetwork outage = data lossPersist locally

Trace to Layer 1

ConstraintLayer 2 PatternLayer 1 Implementation
Offline-firstStore & forwardLocal queue + flush
Power efficiencySleep patternsTimer-based wake
Network reliabilityRetrytokio-retry, backoff
SecurityTLSrustls, native-tls

Related Skills

WhenSee
Embedded patternsdomain-embedded
Async patternsm07-concurrency
Error recoverym13-domain-error
Performancem10-performance

Source and attribution

Source:actionbook/rust-skillsinskills/domain-iotat commit5c40d3a

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal