ども!まとんです。
Windowsを使っているけど、LinuxでAWS IoTを動かしたい!という人のために、Windows10のWSLでUbuntuを立ち上げて、PyhonでAWS IoTと通信する方法をメモします。
まず、今作りたいもの
「ボタンを押したらソレノイドが動くおもちゃ」を作りたいです。
今回はAWSの練習を兼ねているので、AWSを介して通信する仕組みを実装します。
想定しているアーキテクチャ。
SORACOMの「あのボタン」を押すと、AWS上でLambdaが走って、AWS IoTからMQTTをPublishします。
ソレノイドを駆動するArduinoは通信機能を持たないので、WiFiモジュールとセットになった評価基板が売られているESP32で代用し、iPhoneのテザリングでインターネットに繋げます。
ESP32にAWS IoTの証明書を保存しておけば、これでセキュアに通信できるはず。
進捗
青の部分は既に実装できました。(この記事の最後にリンクを貼っておきます)
今回はAWS IoTの部分を作ります。
Windows Subsystem for Linux(WSL)とは?
Windows10の機能で、Windows上でUbuntuの端末を操作できます。
数年前までは「Bash on Windows(BoW)」と呼ばれていましたが、2017年10月17日の正式版からWSLに名前が統一されました。
何が嬉しいって、WindowsユーザーでもLinux環境が手に入ります!!
WindowsユーザーがLinux環境を使おうと思うと、従来は
・あきらめてMacを買う
などがありましたが、どれも苦しかったです(環境構築が大変・動作が重い・金がかかる・ポリシーに反する、など)。
しかしWSLは、Windowsストアでダウンロードできる標準ソフトです。
導入がめちゃくちゃ簡単です!
色々な説明サイトがありますが、僕はこのサイトを参考にしてUbuntuを入れました。
環境
・Ubunsu 18.04.2 LTS (WSL)
・Python 3.6.7
・AWS IoT
・AWS IoT Device SDK for Python
Ubuntuの環境構築
WSLでUbuntuが立ち上がったら、まず各種アップデートをします。
sudoのパスワードはWindowsのパスワードと同じです。
$sudo apt update
$sudo apt upgrade
なお、WSLのUbuntuを開くと、Windowsユーザー名でログインすることになります。
別のユーザーでログインしたい場合(例えばrootなど)は、コマンドプロンプトで下記実行します。
ubuntu config --default-user <ログインするユーザー名>
WSL その123 - デフォルトのユーザーを変更するには・ディストリビューションをクリーンな状態に戻すには - kledgeb
なお、$sudo suも使えるので、rootでログインする必要はありません。
僕はWindowsのユーザー名が実名で恥ずかしかったので、ログイン名を「maton」に変えました。
気にならない人は、そのままでいいと思います。
Pythonをインストール
Python3とpipをインストールします。(ここらへんうろ覚えなので、他にもやることあったかも)
$sudo apt install python3
$sudo apt install python3-pip
$python3 --version
Python 3.6.7
pipをアップデートします。
$sudo pip3 instal --upgrade pip
$sudo pip3 --version
pip 19.0.3 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)
あと他にも必要なものを入れておきます。
$sudo apt install unzip
$sudo apt install git
$sudo apt update
$sudo apt upgrade
AWS IoTでデバイス登録
AWS IoTは、インターネットでのセキュア通信を担保するため、証明書などの一式をzipでダウンロードできるという優れた機能があります。
ここらへん、自分で実装するのは果てしなくめんどくさいので、非常に助かります!
AWSコンソールにログインして、ダッシュボードの「ソリューションの構築」から「IoTデバイスを登録する」を開きます。
(ダッシュボードに無い場合は、「AWS IoT」→「オンボード」→デバイスの設定「開始方法」)
下記登録していきます。
名前:highso-thing
「接続キットのダウンロード」で、「connect_device_package.zip」をWindowsのどこかにダウンロードします。今回はDesktopにダウンロードしました。
このzipの中に、AWS IoTと接続するための証明書などが含まれています。
Ubuntu(WSL)にzipをコピー
Ubuntu(WSL)のディレクトリの実態は、Windowsの奥深い特殊なディレクトリにあり、Windowsから直接触るのは非推奨とされています。
(ファイルシステムが異なるので、下手にいじるとファイルが破損する恐れがある)
Ubuntu(WSL)からWindowsを見ると、/mntがrootディレクトリに見えています。
例えばCドライブは/mnt/cです。
そこで、Ubuntuを開いて、先ほどダウンロードしたzipをcpコマンドでコピーします。
$cd /home/maton
$mkdir AWS-IoT
$cp /mnt/c/Users/<UserName>/Desktop/connect_device_package.zip /home/maton/AWS-IoT/
$cd AWS-IoT
(matonはUbuntuのユーザー名、<UserName>はWindowsのユーザー名です。適宜変更してください。)
AWS IoT接続キットを実行して接続テスト
基本的にはAWS画面上に表示されているコマンドを打っていけばよいのですが、すこし詰まったので詳細に説明します。
1. zipを解凍
$unzip connect_device_package.zip
2. 実行権限を付与
$sudo chmod +x start.sh
ここまでは問題ないです。
3. 開始スクリプトを実行
$sudo ./start.sh
ここで色々とエラーが起きました。
エラーメッセージ
Running pub/sub sample application...
Traceback (most recent call last):
File "aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py", line 18, in <module>
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
ImportError: No module named AWSIoTPythonSDK.MQTTLib
AWSIoTPythonSDKなるモジュールが見つからないと。確かに、インスト―ルした記憶が無い。
ここで、start.shは気が利いていて、モジュールをgit cloneで同ディレクトリにダウンロードしてくれていました。
なので、モジュールをインストールするだけ。
$cd aws-iot-device-sdk-python
$chmod +x setup.py
$sudo python3 ./setup.py install
このsetup.pyを実行するだけでインストールされる。これは便利!AWS先生、気が利くぅ!
で、もっかい実行。
$sudo ./start.sh
しかし、まだエラーがでる。
どうやら、この環境のpythonは「python3」なのに、スクリプトでは「python」になっていることが原因のようだ。
start.shを直接変更。
$vim start.sh
-python setup.py install
+python3 setup.py install
(vimは、「i」を押すと編集モード。「ESC」を押してコマンドモードにした後、「:wq」エンターで上書き保存)
よく考えたら、最初からこれをやっておけばエラーは吐かなかったと思う。
改めて、
$sudo ./start.sh
これで通った!AWSのブラウザ上に1秒ごとにメッセージが表示されればOKです。
AWS上で動作確認
AWS IoTのMQTTが疎通していることを確認する方法を説明します。
Publishの確認
start.shは1秒ごとにトピック名「sdk/test/Python」にメッセージをPublishしています。
「AWS IoT Core」→「テスト」→「トピックへサブスクライブする」
「トピックのサブスクリプション」に「sdk/test/Python」と入れて「トピックへのサブスクリプション」を押すと、start.shからのメッセージをブラウザ上で受信確認できます。
これはTopic名「HighsoTopic」での疎通確認の様子。
なお、SORACOMのボタンはAWS 1-clickを使いますが、AWS 1-clickはオレゴンにしかないので、リージョンはオレゴンを選んでいます。
Subscribeの確認
start.shはメッセージのSubscribeもしています。
「AWS IoT Core」→「テスト」→「トピックへの発行」
フォームに「sdk/test/Python」と入れて、下のエディタで「"message": "Hello from AWS IoT console"」のHello以下を好きな文言に変えて、「トピックに発行」ボタン
すると、Ubuntuのstart.sh上に、メッセージが瞬時に届きます。
Topic名の変更
MQTTプロトコルは、好きなTopic名でメッセージを送受信できるのが特徴です。
MQTTにおけるTopic名とは「雑誌の名前」のようなものです。
出版社(Publisher)は雑誌AをTopic名「A」でPublish(出版)し、雑誌Aを読みたい人(Subscriber)は、Topic名「A」をSubscribe(購読)します。
Publishされた雑誌を本棚に並べて、好きな時にSubscribeさせてあげる本屋さん(Broker)が通信の仲介をします。
AWS IoT CoreはBrokerのマネージドサービスです。
デフォルトのstart.shを流用して、Topic名を変更する方法を説明します。
start.shは、「basicPubSub.py」というPythonのテストスクリプトを実行しています。
basicPubSub.pyのオプションで「-t <トピック名>」を付ければ、任意のトピックで送ることができます。(デフォルトでTopicは「sdk/test/Python」になっています)
basicPubSub.pyの中身を直接変更してもよいですが、start.shを変更する方法で説明します。
$vim start.sh
python3 aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e ~~~~~の最後に「-t HighsoTopic」を追加
これでstart.shを実行すると、トピック名「HighsoTopic」で送信します。
しかし、これだけでは不十分でした。
ポリシーの変更
デフォルトのセキュリティ設定では「sdk/tet/Python」トピックのみが許可されています。
その他のトピックも許可するポリシーを設定をします。
「AWS IoT Core」→「安全性」→「ポリシー」
名前を付けたThingのPolicyを選択(今回は「highso-thing-Policy」)
「ポリシードキュメントの編集」
"Resource": [
"arn:aws:iot:us-west-2:~~~:topic/*",(この行を追加)
"arn:aws:iot:us-west-2:~~~:topic/sdk/test/java",
"arn:aws:iot:us-west-2:~~~:topic/sdk/test/Python",
"arn:aws:iot:us-west-2:~~~:topic/topic_1",
"arn:aws:iot:us-west-2:~~~:topic/topic_2"
]
"Resource": [
"arn:aws:iot:us-west-2:~~~:topicfilter/*",(この行を追加)
"arn:aws:iot:us-west-2:~~~:topicfilter/sdk/test/java",
"arn:aws:iot:us-west-2:~~~:topicfilter/sdk/test/Python",
"arn:aws:iot:us-west-2:~~~:topicfilter/topic_1",
"arn:aws:iot:us-west-2:~~~:topicfilter/topic_2"
]
~~~は自分のものに併せて適宜修正してください。
これで好きなトピック名が使えるようになりました!
いかがでしたか?
今回やったことは下記です。
- Windows10にUbuntu環境をWSLで構築
- UbuntuにPython3をインストール
- AWS IoTで接続キットをダウンロードしてUbuntuで適用
- 接続キットのテストコード(start.sh)で疎通確認
- トピック名を変更して疎通確認
トピック名変更については、調べても情報があまりなかったので、参考になる方は多いのではないかなと思います。
みなさんも是非、楽しいAWSライフを!!
そして僕は、ソリューションアーキテクトを目指します。
以上、メタラーまとんでした。
ではでは。
「ハイソボタンを押すとソレノイドが動くおもちゃ」の関連記事
1. 【JAWS DAYS 2019参加レポ】「あのボタン」SORACOMの薄い本を買ってみた!
2. ソレノイド(ZHO-0420S-05A4.5)をArduinoとMOSFETで動かしてみた!
3. AWS IoTをWSL(Windows Subsystem for Linux)のUbuntuで動かしてみた!
4. ソラコムのボタンでUbuntuとサーバーレス通信してみた!(AWS IoT 1-click / Lambda / AWS IoT / Windows Subsystem for Linux: WSL)
5. ソラコムのボタンとESP32を繋いでソレノイドを演奏してみた!(AWS IoT 1-click / Lambda / AWS IoT / ESP32)