Meraki MV Sense MQTT を使ってみた

# 背景
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
```
# 構成
今回動作確認をした構成図はこちら。
毎度わかりずらいのはすいません☺

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730261/9cda49ca-dd2d-d5e3-76df-bbdb59b455d3.png" width="700">

# Meraki MV、MQTTとは？
`Meraki MV` 
高性能なセキュリティカメラ。
物体検出だったり動きを検出した時間帯を把握できる。Merakiがクラウド管理なので、撮影情報の保存先もクラウド管理。
詳細は[Meraki MV](https://www.cisco.com/c/m/ja_jp/meraki/products/security-cameras.html)や他に日本語記事が沢山あるので割愛します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730261/2e044c95-e281-9181-18cf-1f0ff39b04fd.png" width="500">

`MQTT`
非同期で機器から取得できる情報を送り続けてくれる。
複数のIoT機器から取得できる情報をグラフにする[活用例](https://qiita.com/tshimizu8/items/8c103f5f52be784792c0)があったり活用方法は沢山記事になってます。
> MQTT は、Publish/Subscribe メッセージングモデルにより、非同期に 1 対多の通信ができるプロトコルです。
>プロトコル仕様は、軽量かつシンプルにデザインされています。
>IoT（Internet of Things）や M2M（Machine to Machine）などのように、小メモリやネットワーク帯域幅が限られているような環境での利用に適しています。
>>[引用元:MQTT の仕様](http://devcenter.magellanic-clouds.com/learning/mqtt-spec.html)

登場人物がわかりづらい。。
絵があった方がわかりやすいですよね。
可愛くてわかりやすかった絵がこちら↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730261/87ef2a38-bd0e-f8c4-d9fb-e7551ab05d57.png" width="500">
※[こちら](https://qiita.com/sheep29/items/637f9f00e35cc707f681)のQiita記事挿絵を参考にさせていただいてます。

詳細を説明している記事は沢山あるのでここでは説明を割愛します。
それでは、実際に動かしてみましょう。
# MQTT BrokerとPublisher/Subscriber
`MQTT Broker`
[Mosquitto](https://mosquitto.org/)をラズパイにインストール。
色んな端末から情報を観測できる様、自分の端末ではなくラズパイをBrokerにしていきます。

>Eclipse Mosquitto はオープンソース（EPL/EDL ライセンス）のメッセージブローカーで、MQTT プロトコル バージョン 5.0, 3.1.1 および 3.1 を実装しています。Mosquittoは軽量で、低消費電力のシングルボードコンピュータからフルサーバーまで、あらゆるデバイスでの使用に適しています。

`Subscriber`
今回はPythonで実行したかったので[paho Python Client](https://www.eclipse.org/paho/index.php?page=clients/python/index.php) を利用します。
サンプルやドキュメントを見た感じ簡単に扱えそうだったので選びました。

>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](https://developer.cisco.com/meraki/mv-sense/#!mqtt)から確認できます。
```
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**が必要になります。
```paho_mqtt.py
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](https://github.com/eclipse/paho.mqtt.python)

# Meraki Setting
MerakiダッシュボードでMQTTの設定を行います。
カメラ設定の**MQTTブローカーの追加または編集**で操作できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730261/5136d155-4776-3a7e-3fa1-b398ca6fa5d6.png" width="500">
今回はBrokerをラズパイにするのでIPもラズパイのIPです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730261/afde4650-0729-8dc7-af22-524efb28bca0.png" " width="500">
Test Connection:にはMVのシリアルを指定します。
Testを実行すると **Connection successfull** が出力されればOKです。
MQTTブローカーの設定に先ほど登録した **ブローカー名** を設定すれば準備完了です。

# 実行
:::note info
以下の出力ではMVのシリアルを隠してます。
:::

自分の端末から以下コードを実行

```$ python3 MQTT/paho_mqtt.py
$ 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を試したいけど「機器を用意できないよ！」って方は以下のサイトがおすすめです。
めちゃくちゃ簡単に動きを確認できます。

https://mqtt.uko.jp/

-----------------------------------------

### 参考記事/引用元

[Cisco Live 2020 Meraki MV](https://www.ciscolive.com/c/dam/r/ciscolive/apjc/docs/2020/pdf/BRKIOT-1004.pdf)

https://qiita.com/sheep29/items/637f9f00e35cc707f681



https://knt60345blog.com/mqtt/