[初級編]AWS IoT CoreでPub/Subをやってみた

Raspberry PiもAWS IoT Coreも初心者の私がMQTTでデータをパブリッシュしてみた、という記事です。
2023.12.27

はじめに

今回はAWS IoT Core?ナニソレ?というレベルの私がRaspberry Pi(以下ラズパイ)とAWS IoT Coreを使ってIoTの世界に足を踏み入れてみました。

今回は特にAWS IoT Coreでメッセージを受け取る、確認するといった部分にフォーカスしています。
そのため、ラズパイのセットアップについてはあまり触れていません。

全体像

今回の全体像はこんな感じです。

この図だけを見ると、そんなにややこしくはなさそうですね。
しかし、どこに何を設定すればいいのか
どうやってメッセージを送ればいいのか
メッセージを受け取る側では何を設定すればいいのか
初心者からすると、意外と考えることが多かったのでとりあえずやってみました。

準備するもの

今回の検証で用意したものはこちらです。

  • Raspberry Pi Zero WH(周辺機器も含む)
  • AWSのアカウント
  • Mac(ラズパイにssh接続するためローカル環境)

ラズパイ

ラズパイ側に関してはたくさん記事があるので、今回は詳細なセットアップ方法は割愛します。
ラズパイは直接またはsshで接続できる状態にしておきます。

デバイスのセットアップについてはこちらの記事を参考にしました。

Raspberry Pi OSのセットアップについてはこちらの記事を参考にしました。

AWS IoT Core

AWS IoT Coreでは最初の疎通確認を全ていい感じに導いていくれる機能が整っています。
そのため、デバイスさえ用意できればすぐに試すことができます。
それではやってみましょう。

まずはAWS IoT Coreでデバイスを登録します。
「デバイスを接続」をクリックします。

最初にデバイスからAWS IoT Coreへの疎通確認のコマンドが提示されます。

ではこのコマンドをコピーしてラズパイから実行してみます。

$ ping a2cxxf7w8nket0-ats.iot.ap-northeast-1.amazonaws.com

64 bytes from ec2-54-65-124-70.ap-northeast-1.compute.amazonaws.com (54.65.124.70): icmp_seq=1 ttl=233 time=64.9 ms

疎通できていることが確認できました。

次にデバイスの名前を登録します。
今回は「raspiwh」とします。

次にサンプルプログラムを動かすための実行環境を選択します。
ラズパイにはPythonがインストールされていたので、LinuxとPythonを選びます。

次にデバイスに登録する証明書やプライベートキー、ポリシー、疎通確認用のスクリプトなど、疎通確認に必要な一通りのコンポーネントが接続キットとして生成されます。

これをダウンロードしてラズパイへ送れば通信テストを行うことができます。
それでは接続キットをダウンロードします。

次にダウンロードしたZIPファイルをローカル環境からラズパイへ転送します。

$ scp connect_device_package.zip pi@raspberrypi:/home/pi/

ラズパイ側では受け取ったZIPファイルを解凍します。

$ unzip connect_device_package.zip
raspiwh-Policy  raspiwh.cert.pem  raspiwh.private.key  raspiwh.public.key  start.sh

余談ですが、解凍したしたスクリプトを確認すると、awsiotsdkを使用してメッセージを送るようです。

説明に従いラズパイで疎通確認用のスクリプトを実行します。
このスクリプトでは"Hello World"という文字列を"sdk/test/python"というトピックに一定間隔で送信します。

$ chmod +x start.sh
$ ./start.sh

Running pub/sub sample application...
Connecting to a2cxxf7w8nket0-ats.iot.ap-northeast-1.amazonaws.com with client ID 'basicPubSub'...
Connected!
Subscribing to topic 'sdk/test/python'...
Connection Successful with return code: 0 session present: False
Subscribed with QoS.AT_LEAST_ONCE
Sending messages until program killed
Publishing message to topic 'sdk/test/python': Hello World!  [1]
Received message from topic 'sdk/test/python': b'"Hello World!  [1]"'
...

すると、スクリプトが実行されてメッセージがパブリッシュされているのが分かります。
AWS IoT Core側でもメッセージを受け取っていることを確認します。

ちゃんとメッセージが送られてきています。
こちらの接続のテスト画面でメッセージの確認ができましたが、この画面を抜けるともう確認ができなくなるのかな?と思いました。

もちろんそんなことはなく、AWS IoT Coreのホーム画面のテスト内にある「MQTTテストクライアント」から確認するとができます。
やってみましょう。

MQTTテストクライアント

MQTTテストクライアントでは指定したトピックをサブスクライブすることができます。
必要な操作は次の通りです。

  • デバイス側からトピックを指定してメッセージをパブリッシュする
  • MQTTテストクライアントでトピックを指定してメッセージをサブスクライブする

イメージとしてはこのような感じです。

まずは、メッセージが送られてきたことを確認するためにMQTTテストクライアントでトピックをサブスクライブします。
ここではトピックを先ほどと同じ"sdk/test/python"とします。
個人で設定したトピックに変更したい場合は、ソースコードとポリシーを変更する必要があります。

次に先ほどと同じようにラズパイからメッセージをパブリッシュしてみます。

$ ./start.sh

yonamine@raspberrypi:~/work $ ./start.sh

...
Publishing message to topic 'sdk/test/python': Hello World!  [1]
Received message from topic 'sdk/test/python': b'"Hello World!  [1]"'
...

メッセージをパブリッシュしたのでコンソール画面を確認します。

先ほどと同じようにメッセージが送られてきていることが確認できます。

まとめ

AWS IoT Coreの機能として疎通確認用のコードや証明書を作成してくれるのはとても便利ですね。
また、MQTTテストクライアントを活用すれば、デバイスからメッセージの送受信の確認ができるのでトラブルシューティングにも役立ちそうです。