MQTT メッセージングラボ:機器がブローカーと話す仕組みをブラウザーで

このラボでは、生徒ひとりひとりに専用の MQTT ブローカーと、そこへ発行する架空のセンサーがいくつか用意されます。家は 1 秒ごとに値を送ります。リビングの温度と湿度、キッチンの温度、そしてドアが開いているか閉まっているかです。生徒はそれをターミナルから聞き、自分のメッセージをひとつ書きます。

攻撃のラボではありません。どのコピーも、インターネットにも他の生徒にも通じる道がないので、何かをダウンロードすることも、中のものが誰かに届くこともありません。本物の設備の姿でもありません。本物の機器は、サインインと暗号化された通信を伴ってネットワークをこえてつなぎます。このラボはその両方を省き、最初に学ぶのがメッセージの仕組みそのものになるようにしています。

生徒が学ぶこと

ブローカーが、機器とそれを使う側をどう切り離すかを学びます。センサーはトピックをつけてメッセージを発行し、ブローカーはそのトピックを購読している全員に渡します。どちらも相手のことを知りません。生徒は # のワイルドカードで home の下のすべてのトピックを読み、+ のワイルドカードで温度だけを読みます。そして、保持メッセージであるドアの状態は新しい購読者にすぐ渡されるのに、保持されていない湿度は次の値を待たなければならないことを確かめます。そのあと、自分の保持メッセージを発行して読み返します。IoT、ネットワーク、分散システムの入門に向いています。正確な文言はご自身の評価機関の単元で確認してください。ここでは引用していません。

ブラウザーで動かす

このラボは、同じ標準の公開イメージから 2 つのサービスを起動します。MQTT ブローカーの broker と、ブローカーの準備ができると 1 秒ごとに 4 つの値を発行し続ける sensors というループです。ウェブページはないので、ラボのバーの「ブラウザーで開く」の下にリンクはなく、聞くにはターミナルを使います。ターミナルからは docker exec broker に続けてコマンドを書くと、ブローカーのツールに届きます。聞くコマンドには、メッセージの数 -C と秒数 -W のオプションをつけるので、必ず終わります。値は整数の決まった周期から出ますが、周期のどこにいるかは実行を押す瞬間で決まるので、二人の生徒は違う数字を見ます。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。MQTT:機器がブローカーと話す仕組みを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. 開くウェブページはありません。ラボのページで「ターミナルを開く」を押し、docker exec broker mosquitto_sub -t 'home/#' -v -C 8 -W 10 と入力すると、8 件のメッセージが聞こえます。各行は、トピック、空白、値の順です。

生徒に提出させるもの

実行したコマンドと、それぞれが表示したもの。home の下のすべてのトピックを読むもの、ワイルドカードで温度だけを読むもの、保持されたドアの状態を読むもの、そして -r で発行して読み返した自分のメッセージです。そのうえで、保持メッセージが何の役に立つか、なぜドアはすぐに答えたのに湿度は答えなかったのかを、自分の言葉で一、二文書かせます。自動では採点されません。その文が、理解できたかを示します。さらに力をつけたいときは、本物の機器にあってこのラボにないものは何かを尋ねてください。

このラボで進める基本のレッスン

IoT Messaging Basics は、このラボで進める小さなレッスンです。生徒は、ワイルドカードですべてのトピックを聞き、温度だけに絞り、保持メッセージと保持されないメッセージを比べ、自分のメッセージを発行して読み返します。

無料の個人アカウントでは、ホームにある Basics モジュールで使え、どの学校もライブラリの Basics フォルダーからコピーできます。わざと小さくしてあります。ラボで進めるレッスンとは何かを先生に見せるためで、あとはラボが担います。変えたいときは、自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルに Dockerfile はありません。標準の公開イメージをひとつ、Eclipse Mosquitto ブローカーをメジャーバージョンに固定して、権限のないアカウントでメモリ 64 MB ずつ、2 回起動します。イメージのライセンスは Eclipse Public License と Eclipse Distribution License で、私たちは配布していません。ファイルは起動時にブローカーの小さな設定を書き出し、ポート 1883 で待ち受けて匿名接続を許します。センサーは決まった値のシェルのループなので、何もダウンロードしません。限界は正直にお伝えします。サインインも暗号化もなく、ラボを止めると何も残らず、センサーは架空なので、接続が切れるといった本物の機器のふるまいは見られません。

課題として出す

課題の中で、何を提出するかを書いてください。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-iot-mqtt とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえばセンサーを増やしたいときは、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

なぜブローカーはパスワードなしで誰でも入れるのですか。
このラボのブローカーには、あなたのコピーの中からしか届かず、コピーにはインターネットへの出口もないので、ほかの誰もつなげません。安全なのはそれだけが理由です。本物のブローカーにはサインインと暗号化された通信が必要で、このラボのような設定にしてはいけません。
なぜ自分の数字がレッスンと違うのですか。
センサーは止まらない決まった周期をたどるので、同じ数個の値が何度もめぐってきますが、実行を押したときに周期のどこにいるかは、その瞬間で決まります。答えの形はいつも同じです。同じトピック、整数、開いているか閉まっているドア。正確に決まっている行は、読み返した自分のメッセージだけです。
生徒は自分のセンサーや機器を足せますか。
できます。ターミナルから docker exec broker mosquitto_pub で、好きなトピックにメッセージを発行できます。センサーそのものを変えるには、リポジトリをフォークし、compose ファイルのシェルのループを変えて、そのフォークをラボに指定します。