AWS Iot EduKit の Lチカを手順通りにやってみて確かに、
- MQTT Test Client で、デバイスから送信されるメッセージを表示
- デバイスがサブスクライブしているトピックを、コンソールの AWS IoT MQTT クライアントからパブリッシュすることで、LED バーの点滅を開始または停止
することができました。まとめに、デバイスで何がおきていたかは説明がされていますが、いまいち煙に巻かれたような感じがしました。
AWS Iot EduKit は、「セキュアエレメント使うといいよー」というのを感じてもらうためのキットで、Blinky-Hello-Worldさえ動けば、EduKitの意義は達成 」という方もいらっしゃいますが、Arduino IDEを使わずに、esp-idf のプラットフォームでFreeRTOSを使っているのもポイントのはず。
ということで、ソースコード を読み解いて、Lチカのプログラムの処理をシーケンス図に書いてみました。処理の全てを記載しているのではなく、デバイスの動きと、シリアルコンソールのメッセージを見ながらであれば、わかる程度の粒度としています。
前提
- AWS Iot EduKit の 「2. Lチカ」 までを、やってみたことがあること
シーケンス図
まずは、いきなりシーケンス図から。
もし、間違いありましたら直します。
登場人物
シーケンス図に出てくる登場人物は、
- Wifi AP
- WiFiアクセスポイント
- ATECC608
- クライアント証明書入りセキュアエレメント
- AWS IoT
- AWS IoT Core
- MQTT Task
- MQTT タスク
- Blink Task
- LED点滅タスク
- Display Task
- 画面表示タスク
- main
- メインタスク
です。
タスクの動き
メインタスクで、Wifi接続を行ない、画面表示タスク、MQTTタスク、LED点滅タスクを順に起床します。実際は、タッチパネル処理のタスクも起床されますが、省略しています。
MQTT タスクで、
- セキュアエレメントからクライアント証明書を取り出し
- AWS IoT Coreに接続
- トピック << CLIENT_ID >>/# をサブスクライブ
- トピック << CLIENT_ID >>/blink を受け取るごとに、LED点滅タスクを resume / suspend
- 3秒ごとに、トピック(「Hello from AWS IoT EduKit なんちゃら」)を2回パブリッシュ
LED 点滅タスクで、
- タスクの先頭で suspend
- あとは、左右のLEDを交互に点灯
という具合です。
まとめ
なので、最初はLEDが消えています。その後、MQTTトピックを受け取ると、LED点滅タスクが resume するのでLチカします。もういちどMQTTトピックを受け取ると、LED点滅タスクが適当なタイミングで suspend するので、消灯するのではなく左右のLEDのいずれかが点灯することとなります。