shadowとwillとretainを活用してAWS IoT CoreとPubSubする⑪mosquittoでretainとwill

## この記事について  

[shadowとwillとretainを活用してAWS IoT CoreとPubSubする⑩mosquittoでshadow update](https://qiita.com/Saito5656/items/44bc48c4f8579d98d25a)で行ったmosquittoでのmessage pubsub、shadow update/getに続いてmessage retainとwill(notification)を設定します。

[shadowとwillとretainを活用してAWS IoT CoreとPubSubする⑤pahoでretainとwill](https://qiita.com/Saito5656/items/ae71d9c66f850a1e8be6)で詳細に説明した内容は割愛します。 

## retain  

AWS IoTでsubした最新messageを、S3やDynamoDBに保存するのではなくIoT Coreで保持します。 

<img width= 700 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/c6afeabe-4a0e-f27b-2971-742ff9eb7342.png>

### 設定方法  

mosquittoでretainを設定するためにはmosquitto_pubコマンドにrオプションを付けます。

```sh:pub
mosquitto_pub -h 127.0.0.1 -u ${username} -P ${password} -t $topic -m "$payload" -r
```

### 実行結果

messageの保存がコンソールで確認できました。  

<img width= 700 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/c3145d52-ab20-c7ce-fcf6-f1e6907078ff.png>

## will  

mosquittoではwill機能に変わるものとしてnotificationがあります。

pahoとAWS IoT Device SDKで説明したwillと同様の使い方が可能だと思います。

本稿では便宜上このままwillと呼ばせていただきます。

<img width= 700 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/e238f186-f491-6350-8f87-f151ffb7323b.png>

### 設定方法  

説明はこちらです。

> Place your local configuration in /etc/mosquitto/conf.d/
> 
> A full description of the configuration file is at
> /usr/share/doc/mosquitto/examples/mosquitto.conf.example

```sh:/usr/share/doc/mosquitto/examples/mosquitto.conf
# If set to true, publish notification messages to the local and remote brokers
# giving information about the state of the bridge connection. Retained
# messages are published to the topic $SYS/broker/connection/<clientid>/state
# unless the notification_topic option is used.
# If the message is 1 then the connection is active, or 0 if the connection has
# failed.
# This uses the last will and testament feature.
#notifications true

# Choose the topic on which notification messages for this bridge are
# published. If not set, messages are published on the topic
# $SYS/broker/connection/<clientid>/state
#notification_topic
```


説明に従い[/etc/mosquitto/conf.d/bridge.conf](https://qiita.com/Saito5656/items/1398200115bb9c47116a#bridge)にnotification設定をします。

```sh:/etc/mosquitto/conf.d/bridge.conf
#以下を追加
notifications true
# will topic
notification_topic MQTTServer/MQTTServer1/will
```

### willの動作確認

mosquittoを再起動します。

```sh
sudo systemctl enable mosquitto
sudo systemctl daemon-reload
sudo systemctl restart mosquitto
```

AWS IoT CoreのMQTTクライアントで接続がアクティブなことを示す1がwill topicで確認できます。

<img width= 700 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/e37d8d39-3b88-b863-be3c-4861fe505836.png>


回線を切断して動作を確認します。

```sh
~ $ nmcli c
NAME     UUID                                  TYPE      DEVICE
w0-inet  26a642da-5cb5-4922-9d11-36c55c228d67  wifi      wlan0
lo       8a283e6d-f9b3-4a8a-a90c-8d761f1abf78  loopback  lo
e0-lo    c32ebcb0-ef11-4fc0-acc9-5d0322760f35  ethernet  eth0
~ $ sudo nmcli c down w0-inet
Connection 'w0-inet' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
~ $ nmcli c
NAME     UUID                                  TYPE      DEVICE
lo       8a283e6d-f9b3-4a8a-a90c-8d761f1abf78  loopback  lo
e0-lo    c32ebcb0-ef11-4fc0-acc9-5d0322760f35  ethernet  eth0
w0-inet  26a642da-5cb5-4922-9d11-36c55c228d67  wifi      --
```

AWS IoT CoreのMQTTクライアントで接続失敗を示す0がwill topicで確認できました。

<img width= 700 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/c578bf89-c168-fb87-6e2d-350aea14b679.png>

この1/0のフラグを接続状態判定トリガーとして使えそうです。

<br>

## 最後に

「shadowとwillとretainを活用してAWS IoT CoreとPubSubする」と題して11回に分けて説明してきたpaho、AWS IoT Device SDK、mosquittoを使ったAWS IoT CoreとのMQTT基本操作備忘録は以上で終了となります。

これ以外にも必要な手順が色々とありますので折を見て備忘録に追加したいと思います。

連続投稿にお付き合いいただきありがとうございました。