センサーのメッセージとは何ですか
MQTT(Message Queuing Telemetry Transport)は、通信の約束の名前です。センサーのような小さな機器が、短いメッセージを送り合うときに使います。メッセージには、行き先を表すトピックと、中身の値が付きます。
このレッスンでは、家の気温や、ドアの開け閉めのメッセージを読んで、トピックと値に分けます。
このレッスンのゴール
メモ
MQTTのメッセージを読み、トピックと値に分けることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| メッセージ | 機器が送る、トピックと値の組 | |
| トピック | メッセージの宛先を表す、パスのような名前 | home/door/state |
| ペイロード | メッセージの中身の値 | |
| ブローカー | メッセージを受け取って、配る係 | |
| サブスクライブ | 読みたいトピックをブローカーに伝えること |
学生が入力するセルは、このプレビューでは空白です。
メッセージはトピックと値でできている
ドアのセンサーは、home/door/state というトピックに、open か closed を送ります。気温のセンサーは、home/kitchen/temperature に整数を送ります。
トピックは、フォルダのように、スラッシュで区切って書きます。左が大きな分類、右が細かい分類です。
このラボでできないこと
重要
ラボには、家のセンサーを真似た仕組みと、ブローカーがあります。実機は、名前とパスワードで接続し、通信を暗号化します。ラボはそれを省いています。ブラウザの画面はないので、端末を使います。
ラボの4つのトピック
| トピック | 値の形 |
|---|---|
| home/livingroom/temperature | 整数 |
| home/livingroom/humidity | 整数 |
| home/kitchen/temperature | 整数 |
| home/door/state | open か closed |
学生が入力するセルは、このプレビューでは空白です。
居間の気温を3回読む
docker exec broker mosquitto_sub -t home/livingroom/temperature -v -C 3 -W 10ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1行がトピックと値
-v を付けると、1行に、トピック、空白1つ、値の順で出ます。-C 3 は3件で止まり、-W 10 は10秒で止まります。
出る数は、押した時刻で変わります。確かなのは、3行とも home/livingroom/temperature で始まり、値が整数であることです。
家のすべてのメッセージを読む
次の Run は、home/# を読みます。# は、home の下のすべてのトピックを表します。くわしくは、次のレッスンで学びます。
8行が出ます。最初の数行は、保存されたメッセージで、すぐに出ることがあります。気温と湿度は整数、ドアは open か closed です。
家のすべてを8件読む
docker exec broker mosquitto_sub -t 'home/#' -v -C 8 -W 10ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1行をトピックと値に分ける
line = "home/kitchen/temperature 19"
parts = line.split(" ", 1) # 最初の空白で、2つに分ける
topic = parts[0]
value = parts[1]
print("トピック:", topic)
print("値:", int(value) + 1) # 整数に直すと、計算できる
levels = topic.split("/") # スラッシュで、階層に分ける
print("階層:", levels)
# 練習: line を "home/door/state open" に変えて、int の行を消しましょう。
よくある間違い
注意
「値は、受け取ったときから数である」と考える人が多くいます。メッセージの値は、文字の並びです。19 も、文字の 19 として届きます。計算する前に、int で整数に直します。