domain-iot について
Rust による IoT 開発向けのドメインスキルです。ネットワークの不安定さ、電力制約、デバイスセキュリティが設計に与える影響を、ゲートウェイと MCU の環境別に示します。
主な機能
- 01オフライン優先のローカルバッファリング
- 02低消費電力とスリープモード
- 03暗号化通信と署名済みファームウェア
- 04ロールバック対応の OTA 更新
- 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
環境の比較
| 環境 | スタック | クレート |
|---|---|---|
| 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 |
設計パターン
| パターン | 目的 | 実装 |
|---|---|---|
| Pub/Sub | デバイス通信 | 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, backoff |
| セキュリティ | TLS | rustls, native-tls |
関連スキル
| 条件 | 参照先 |
|---|---|
| 組み込みパターン | domain-embedded |
| 非同期パターン | m07-concurrency |
| エラー復旧 | m13-domain-error |
| パフォーマンス | m10-performance |
コメント
Markdown 対応