Matter 23 · 落とし穴と設計指針 — 実際にハマるところ

Chapter 23

落とし穴と設計指針 — 実際にハマるところ

この章がなぜ必要なのか——同じ失敗が繰り返されているから.

Matter の開発でハマる場所は、驚くほど共通している。 各章で個別に警告してきたものを、チェックリストとして 1 か所にまとめる。

設計レビューやコードレビューのときに、この章を横に置いて使ってほしい。

この章で使う既出の用語(定義は各リンク先). Matter(01 章 3 節)、コミッショニング(01 章 3 節)、セキュリティ(01 章 2 節)、ネットワーク(01 章 3 節)、ACL(02 章 4 節)、Client(02 章 5 節)、Endpoint(02 章 2 節)、IPv6(02 章 1 節)、データモデル(02 章 1 節)、マルチキャスト(03 章 3 節)、Router(04 章 2 節)、Wi-Fi(04 章 9 節)、Ethernet(05 章 1 節)、クライアント分離(05 章 2 節)、必要(05 章 5 節)、SRP(06 章 2 節)、再送(06 章 3 節)、Fabric-Scoped(07 章 7 節)、FeatureMap(07 章 2 節)、ミレッド(07 章 6 節)、Identify(08 章 2 節)、UniqueID(08 章 1 節)、Fail-Safe(09 章 9 節)、パスコード(11 章 5 節)、改竄(11 章 1 節)、総当たり(11 章 1 節)、署名(11 章 2 節)、証明書(11 章 5 節)、CSA(12 章 3 節)、DAC(12 章 11 節)、DCL(12 章 11 節)、RAM(16 章 3 節)、ZAP(16 章 1 節)、Flash(17 章 1 節)、認証実績(17 章 1 節)、セキュアブート(18 章 5 節)、ロールバック(18 章 5 節)、Reachable(19 章 2 節)、スレッドセーフティ違反(21 章 4 節)、VID(22 章 2 節)

1. 設計段階で決めるべきこと

決定が遅れると手戻りが大きいもの

項目いつ決めるか遅れるとどうなるか
ネットワーク(Wi-Fi / Thread)最初基板からやり直し(05 章)
Flash / RAM の容量最初OTA が載らない(17 章)
証明書の調達方式開発初期量産に間に合わない(12 章)
VID の取得開発初期認証申請ができない(22 章)
セキュアストレージの有無SoC 選定時鍵の保護ができない(11 章)
対応 Fabric 数設計時不揮発メモリが足りない(14 章)
仕様バージョン開発初期認証で対象外になる(22 章)
Factory Data の書き込み方式開発中期量産ラインが組めない(17 章)
対象エコシステム企画時出荷後に「動かない」と発覚(20 章)

「あとで考える」が許されるのは、アプリケーションロジックだけである. ハードウェアと認証に関わるものは、すべて最初に決める。

2. 分野別の落とし穴

ネットワーク(03〜06 章)

落とし穴対処
IPv6 が無効なルータユーザー向けドキュメントで案内
マルチキャストの遮断検証は素直なフラットなネットワークで
ゲスト Wi-Fi のクライアント分離同上
Thread の Border Router がない箱に明記(22 章)
SRP 登録の失敗ot-ctl srp server service で確認
SII/SAI を広告しない再送で電池が減る
大きなペイロードThread の 127 バイトフレーム。分割して読む
メッセージカウンタの巻き戻し不揮発に保存する
停電からの一斉復帰ランダム遅延を入れる

データモデル(07〜10 章)

落とし穴対処
FeatureMap の過剰宣言宣言したら必ず動かす
必須クラスタの実装漏れDevice Library でチェック
単位の誤り温度 0.01 °C、明るさ 0〜254、色温度ミレッド、照度は対数
Nullable の未対応センサー異常時に 0 を返さない
Identify の未実装ユーザーが機器を特定できない
SoftwareVersion の非単調OTA が壊れる
UniqueID の重複複数台登録で問題
Client 側クラスタの忘れスイッチが何も制御できない
報告トリガの呼び忘れ「読めば正しいが通知が来ない」
ハードウェア → Matter の反映漏れ物理操作がアプリに反映されない
*/*/* の多用Thread で失敗する
独自クラスタへの依存他社エコシステムで主要機能が使えない

セキュリティ(11〜14 章)

落とし穴対処
弱い乱数ハードウェア TRNG を使う。rand() 禁止
DAC 秘密鍵の平文保存SE か暗号化領域
全個体で同じ passcode / discriminator / DAC製造時にランダム生成
テスト証明書での量産ビルドを分け、CI でチェック
ACL の設定漏れ0x7E の主因
Fabric-Scoped の実装ミス他 Fabric の設定を消す・見せる
Commissioning Window の閉じ忘れ誰でも参加できる状態が残る
ファクトリリセットの不完全性前の持ち主の情報が残る
試行回数の無制限パスコードの総当たりを許す
ログへの鍵の出力リリースビルドで消えることを確認
デバッグポート開放のまま出荷鍵が抜かれる
セキュアブート未設定改竄ファームが動く

実装(15〜19 章)

落とし穴対処
activate.sh の忘れ毎回実行
SDK の master を追うリリースタグで固定
生成コードを手で編集再生成で消える
.zap と生成物の不整合CI でチェック
別スレッドから SDK API を呼ぶScheduleWork かロック
コールバック内でのブロックスタックが止まる
Flash 容量の不足(OTA)2 面分を確保
OTA イメージの署名検証なし重大な脆弱性
ロールバックなし更新失敗で文鎮化
電池寿命の机上計算のみ必ず実測
ブリッジの Reachable 未実装オフライン機器が操作可能に見える
動的 Endpoint の上限不足機器を追加できない

認証・製品化(22 章)

落とし穴対処
認証手続きの着手が遅い開発開始と同時に
Test Harness を直前に回す開発中から定期的に
VID 取得の遅れ最優先
QR コードの印刷品質実際に読み取り試験
手動コードの併記なしQR が読めないと救済不能
Border Router の要否を明記しないユーザーが設定できない
エコシステム別の確認漏れ出荷前に全社で実機確認

3. 設計指針

(1) 標準を最大限使う

独自クラスタ・独自属性は最後の手段である.

独自機能を持つ場合でも、基本機能は必ず標準クラスタで提供する。 「Matter 対応だが自社アプリでしか使えない」製品は、ユーザーの期待を裏切る。

(2) 嘘をつかない

できないことを「できる」と宣言しない.

「宣言はあるが動かない」は、動かないより悪い。 ユーザーは操作して何も起きないことに混乱する。

(3) 双方向を忘れない

Matter → ハードウェアだけでなく、ハードウェア → Matter も実装する.

片方向だけの実装は、「アプリと実機の表示が食い違う」という 最も基本的な不具合を生む。

(4) ブロックしない

コールバックの中で長時間処理をしない.

カーテン、ドアロック、調理家電——動作に時間がかかる機器では必須である。

(5) 最初から複数 Fabric で考える

1 Fabric でしか動かない実装は、Matter の意味を半分捨てている.

(6) 電池機器は測る

机上計算だけで電池寿命を決めない.

(7) 出荷後を設計する

OTA が動かない製品を出してはいけない.

Matter は仕様が更新され続ける。出荷後に追随できることが前提である。

(8) ユーザー体験まで考える

技術的に正しくても、使えなければ意味がない.

4. 開発の進め方(推奨)

【企画】
  対象エコシステム / ネットワーク / デバイスタイプを決める
  CSA 会員登録・VID 申請を開始          ← 最優先
        ↓
【設計】
  SoC 選定(Flash 2MB+、RAM 128KB+、TRNG、SE、認証実績)
  仕様バージョンの決定、SDK タグの固定
  対応 Fabric 数、メモリ設計
  証明書の調達方式、Factory Data の書き込み方式
        ↓
【実装】
  サンプルアプリから出発(ゼロから書かない)
  ZAP で構成 → コールバック実装
  Linux/Ethernet で先に動かす → 実機へ
  Test Harness を定期実行            ← 早期から
        ↓
【検証】
  マルチアドミン(3 Fabric 以上)
  異常系(電源断、電波断、Fail-Safe)
  停電からの一斉復帰
  電池寿命の実測
  OTA の全経路
        ↓
【認証】
  CD 取得 → 認証テスト → 申請 → DCL 登録
  各エコシステムでの実機確認
        ↓
【量産】
  Factory Data の書き込み、個体の一意性検査
  QR コードの印刷品質
        ↓
【出荷後】
  OTA 配信、脆弱性対応、仕様更新への追随

5. 「動かない」ときの初手 5 つ

  1. ping6 ff02::1 — 機器が IPv6 レベルで見えるか(03 章)
  2. dns-sd -B _matter._tcp — サービスが広告されているか(06 章)
  3. 機器のログの最後のステージ — どこまで進んだか(21 章)
  4. ステータスコード — 特に 0x7E(= ACL)(09 章・14 章)
  5. GitHub Issue の検索 — 同じ問題が既知である可能性が高い

6. まとめ