はじめに
こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。
少しずつ出来上がってきました、「混雑状況可視化サービス」! 作成していただいたプログラムを実装するのはラズパイなのですが、いかんせん全員に配布して確認してもらうようなことができません。
というわけで簡易的にプログラムが動く環境を作業端末に作ろう、というのがこの記事の趣旨です。もちろんカメラでキャプチャするとかCO2濃度を測定するみたいな部分は使えないので、固定値を与えた上でクラウド側へ値を送信する部分を確認することが目的です。
WSLの導入と初期設定
WSLの導入と初期設定についてはこちらの記事をご確認ください。本記事ではUbuntu 20.04で検証しています。
記事ではAnsibleも導入していますが、Ansible(と連携しなければVisual Studio Codeも)部分だけ飛ばしてもらえればOKです。
IoTポリシーの作成、IoTモノの登録
前回同様、既存のポリシーを使います。IoTモノは前もって登録しておきました。
【AWS・IoT】Pythonを使って作業PCからIoT CoreへMQTT接続しようとしたらエラー対応に追われた話(Resolved) - BFT名古屋 TECH BLOG
WSL側の準備
それではWindowsの時と同様、実行環境の準備を行います。
必ずリポジトリとパッケージの更新はしておきましょう。
sudo apt update sudo apt upgrade
Pythonのインストール確認
Pythonは3.5以上が必要です。 WSL(Ubuntu20.04)には3.8.5が最初から入っています。 最新ではないですが、特に問題ないのでこのままとします。
# pythonコマンドではないと言われる ubuntuuser@DESKTOP-AC9R8UJ:~$ python -V Command 'python' not found, did you mean: command 'python3' from deb python3 command 'python' from deb python-is-python3 ubuntuuser@DESKTOP-AC9R8UJ:~$ # python3コマンドでバージョンを確認する ubuntuuser@DESKTOP-AC9R8UJ:~$ python3 -V Python 3.8.5 ubuntuuser@DESKTOP-AC9R8UJ:~$
必要なパッケージのインストール&確認
① python-pip
pythonのパッケージ管理システムであるpipをインストールします。
# python3-pipのインストール ubuntuuser@DESKTOP-AC9R8UJ:~$ sudo apt install python3-pip Reading package lists... Done Building dependency tree Reading state information... Done ~略~ ubuntuuser@DESKTOP-AC9R8UJ:~$ # pip3のバージョン確認 ubuntuuser@DESKTOP-AC9R8UJ:~$ pip3 --version pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8) ubuntuuser@DESKTOP-AC9R8UJ:~$
② git
あとでgitコマンドを使うため、インストールします。
# gitのインストール(入ってました) ubuntuuser@DESKTOP-AC9R8UJ:~$ sudo apt-get install git Reading package lists... Done Building dependency tree Reading state information... Done ~略~ # gitのバージョン確認 ubuntuuser@DESKTOP-AC9R8UJ:~$ git --version git version 2.25.1 ubuntuuser@DESKTOP-AC9R8UJ:~$
③ AWS IoT Device SDK
ホームディレクトリに移動し、AWS IoT Device SDKとサンプルアプリケーションをインストール&ダウンロードします。
# ホームディレクトリに移動 ubuntuuser@DESKTOP-AC9R8UJ:~$ cd ubuntuuser@DESKTOP-AC9R8UJ:~$ pwd /home/ubuntuuser # awsiotsdkのインストール ubuntuuser@DESKTOP-AC9R8UJ:~$ python3 -m pip install awsiotsdk ~略~ # AWS SDK for Python v2のリポジトリをクローン ubuntuuser@DESKTOP-AC9R8UJ:~$ git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git ~略~ # ホームディレクトリ配下にaws-iot-device-sdk-python-v2ディレクトリがクローンされた ubuntuuser@DESKTOP-AC9R8UJ:~$ ls -l total 8 drwxr-xr-x 11 ubuntuuser ubuntuuser 4096 Jun 23 14:54 aws-iot-device-sdk-python-v2 ubuntuuser@DESKTOP-AC9R8UJ:~$
サンプルスクリプトの実行準備
aws-iot-device-sdk-python-v2ディレクトリ内にあるサンプルスクリプトを実行するための設定を行います。
クライアント証明書、秘密鍵の配置
IoTモノを登録した時に作成しダウンロードしたクライアント証明書(~.pem.crt)と秘密鍵(~.private.pem.key)をWSL上に配置します(公開鍵は不要)。配置する場所はサンプルスクリプトの作り上、ホームディレクトリ配下に作成したcertsディレクトリです。
# certsディレクトリ作成 ubuntuuser@DESKTOP-AC9R8UJ:~$ mkdir certs # certsディレクトリがあることを確認 ubuntuuser@DESKTOP-AC9R8UJ:~$ ls -l total 8 drwxr-xr-x 11 ubuntuuser ubuntuuser 4096 Jun 23 14:54 aws-iot-device-sdk-python-v2 drwxr-xr-x 2 ubuntuuser ubuntuuser 4096 Jun 23 15:04 certs ubuntuuser@DESKTOP-AC9R8UJ:~$
WindowsからWSLにアクセスするには、ファイル名を指定して実行(Windowsキー + r )かエクスプローラのアドレスバーで「\wsl$」と入力・実行します。
[ home ] - [ <ユーザ名> ] - [ certs ] と進み、証明書(~.pem.crt)と秘密鍵(~.private.pem.key)を置きます。
AWSルートCA証明書の配置
AWSのルートCA証明書はIoTモノを登録して作成したクライアント証明書などをダウンロードする画面で以下のURLリンクが表示されます。
サーバー認証 - AWS IoT Core
このサイトの真ん中くらいに「Amazon Root CA 1」のリンクを押すと間違えたかなと思うような文字列が表示されますが、これをコピーしてテキストに保存する必要があります。
メモ帳、サクラエディタ、Visual Studio Codeなどのテキストエディタに内容を貼り付け、「Amazon-root-CA-1.pem」という名前で保存してください。
保存したファイルは先ほどのクライアント証明書、秘密鍵を配置した/home/<ユーザ名>/certsディレクトリに移動しておきます。
エンドポイントの確認
エンドポイント、とは送信先ととらえればOKです。AWSの管理画面で確認ができます。
[ AWS IoT Core ] - [ 設定 ] に表示されているエンドポイントの文字列をコピーしてください。次のコマンドで使用します。
サンプルアプリケーションの実行
ディレクトリ構成はこのようになっています。
pubsub.pyを実行するためにディレクトリを移動します(必須ではないですが記載したコマンドを実行するために移動)。
# 現在地確認 ubuntuuser@DESKTOP-AC9R8UJ:~$ pwd /home/ubuntuuser # サンプルアプリケーションのあるディレクトリに移動 ubuntuuser@DESKTOP-AC9R8UJ:~$ cd aws-iot-device-sdk-python-v2/samples/ ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ # 実行する「pubsub.py」があることを確認 ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ ls -l total 92 -rw-r--r-- 1 ubuntuuser ubuntuuser 17933 Jun 23 14:54 README.md -rw-r--r-- 1 ubuntuuser ubuntuuser 5388 Jun 23 14:54 basic_discovery.py -rw-r--r-- 1 ubuntuuser ubuntuuser 17259 Jun 23 14:54 fleetprovisioning.py -rw-r--r-- 1 ubuntuuser ubuntuuser 2878 Jun 23 14:54 ipc_greengrass.py -rw-r--r-- 1 ubuntuuser ubuntuuser 13767 Jun 23 14:54 jobs.py -rw-r--r-- 1 ubuntuuser ubuntuuser 8060 Jun 23 14:54 pubsub.py -rw-r--r-- 1 ubuntuuser ubuntuuser 16285 Jun 23 14:54 shadow.py ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ # 実行する ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ python3 pubsub.py --endpoint XXXX-ats.iot.ap-northeast-1.amazonaws.com --root-ca ~/certs/Amazon-root-CA-1.pem --cert ~/certs/XXXX-certificate.pem.crt --key ~/certs/XXXX-private.pem.key AWS libcrypto resolve: searching process and loaded modules AWS libcrypto resolve: found static aws-lc HMAC symbols AWS libcrypto resolve: found static aws-lc libcrypto 1.1.1 EVP_MD symbols Connecting to a38ctv0lrxyc9e-ats.iot.ap-northeast-1.amazonaws.com with client ID 'test-9d95c17e-4fd7-4d05-89e0-2d27448453d6'... Connected! Subscribing to topic 'test/topic'... Subscribed with QoS.AT_LEAST_ONCE Sending 10 message(s) Publishing message to topic 'test/topic': Hello World! [1] Received message from topic 'test/topic': b'Hello World! [1]' Publishing message to topic 'test/topic': Hello World! [2] Received message from topic 'test/topic': b'Hello World! [2]' Publishing message to topic 'test/topic': Hello World! [3] Received message from topic 'test/topic': b'Hello World! [3]' Publishing message to topic 'test/topic': Hello World! [4] Received message from topic 'test/topic': b'Hello World! [4]' Publishing message to topic 'test/topic': Hello World! [5] Received message from topic 'test/topic': b'Hello World! [5]' Publishing message to topic 'test/topic': Hello World! [6] Received message from topic 'test/topic': b'Hello World! [6]' Publishing message to topic 'test/topic': Hello World! [7] Received message from topic 'test/topic': b'Hello World! [7]' Publishing message to topic 'test/topic': Hello World! [8] Received message from topic 'test/topic': b'Hello World! [8]' Publishing message to topic 'test/topic': Hello World! [9] Received message from topic 'test/topic': b'Hello World! [9]' Publishing message to topic 'test/topic': Hello World! [10] Received message from topic 'test/topic': b'Hello World! [10]' 10 message(s) received. Disconnecting... Disconnected! ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$
test/topicというトピックに向けて10回「Hello World!」とPublish(送信)してReceive(サブスクライブ、受信)もしていることがわかります。
クラウド側でテストとしてtest/topicをサブスクライブして確認することもできます。指定された形式で表示できないエラーとなってはいますが、「Hello World!」を10回受信しています。
終わりに
サンプルアプリケーションを通して動きの部分や認証について学ぶことができました。ありがたい限りです。
これで作成したプログラムを実行できる環境が整いましたので、次回はプログラムを実行してみようと思います。
ここまで読んでいただきありがとうございました~ ^ ^