2026a 第13回:IoT
小テスト
課題解説
https://gyazo.com/4648565a12aa4c42c1d2be356a5cd9e7
要点
書籍 - ジャンル/著者の関係は「多対多」
booksテーブルににauthor_id, genre_id列を持たせる設計では不十分 (何列用意すれば良いかわからない)
中間テーブル (book_genres, book_authors)を用意して対処
書籍と蔵書は別物
1つの書籍が3冊在架することもある
予約は「蔵書」でなく「書籍」に対して行う
蔵書3冊はどれも中身は同じ、借りる人はどれでも良い
貸し出し日は「貸し出し」テーブルに持たせる
https://gyazo.com/2a230504f8848071d3e192ee9720e833
要点
同じく「作品」と「アーティスト、ジャンル」は多:多
中間テーブル (content_artists, content_genres)が必要
レジュームは再生履歴とは別の独立テーブル、かつユーザーと1:1の関係
ユーザーがレジュームできる曲は常に「1曲」のみ
再生履歴は別途再生するたびに一行増やす
講義
Internet of Things / モノのインターネット
さまざまな「モノ」をインターネットに接続し、データを利活用する
e.g. スマート家電
エアコン、照明、ロボット掃除機を遠隔から操作
e.g. ウェアラブル端末
Apple Watch, Oura Ring
社会実装例:IoT獣害監視センサー
https://gyazo.com/0bfee1bf446b017cc16c3291f78e70ed
https://scrapbox.io/files/6a4d95e9be32792658cf5930.MP4
社会実装例:IoT温湿度センサーとHACCP
https://gyazo.com/cafaf3aa3e348ce256f650f5e2051e4b
https://gyazo.com/2b111eba9b7d09d348944b08328e1756
https://gyazo.com/c70d64889fb9dc8ce8fb39936a151067
httpとmqttのデータ量の違い
前提
温度を定期的に計測・送信するデバイスが存在すると仮定
送りたいデータは例えば以下とする
code:json
{"temp":28.5}
比較
http送信の場合 ... 送りたいデータと同量以上の「ヘッダ」情報を送る必要がある
request
code:http
POST /api/v1/devices/room101-temp/telemetry HTTP/1.1
Host: iot.example.sfc.keio.ac.jp
User-Agent: esp32-httpclient/1.0
Content-Type: application/json
Content-Length: 13
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkZXYiOiJyb29tMTAxIn0.4pcPyMD09olPSyXnrXCjTdfV
Connection: keep-alive
{"temp":28.5}
セットでresponseも必ず帰ってくる
code:http
HTTP/1.1 200 OK
mqttの場合 …
最初に一度ブローカーに接続(CONNECT)、以後は送信(PUBLISH)のみ
CONNECT
code:mqtt
オフセット 16進バイト列 ASCII
0000 10 19 00 04 4D 51 54 54 04 02 00 3C 00 0D 65 73 ....MQTT...<..es
0010 70 33 32 2D 72 6F 6F 6D 31 30 31 p32-room101
0x10 ... CONNECT
0x19 ... この後続く残りの長さ (25バイト)
0x0004 ... 次の文字列長 = 4
0x4D515454 ... "MQTT"
0x04 ... プロトコルレベル4 (=MQTT3.1.1)
0x02 ... 接続フラグ
0x003C ... KeepAlive = 60秒
0x000D .. 次の文字列長 = 13
0x65737033(中略) ... "esp32-room101" (クライアントID)
PUBLISH
code:mqtt
オフセット 16進バイト列 ASCII
0000 30 32 00 23 73 66 63 2F 62 75 69 6C 64 69 6E 67 02.#sfc/building
0010 5F 69 2F 72 6F 6F 6D 5F 31 30 31 2F 74 65 6D 70 _i/room_101/temp
0020 65 72 61 74 75 72 65 7B 22 74 65 6D 70 22 3A 32 erature{"temp":2
0030 38 2E 35 7D 8.5}
0x30 ... PUBLISH
0x32 ... この後続く残りの長さ(50バイト)
0x0023 ... 次の文字列長 = 35
0x7366(中略) ... "sfc/building_i/room_101/temperature" (トピック名)
0x7B22(中略) ... "{"temp":28.5}"