Armadillo-IoT G3(以下、Armadillo)より、AWS IoTに接続するまでの手順を紹介します。
AWS IoTはインターネットに接続したデバイスとAWSの双方向通信を可能にするサービスです。
AWS IoTへのモノの登録
AWS IoTでは「モノ」という単位でデバイスを管理します。
モノとしてArmadilloを登録することで、ArmadilloからAWS IoTが使用可能となります。
実際に登録する手順を記載します。
-
AWSマネジメントコンソールにログイン後、https://aws.amazon.com/iot にアクセスします。
-
左のペインから「管理」を選択します。
-
ページから「作成」をクリック後、遷移したページで「単一のモノを作成する」を選択します。
-
モノの名前を入力し、ページ下部の「次へ」をクリックします。
-
証明書の作成をクリックします。
-
3つのファイルすべてをダウンロードします。その後、証明書を有効化します。そして、ページ下部の「完了」を選択します。
-
左のペインの「安全性」から「ポリシー」を選択します。
-
ポリシーの名前と、アクション(iot:*)を入力後、許可にチェックを入れ、「作成」をクリックします。
-
左のペインの「安全性」から「証明書」を選択します。
-
先ほど作成した証明書の右上の「・・・」をクリックし、ポリシーのアタッチを選択します。
-
先ほど作成したポリシーにチェックを入れ、アタッチをクリックします。
-
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/managing-device-certs.html#server-authentication よりAmazon ルート CA 1をダウンロードし、root-CA.crtにリネームしてください。
これで、AWS IoTへのモノの登録が完了します。
Armadillo上での準備
- ArmadilloにPython3をインストールします。
[Armadillo ~]# apt update
[Armadillo ~]# apt install python3
- pipを用いて、「AWS IoT Python SDK」をインストールします。
[Armadillo ~]# pip install AWSIoTPythonSDK
- Armadillo上に作業フォルダを用意します。
[armadillo ~]# mkdir AWSIoT
[armadillo ~]# mkdir AWSIoT/certs
- certsフォルダに、「AWS IoTへのモノの登録」6. と12. でダウンロードした証明書をftp等を用いてコピーします。
サンプルコード
以下のサンプルコードではArmadilloの機能を用いて、CPUの温度を取得し、AWS IoTの「シャドウ」と呼ばれる場所にアップロードします。
Armadillo上のAWSIoTディレクトリに、以下のコードを置いてください。
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient
import time
# Callback function
def callback(payload, status, token):
if status == "accepted":
print("Connection accepted. token: " + token)
elif status == "rejected":
print("Connection rejected. token: " + token)
elif status == "timeout":
print("Connection timeout. token: " + token)
else:
print("Unknown error. token: " + token)
# Configure
rootCAPath = "Root CA path"
certificatePath = "Your certicifate key path"
privateKeyPath = "Your private key path"
thingName = "Name of your thing"
endPoint = "Your endpoint"
clientId = "AWSIoTGettingStarted"
port = 8883
tempFile = "/sys/class/thermal/thermal_zone1/temp"
# Create a client
client = AWSIoTMQTTShadowClient(clientId)
client.configureEndpoint(endPoint, port)
client.configureCredentials(rootCAPath, privateKeyPath, certificatePath)
# Client configuration
client.configureAutoReconnectBackoffTime(1, 32, 20)
client.configureConnectDisconnectTimeout(10)
client.configureMQTTOperationTimeout(5)
# Connect to AWS IoT
client.connect()
# Create a deviceShadowHandler
handler = client.createShadowHandlerWithName(thingName, True)
# Delete the shadow document
handler.shadowDelete(callback, 5)
# Write the temperature of the CPU on shadow
while True:
try:
fileHandler = open(tempFile)
temp = str(int(fileHandler.read().strip()) / 1000.0)
json = '{"state":{"desired":{"property":"' + temp + '"}}}'
except Exception as e:
print(e)
json = '{"state":{"desired":{"property":"Client threw an Exception"}}}'
finally:
handler.shadowUpdate(json, callback, 5)
time.sleep(1)
17行目から20行目は、証明書等のパス等をご入力ください。
21行目には、以下の手順で入手できるエンドポイントを入力します。
-
左のペインから管理を選択します。
-
先ほど作成したモノを選択します。
-
左のメニューから操作を選択します。
以下の場所にエンドポイントがあります。
サンプルコードを書き換えましたら、実行できます。
Connection accepted.
と表示されましたら、接続に成功しています。
Connection rejected
Connection timeout
と表示されましたら、接続に失敗しています。もう一度手順をご確認ください。