赤外線センサーの結果をRaspberryPi 3 Model B+からAWS IoT経由でQuickSightでグラフ化するまで(その3)
はじめに
赤外線距離センサーでカウントした値をブラウザでグラフ形式で表示するまでを試してみた時の備忘録。
赤外線距離センサー、RaspberryPiの設定に関してはその1の記事を参照の事。
Pythonのプログラムについてはその2の記事を参照の事。
今回はAWS IoT Coreの設定とRaspberryPiとの接続テストについての記事とする。
なるべく分かりやすように丁寧に書いているつもりですが分かりづらい所や間違いがあればコメントを貰えるとありがたいです。
AWS IoT Coreの設定
AWS IoT Coreでモノの登録、各種証明書の発行、ポリシーの設定と証明書へのアタッチを行う。
モノの登録
最初にAWS IoT CoreにRaspberryPiを認識させる為にモノの登録を行う。
AWSサービスメニューからIoT Coreを選択する。
左のメニューから管理→モノをクリックすると一つもモノが登録されていない時は「まだモノがありません」と表示されるので「モノの登録」をクリックする。
「単一のモノを作成する」をクリックする。
名前に任意の名前(画面ではRaspberryPi3-01)をつける。
タイプとグループは未作成でも大丈夫なのですぐにモノを作成したい人は画面右下の「次へ」をクリックする。
※タイプの登録は任意なのですぐにモノを登録したい人はこちらへ。
「デバイスの管理が簡単になります」との事なので「タイプの作成」でタイプを作成した時の画面ショット。
複数のモノを登録する時にタイプで分類しておくと後々便利なのだと思う。
名前と説明欄を入力して画面右下の「モノのタイプの作成」をクリックする。
尚、名前に日本語は使用できないが説明欄は日本語が通った。
先程作成したタイプが既に選択されているので続いて「グループの作成」をクリックする。
※グループの登録は任意なのですぐにモノを登録したい人はこちらへ。
グループにモノを登録するとデバイスをリモート管理できる(未検証)との事なので、登録した。
どの様な管理ができるのかはそのうちに試してみるつもり。
名前と説明欄に入力して右下の「モノのグループの作成」をクリックする。
名前欄と説明欄に入力できる文字は先程のタイプと同様。
先程作成したグループが追加されている。
証明書の取得
証明書を取得する。
複数の方法があるがAWS推奨の1-Click証明書を選択した。
「証明書の作成」をクリックする。
証明書が1-Clickで作成された以下の順番で証明書ファイルを保存する。
- このモノの証明書をダウンロードして保存する
- パブリックキーをダウンロードして保存する
- プライベートキーをダウンロードして保存する
- AWS IoTのルートCAのダウンロードリンクをクリックして拡張子を*.pemで保存する
ここで取得したキー(のファイル名)は別記事のPythonのプログラムで指定する。
尚、4.のAWS IoTのルートCAのダウンロードリンクは新しいタブが表示されるのでAmazon Root CA 1をクリックする。
ブラウザ上にAWS IoTのルートCA発行のキーが表示されるのでコピーしてテキストエディターに貼り付けて拡張子を”pem”で保存する。
ファイル名は適当でOK。
この際、文字コードはUnicode(UTF-8)で保存する。
「有効化」ボタンをクリックすると”証明書は正常に有効化されました”のメッセージが表示されるのでこの画面は一旦「完了」で閉じる。
※ポリシーはまだ作成していないので「ポリシーをアタッチ」は押さない
安全性ー>証明書をクリックするとアクティブな証明が発行されている事がわかる。
ポリシーの作成
続いてポリシーを作成する。
AWS IoTのメニューから安全性ー>ポリシーをクリックするとポリシーが未作成の時は”ポリシーはまだ作成されていません”のメッセージが表示されるのでポリシーの作成をクリックする。
とにかく直ぐに作成して試したいだけであれば名前を入力してアクション欄に”iot:*”を入力するとリソースARNは自動的に設定されるので「作成」ボタンを押せばポリシーは作成される。
今回はRaspberryPi側からのconnectとPublishのみを受け付けるポリシーを作成する。
アクションでiot:connectを選択する(iを入力するとサジェスト機能で一覧から選択できる)
リソースARNは自動で展開されるので”replaceWithAClientId”欄をプログラムで指定したClient ID(”RasPi01”)に置き換えて、”許可”にチェックを入れて「ステートメントの追加」をクリックする。
プログラム中のClient IDについては前回の記事を参照。
行が追加されるので今度はアクション欄でiot:Publishを選択してリソースARN欄の”replaceWithATopic”をプログラムで指定したTopic(”count/pub”)に置き換える。
許可にチェックを入れて「作成」ボタンをクリックする。
これでClient ID=RasPi01、Topic=count/pubのみを受け付けるポリシーが作成された。
なお、ポリシーはワイルドカードが使えるのでcount/# や # の様な指定も可能。
ポリシーが正常に作成されると以下のようなステートメントになる。
ポリシーのアタッチ
先程作成した証明書に今回作成したポリシーをアタッチする。
左側のメニューから安全性ー>証明書をクリックして表示される証明を選択する。
証明書が表示されたらアクションから”ポリシーのアタッチ”を選択する。
アタッチしたいポリシーをチェックして「アタッチ」ボタンをクリックする。
AWS側の設定はこれで終了。
AWSのエンドポイント
プログラムに指定するAWSのエンドポイントを控えておく。
メニューから管理ー>モノをクリックして先ほど作成したモノを選択する。
メニューで”操作”をクリックするとAWSのエンドポイントが表示されるのでプログラムに指定するので控えておく。
今は左のメニューから”設定”を選択すればエンドポイントが表示される。
プログラムの修正
続けてプログラム中に先程取得した各種証明書やAWSのエンドポイントの指定を行う。
- モノの証明書
- プライベートキー
- AWS IoTのルートCA
の各種証明書ファイルをプログラム配下にcertディレクトリを作成してコピーしてファイル名と先程控えたAWSのエンドポイントのエンドポイントを指定する。
cert = "./cert/XXXX-certificate.pem.crt" #モノの証明書
key = "./cert/XXXX-private.pem.key" #プライベートキー
rootCA = "./cert/XXXX.pem" #Amazonルート証明書
endpoint = "XXXX-ats.iot.ap-northeast-1.amazonaws.com" #AWSのエンドポイント
接続テスト
AWS側を待ち受けにする
RaspberryPiとAWS IoT Coreとの接続テストを行う。
まずはAWS側で”テスト”をクリックする。
画面の上部がサブスクリプション(AWS側が受信)下の方でパブリッシュ(AWS側が発信)のテストができる。
トピックのサブスクリプション欄に”count/pub”を指定して「トピックのサブスクライブ」をクリックする。
count/pubのトピックの待受状態になる。
RaspberryPiのプログラムを実行する
RaspberryPi側でメニューからプログラミングー>Pythpn3(IDLE)でPython3を起動したらFileー>Openで該当のプログラムを開く。
そしてRunー>Run Module(またはF5)でプログラムを実行する。
尚、プログラムの詳細については前回の記事にソースコードを載せているので参照の事。
プログラムを実行すると下記のPython 3.5.3 shell画面が表示される。
赤外線距離センサー(TSSP77038)の前に手をかざして何回か横切ってみる。
横切る度にカウントアップされてPythonのshell画面に表示される。
プログラム中のprint文で表示している。
AWS側
AWS側を見るとリアルタイムでサブスクライブされている。
※最新の情報が一番上に表示される。
以上で接続テストは終了。
動画での説明
モノの作成から証明書の発行、ポリシーの設定、RaspberryPiでプログラムを動かしてAWS IoT Coreでのテストまでの様子を動画にしている。
興味がある方はご確認ください。
つづく
以上でAWS IoT Coreの設定と接続テストは終了。
AWS Analyticsでデータセットに保存してAWS QiuickSightでグラフ化するのは次回以降の記事とする。
ファイル名は適当につけて「AWS IoTのルートCA発行のキーが表示されるのでコピーしてテキストエディターに貼り付けて保存する」ことは行いましたが、実際プログラミングでrootCAにファイル名を打ち込む際に拡張子がpemとなったものが存在しないので、xxxxに何を入れるべきかわかりませんでした。
rootCA = “./cert/XXXX.pem” #Amazonルート証明書
その間に何をすべきなのか教えていただけると幸いです。
テキストエディタでルート証明書(RootCA)を保存する際に拡張子をpemにして保存します。
ルート証明書の中身はテキストなのです。
ちょっと説明が分かりにくかった様ですね。
記事の方を修正しておきます。
質問ありがとうございました。