設置されたBluetoothモジュールは、押し込めるファームウェアの質だけが頼りです。OTA(over-the-air) DFUはバグ修正、CVEクローズ、機能追加をトラック回送なしで行う手段です。本記事はBluetoothモジュールの更新アーキテクチャを扱います。デュアルバンク、署名イメージ、差分、ロールバックです。
更新トポロジ
Bluetoothモジュールは2つの方法でファームウェアを受け取ります。
- 直接:スマホが接続しGATT経由でストリーム(消費者機器で典型)。
- 間接:ゲートウェイがイメージをバッファし多数のモジュールへ中継(産業フリート)。
デュアルバンク vs シングルバンク
最も安全なBluetoothモジュール設計は2バンクを保持します。
| 方式 | 失敗時リスク | ストレージ |
|---|---|---|
| シングルバンク | 書込中電断で brick | 1x |
| デュアルバンク(A/B) | 失敗で旧バンク起動 | 2x |
| 外部SPIフラッシュ staging | 失敗で内部起動 | 1x + 外部 |
デュアルバンクは安全や収益が重要なものにflashの価値があります。
署名イメージ
署名なしコードは絶対焼かないでください。Bluetoothモジュールはバンク入替前に署名を検証します。
if Verify(pubkey, image_hash, sig) == OK:
swap_bank()
else:
reject_and_stay()
工場で焼いたルート鍵でECDSA P-256を使います。不良イメージは単に起動しません。
差分/部分更新
フルイメージは200-500KB。それを1万台のBluetoothモジュールに送るのは痛い。差分は変更ブロックのみを送ります。
patch = bsdiff(old_image, new_image) # 全体の5-20%程度
Bluetoothモジュールはstaging領域でパッチを適用し、結果ハッシュを検証してから入替ます。これで帯域と更新時間が劇的に減ります。
更新ステートマシン
規律あるBluetoothモジュール DFUはステートマシンとして動きます。
IDLE -> DOWNLOAD -> VERIFY -> SWAP -> REBOOT -> (OK | ROLLBACK)
チェックサム不一致は既知良好バンクへロールバックし失敗を報告。新バンク検証までは現バンクを消さないでください。
電力と時間
BLE経由1-2KB/sのDFUはフルイメージで数分、差分は数秒〜1分。ユーザーに警告し、給電を維持(または50%以上のバッテリ要求)、過熱回避で絞ります。
セキュリティ覚書
- 送信元を認証:サーバーからの署名イメージのみ、暗号化チャネル上で。
- 更新をレート制限しフラッシュを消耗するDoSを阻止。
- プロトコルにバージョンを付け旧モジュールも更新。
署名デュアルバンクDFUと差分を持つBluetoothモジュールは、ファームウェア緊急事態を静かなバックグラウンドジョブに変えます。