AWS Iotをやってみた


はじめに

とりあえずAWS IoTを体験してみたい人向けの記事です。
クラウドと自端末を繋げてみる記事です。

環 境

端末
OS:Ubuntu18.04LTS(VMware内で起動)
Python:3.6.9

構築手順

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

AWS IoTに接続する

AWS IoTにアクセスし、「開始方法」をクリックします。

説明がでてきますが、気にせず「開始方法」をクリック。
相変わらず日本語下手過ぎて、何言ってるか分からないですね。

AWS IoTにどのように接続していますか?

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

モノの登録

モノ登録を行います。
適当に「モノ」の名前を付けます。
今回は”test01”にしました。

接続キットのダウンロード

接続キットのダウンロードを行います。
ダウンロードしたファイル(connect_device_package.zip)は端末(今回であればUbuntu)にコピーします。

接続キットには、
・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)でやっている人がいますが、ユーザ権限で大丈夫です。

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

error: could not create '/usr/local/lib/python3.6/dist-packages/AWSIoTPythonSDK': Permission denied

実はこのエラー、権限エラーのように見えて、本当はAWSIoTPythonSDKがインストールされていないために起こるエラーです。
下記コマンドを入れて、AWSIoTPythonSDKをインストールすれば直ります。

pip install AWSIoTPythonSDK

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

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されていることを確認します。

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できていると、下記画像のように画面に表示されます。

今度は逆に、クラウドからIoT機器にPublishします。
「ステップ4:デバイスにメッセージを送信する」の枠内に、適当に文字を入力します。
今回は、「Long time no see!」を入れてみました。

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

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

「完了」を押すと、最後の確認画面が出ます。
気にせず、「完了」を押します。

おつかれさまでした。

まとめ

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

参考URL

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