ゆるい空き室モニタをつくる2(RPi MQTT Broker編)
人感センサの情報をサーバで受取り、他のメディアに配信したり、別の場所で表示したりしたい。
前回は、センサの基本的な動作確認。
いよいよ、人感センサの検知データをWifi経由で、サーバに送信する。
ということで、protocolは、MQTTを使う。実装は、mosquitto。
なんでMQTT
ネットが、掲示版からSNSに変遷していったのと似てるかも。
publisher がインフルエンサーで、subscriber がフォロワー。
ただし、 生配信のみ
。フォロワーは24時間365日、がんばって張り付く必要がある。
技術的に説明すると、こんな感じ。
掲示版的なサービス
シンプルにありそうなのは、サーバ側で適当なAPIをつくって、センサであるクライアントが、そこに検知データPOSTする、HTTP Server構成だろう。
検知データは、サーバ側でCSVなり、sqliteなり、DBに保存すればよい。
SNS的なサービス
が、センサの数は増えてきたら?数千の単位だったら?
モニタ数もそうだが、用途によって見たい(収集した)情報が異なる画面が増えたら?
トラフィックが増えて、HTTPサーバ、およびDBがボトルネックになってしまう。
サーバを高性能なものにすれば、それなりに動くかもしれない。
が、もっといい方法があるのでは?
MQTT のモデル
ということで、開発されたのがMQTTのモデル。
赤い矢印が集まるbrokerが、いわゆるサーバにあたる。
が、このサーバは、自身でデータをもたない。publisherから来たデータは数分もすれば消える。
- publisher
とにかく検知したデータを、brockerに押しつける(publish)。 - subscriber
欲しいデータ範囲(topic)をbroker指定して、リアルタイムで受け取れるようにデータ待ちする。
このpublisher と subscriber をいい感じにサポートするのがbrokerの仕事。
MQTT のsetup
ここで最近手にいれたRPi4の出番。
メモリが2Gもあるので、MQTTサーバなんて余裕で動く!
install
$ sudo apt-get install mosquitto
次回からrebootで自動的に起動するように設定
$ sudo systemctl enable mosquitto
起動チェック
$ systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-03-08 09:03:27 JST; 4 days ago
Docs: man:mosquitto.conf(5)
man:mosquitto(8)
Main PID: 8406 (mosquitto)
Tasks: 1 (limit: 3717)
CPU: 3min 11.856s
CGroup: /system.slice/mosquitto.service
└─8406 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Warning: journal has been rotated since unit was started, output may be incomplete.
broker のサービスIP設定
brokerは、defaultだとlocalhostのみアクセスできる。
他のマシン(private subnet)からアクセスできるように、listener の設定をする。
- brokerのprivateIP
10.0.0.1
- brokerのport
1883
- 認証なしのアクセスOK
/etc/mosquitto/conf.d/listener.conf
listener 1883 10.0.0.1
allow_anonymous true
再起動
$ systemctl restart mosquitto
これでbroker はOK。
mosquitto client のinstall
テストのために、command line 版の mosquitto client をinstall
$ sudo apt-get install mosquitto-clients
これで、publisher と sunscriber のやり取りを確認できる。
subsriber では、 topic sensor/#
で待ち受けるように実行する。
$ mosquitto_sub -v -h {brokerのIP} -t 'sensor/#'
#
は正規表現の *
にあたり、 sensor
、 sensor/room01
など先頭がsensor
のtopic全てを待ち受ける指定。
-v
option をつけることで、publisherからのデータ受信時に、 topic
情報も表示される。
この topic sensor
向けに、publisher として情報 {"hello": 1}
送信する。
brokerのIPを 10.0.0.1
とすると、
$ mosquitto_pub -h 10.0.0.1 -t sensor/room1 -m '{"hello": 1}'
subscriber の表示
$ mosquitto_sub -v -h 10.0.0.1 -t sensor/#
sensor/room1 {"hello": 1}
M5StickCをpublisherにする
上記のpublisherをM5StickC で実装する。
publisher の結果
command line で、M5StickCから、sensor 情報が来てるのを確認
$ mosquitto_sub -v -h 10.0.0.1 -t sensor/#
sensor/room1 {"status":true}
sensor/room1 {"status":false}
sensor/room1 {"status":false}
このままcommand line だと面白くないので、次回はNodeREDで可視化する。