ローカルの仮想ubuntuサーバにMQTTブローカー(Mosquitto)を立てていたのですが、いろいろと面倒になって来たので、AWS IoTでMQTTを実験してみました。

とりあえず使ってみる
AWSマネジメントコンソールからAWS IoTサービスに入ると、ウィザードが始まりました。
確認しながら進めて行きます。
AWS IoTに接続する
ここは[開始方法]を押すだけです。

AWS IoT にどのように接続していますか?
ここは利用する予定の環境に合わせてください。とりあえず、デバイスとしてRaspberry Pi を使う予定なので、Linux/OSX、Pythonを選択しました。

モノの登録
名前を入力して、[次のステップ]に進みます。

接続キットのダウンロードを行います。

ダウンロードした接続キットを手順に従って使ってみます。

start.shを実行すると、このような感じで表示されます。

とりあえず動かす事ができました。ここまでの目安は10分です。
samplesの確認
start.shで呼び出している、aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py の中を確認してみます。
パラメータ
basicPubSub.pyは、パラメータでいろいろ指定できるという事がわかりました。
# Read in command-line parameters
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host", help="Your AWS IoT custom endpoint")
parser.add_argument("-r", "--rootCA", action="store", required=True, dest="rootCAPath", help="Root CA file path")
parser.add_argument("-c", "--cert", action="store", dest="certificatePath", help="Certificate file path")
parser.add_argument("-k", "--key", action="store", dest="privateKeyPath", help="Private key file path")
parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Port number override")
parser.add_argument("-w", "--websocket", action="store_true", dest="useWebsocket", default=False,
help="Use MQTT over WebSocket")
parser.add_argument("-id", "--clientId", action="store", dest="clientId", default="basicPubSub",
help="Targeted client id")
parser.add_argument("-t", "--topic", action="store", dest="topic", default="sdk/test/Python", help="Targeted topic")
parser.add_argument("-m", "--mode", action="store", dest="mode", default="both",
help="Operation modes: %s"%str(AllowedActions))
parser.add_argument("-M", "--message", action="store", dest="message", default="Hello World!",
help="Message to publish")
-M … Message to publish
start.shを開き、python呼び出しの最後に-Mをつけて、メッセージを変更してみます。
ここではaaaaという文字を送ってみました。


ちゃんとaaaaが送られている事を確認しました。
-m … Operation modes
start.shを開き、python呼び出しの最後に-mをつけて、subscribeを指定してみました。
subscribe記載後、start.shを実行して待ち状態にしておきます。

AWSのコンソールから、メッセージを発行してみます。


無事に待ち側にメッセージが表示されました。
-t … Targeted topic
トピックを変えようと思って、-tをつけてみましたが、AWSIoTPythonSDK.exception.AWSIoTExceptions.subscribeTimeoutExceptionというエラーになりました。

いろいろコンソールとかヘルプを眺めてると、トピックはポリシーで定義するとのことでした。なるほど。
ポリシーの定義
ポリシーでトピックを定義してみます。場所は、「管理 - モノ - セキュリティ ー ポリシー」です。

まずは既に定義してあった、topic_1というトピックを指定して確認します。

start.shを開き、python呼び出しの最後に-t topic_1をつけて実行しています。

無事にメッセージが表示されました。
という事で、新しくトピックを指定する場合はポリシーを編集する事がわかりました。MyTopicというポリシーを追記してみます。デフォルトは消した方がいいかもしれませんね。

-m … Publish を指定してみる
start.shを開き、python呼び出しの最後に-m、-t、-Mをつけて、発行してみました。

AWSコンソール側でメッセージが確認できました。

まとめ
AWS IoTを使うと、MQTTが簡単に実装できました。トピックについては、ポリシーを設定しましょう。
今回試した事を利用して、RaspberryPi + OpenVINO でAI監視カメラを作る予定です。