背景
Meraki MVのAPIの中に"MQTT"と記載があった。
何のことか分からなかったので調べると、面白そうなので動かしてみた。
環境
Windows 10 Enterprise 上でWSL2を動かしています。
Ubuntu、Pythonを利用しています。
Version
$cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
$python3 -V
Python 3.8.10
>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
構成
今回動作確認をした構成図はこちら。
毎度わかりずらいのはすいません☺
Meraki MV、MQTTとは?
Meraki MV
高性能なセキュリティカメラ。
物体検出だったり動きを検出した時間帯を把握できる。Merakiがクラウド管理なので、撮影情報の保存先もクラウド管理。
詳細はMeraki MVや他に日本語記事が沢山あるので割愛します。
MQTT
非同期で機器から取得できる情報を送り続けてくれる。
複数のIoT機器から取得できる情報をグラフにする活用例があったり活用方法は沢山記事になってます。
MQTT は、Publish/Subscribe メッセージングモデルにより、非同期に 1 対多の通信ができるプロトコルです。
プロトコル仕様は、軽量かつシンプルにデザインされています。
IoT(Internet of Things)や M2M(Machine to Machine)などのように、小メモリやネットワーク帯域幅が限られているような環境での利用に適しています。
登場人物がわかりづらい。。
絵があった方がわかりやすいですよね。
可愛くてわかりやすかった絵がこちら↓
※こちらのQiita記事挿絵を参考にさせていただいてます。
詳細を説明している記事は沢山あるのでここでは説明を割愛します。
それでは、実際に動かしてみましょう。
MQTT BrokerとPublisher/Subscriber
MQTT Broker
Mosquittoをラズパイにインストール。
色んな端末から情報を観測できる様、自分の端末ではなくラズパイをBrokerにしていきます。
Eclipse Mosquitto はオープンソース(EPL/EDL ライセンス)のメッセージブローカーで、MQTT プロトコル バージョン 5.0, 3.1.1 および 3.1 を実装しています。Mosquittoは軽量で、低消費電力のシングルボードコンピュータからフルサーバーまで、あらゆるデバイスでの使用に適しています。
Subscriber
今回はPythonで実行したかったのでpaho Python Client を利用します。
サンプルやドキュメントを見た感じ簡単に扱えそうだったので選びました。
Paho Python Client は、MQTT v5.0、MQTT v3.1.1 および v3.1 を Python 2.7 または 3.x でサポートするクライアントクラスを提供します。また、MQTT サーバに単発メッセージを非常に簡単に発行するためのヘルパー関数もいくつか提供されます。
Publisher
Publisherは勿論Meraki MVですね。
MQTTでサブスクするトピックはこの二つを取得する事にします。
トピックの種類はDeveloper hubから確認できます。
topic: /merakimv/XXXX-XXXX-XXXX/0
topic: /merakimv/XXXX-XXXX-XXXX/light
インストール
Mosquitto
ラズパイに MQTT Broker になってくれる Mosquitto を準備します。
raspberrypi:~$sudo apt install mosquitto mosquitto-clients
status が active(running) を確認します。
raspberrypi:~$ sudo systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-06-20 10:55:32 JST; 31min ago
ラズパイの設定はこれで完了。
自分の端末の準備をしていきます。
Paho Python Client
$pip install paho-mqtt
次は、実行するコードを準備します。
ラズパイのIPとMVのSerialが必要になります。
import paho.mqtt.client as mqtt
host = '{ラズパイのIP}'
port = 1883
topic = '/merakimv/{MVのSerial}/0'
topic2 = '/merakimv/{MVのSerial}/light'
def on_connect(client, userdata, flags, respons_code):
print('status {0}'.format(respons_code))
#topicを複数登録
client.subscribe(topic)
client.subscribe(topic2)
def on_message(client, userdata, msg):
#topic QOS payloadを取得
print(msg.topic+" "+str(msg.payload))
if __name__ == '__main__':
client = mqtt.Client(protocol=mqtt.MQTTv311)
client.on_connect = on_connect
client.on_message = on_message
client.connect(host, port=port, keepalive=60)
# 待ち受け状態にする
client.loop_forever()
引用元 : eclipse/paho.mqtt.python
Meraki Setting
MerakiダッシュボードでMQTTの設定を行います。
カメラ設定のMQTTブローカーの追加または編集で操作できます。
今回はBrokerをラズパイにするのでIPもラズパイのIPです。
Test Connection:にはMVのシリアルを指定します。
Testを実行すると Connection successfull が出力されればOKです。
MQTTブローカーの設定に先ほど登録した ブローカー名 を設定すれば準備完了です。
実行
以下の出力ではMVのシリアルを隠してます。
自分の端末から以下コードを実行
$ python3 MQTT/paho_mqtt.py
status 0
b'{"ts":1655695135614, "counts":{"person":1}}'
b'{"lux": 79.7}'
b'{"ts":1655695135787, "counts":{"person":1}}'
b'{"lux": 79.2}'
b'{"ts":1655695135996, "counts":{"person":1}}'
b'{"lux": 78.3}'
b'{"ts":1655695136162, "counts":{"person":1}}'
b'{"lux": 69.9}'
b'{"ts":1655695136367, "counts":{"person":1}}'
b'{"lux": 2.6}'
b'{"ts":1655695136618, "counts":{"person":0}}'
b'{"lux": 0.7}'
b'{"ts":1655695136827, "counts":{"person":0}}'
b'{"lux": 0.3}'
b'{"ts":1655695137005, "counts":{"person":0}}'
b'{"lux": 0.5}'
b'{"ts":1655695137125, "counts":{"person":0}}'
b'{"lux": 46.9}'
b'{"ts":1655695137331, "counts":{"person":0}}'
b'{"lux": 87.7}'
b'{"ts":1655695137414, "counts":{"person":0}}'
b'{"lux": 83.6}'
問題なく動きました。
実行後に暗くしてLuxが下がるのを確認したり、カメラの前に出たり入ったりしました。
"person":1
"lux": 0.5
数値がリアルタイムで変動してるのが観測できました!!
まとめ
MQTTの仕組みや挙動を確認できて面白かったです。
今回はMekraki MVから情報を取得しましたが、次は情報を活用したいですね。
機器用意できませーんという方
MQTTを試したいけど「機器を用意できないよ!」って方は以下のサイトがおすすめです。
めちゃくちゃ簡単に動きを確認できます。
参考記事/引用元