AWS Iotをやってみた


#はじめに
とりあえずAWS IoTを体験してみたい人向けの記事です。
クラウドと自端末を繋げてみる記事です。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/8c42a136-ec24-04b2-0ac1-dfb88c6ef3e3.png)

#環　境
端末
OS：Ubuntu18.04LTS（VMware内で起動）
Python：3.6.9

#構築手順
下記手順に従って、クラウド⇔クライアントの通信環境を構築します。

## AWS IoTに接続する
AWS IoTにアクセスし、「開始方法」をクリックします。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/eefde3d9-3297-488e-ba4e-e23968ad3d5d.png)

説明がでてきますが、気にせず「開始方法」をクリック。
相変わらず日本語下手過ぎて、何言ってるか分からないですね。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/1fc9acb0-37be-cd3f-3cc1-543cacb458b3.png)

## AWS IoTにどのように接続していますか？
接続機器のプラットフォーム（OS）、接続用のSDKのプログラミング言語を選択します。
今回はUbuntuをクライアントとして利用するので、
プラットフォームは「Linux/OSX」を選択。
SDKはどれでもいいですが、今回は「Python」を選択。
最後に次へを押します。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/33fefc88-5424-b367-40f3-658980cd2837.png)
##モノの登録
モノ登録を行います。
適当に「モノ」の名前を付けます。
今回は”test01”にしました。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/72897815-97e1-d549-4f32-107a9992d1a1.png)
##接続キットのダウンロード
接続キットのダウンロードを行います。
ダウンロードしたファイル（connect_device_package.zip）は端末（今回であればUbuntu）にコピーします。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/787a07da-f807-58ae-00a7-72c9bfdbdf1b.png)

接続キットには、
・SDK：aws-iot-device-sdk-python
・AWSの証明書：root-CA.crt 
・「モノ」用の秘密鍵：test01.private.key
・「モノ」用の公開鍵：test01.public.key
・「モノ」用の証明書：test01.cert.pem
が入っており、至れり尽くせりです。
しかも中のスクリプトファイル（start.sh）を実行するだけで、SDKのインストールからサンプルファイル（basicPubSub.py）の実行までやってくれます。
ちなみにAWSの証明書はリージョン（サーバ群が設置されている国）によって異なりますが、日本リージョン（ap-northeast-1）にアクセスしている場合は勝手に日本リージョンの証明書がダウンロードされます。

##デバイスの接続とテスト
**まだ完了を押してはいけません。**
ダウンロードしたファイルのあるディレクトリで、赤枠のコマンドを順に実行していきます。
他サイトを見ると管理者権限（sudo）でやっている人がいますが、ユーザ権限で大丈夫です。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/f19fe1be-25b3-1c9e-de55-f1fd2d413b72.png)


ただし、多くの場合はライブラリ不足でこけると思います。
自分の場合はAWSIoTPythonSDKフォルダの作成権限がないと怒られました。

```shell
error: could not create '/usr/local/lib/python3.6/dist-packages/AWSIoTPythonSDK': Permission denied
```
実はこのエラー、権限エラーのように見えて、本当はAWSIoTPythonSDKがインストールされていないために起こるエラーです。
下記コマンドを入れて、AWSIoTPythonSDKをインストールすれば直ります。

```shell
pip install AWSIoTPythonSDK
```

もし、pipも入っていない人は次のコマンドでインストールします。

```shell
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
```
参考URL：https://pip.pypa.io/en/stable/installing/

実行に成功すると、Ubuntuのコンソール画面に下記内容が出力されます。
Hello World!がPublishされていることを確認します。

```sh
2020-10-11 21:09:20,862 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Invoking custom event callback...
2020-10-11 21:09:20,862 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Performing sync subscribe...
2020-10-11 21:09:20,862 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Adding a new subscription record: sdk/test/Python qos: 1
2020-10-11 21:09:20,862 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Filling in custom suback event callback...
2020-10-11 21:09:20,927 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Produced [suback] event
2020-10-11 21:09:20,927 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Dispatching [suback] event
2020-10-11 21:09:20,927 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Invoking custom event callback...
2020-10-11 21:09:20,927 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - This custom event callback is for pub/sub/unsub, removing it after invocation...
2020-10-11 21:09:22,930 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Performing sync publish...
2020-10-11 21:09:22,930 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Filling in custom puback (QoS>0) event callback...
2020-10-11 21:09:22,954 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Produced [puback] event
2020-10-11 21:09:22,955 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Dispatching [puback] event
2020-10-11 21:09:22,955 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - Invoking custom event callback...
2020-10-11 21:09:22,955 - AWSIoTPythonSDK.core.protocol.internal.clients - DEBUG - This custom event callback is for pub/sub/unsub, removing it after invocation...
2020-10-11 21:09:22,983 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Produced [message] event
2020-10-11 21:09:22,984 - AWSIoTPythonSDK.core.protocol.internal.workers - DEBUG - Dispatching [message] event
Received a new message: 
b'{"message": "Hello World!", "sequence": 0}'
from topic: 
sdk/test/Python
--------------
```

IoT機器側でうまくPublishできていると、下記画像のように画面に表示されます。
![a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/57eda610-a921-4f1f-44e2-72f1c7d9d644.png)

今度は逆に、クラウドからIoT機器にPublishします。
「ステップ4：デバイスにメッセージを送信する」の枠内に、適当に文字を入力します。
今回は、「Long time no see!」を入れてみました。
![b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/422421d9-3bb7-43b9-27eb-58299763390a.png)

「メッセージ送信」クリックします。
うまくいくと、下記内容がstart.shを実行したターミナルに出力されます。

```sh
Received a new message: 
b'Long time no see!'
from topic: 
sdk/test/Python
--------------
```

「完了」を押すと、最後の確認画面が出ます。
気にせず、「完了」を押します。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/59daa2ce-23c5-ea66-f5e3-086833d3e37e.png)

おつかれさまでした。

#まとめ
シンプルなAWS IoTを実装し、クライアント⇔クラウドの通信を体験しました。
次回はセンサー情報をやり取りさせたいと思います。

#参考URL
MQTTについて
https://myenigma.hatenablog.com/entry/2019/10/27/194549