Armadillo-IoT G3でAWS IoTを動かす

Armadillo-IoT G3(以下、Armadillo)より、AWS IoTに接続するまでの手順を紹介します。

AWS IoTはインターネットに接続したデバイスとAWSの双方向通信を可能にするサービスです。

## AWS IoTへのモノの登録

AWS IoTでは「モノ」という単位でデバイスを管理します。

モノとしてArmadilloを登録することで、ArmadilloからAWS IoTが使用可能となります。

実際に登録する手順を記載します。

1. AWSマネジメントコンソールにログイン後、https://aws.amazon.com/iot にアクセスします。

2. 左のペインから「管理」を選択します。

3. ページから「作成」をクリック後、遷移したページで「単一のモノを作成する」を選択します。

4. モノの名前を入力し、ページ下部の「次へ」をクリックします。

5. 証明書の作成をクリックします。

6. 3つのファイルすべてをダウンロードします。その後、証明書を有効化します。そして、ページ下部の「完了」を選択します。

7. 左のペインの「安全性」から「ポリシー」を選択します。

8. ポリシーの名前と、アクション(iot:*)を入力後、許可にチェックを入れ、「作成」をクリックします。

9. 左のペインの「安全性」から「証明書」を選択します。

10. 先ほど作成した証明書の右上の「・・・」をクリックし、ポリシーのアタッチを選択します。

11. 先ほど作成したポリシーにチェックを入れ、アタッチをクリックします。

12. 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上での準備

1. ArmadilloにPython3をインストールします。

```
[Armadillo ~]# apt update
[Armadillo ~]# apt install python3
```

2. pipを用いて、「AWS IoT Python SDK」をインストールします。

```
[Armadillo ~]# pip install AWSIoTPythonSDK
```

3. Armadillo上に作業フォルダを用意します。

```
[armadillo ~]# mkdir AWSIoT
[armadillo ~]# mkdir AWSIoT/certs
```

4. certsフォルダに、「AWS IoTへのモノの登録」6. と12. でダウンロードした証明書をftp等を用いてコピーします。

## サンプルコード

以下のサンプルコードではArmadilloの機能を用いて、CPUの温度を取得し、AWS IoTの「シャドウ」と呼ばれる場所にアップロードします。

Armadillo上のAWSIoTディレクトリに、以下のコードを置いてください。

```Python
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行目には、以下の手順で入手できるエンドポイントを入力します。

1. 左のペインから管理を選択します。

2. 先ほど作成したモノを選択します。

3. 左のメニューから操作を選択します。

以下の場所にエンドポイントがあります。

<img width="428" alt="img09.png" src="https://qiita-image-store.s3.amazonaws.com/0/343516/32d59b3d-fe86-0912-a706-51a82a7b60fe.png">

サンプルコードを書き換えましたら、実行できます。

`Connection accepted.` と表示されましたら、接続に成功しています。

`Connection rejected` `Connection timeout` と表示されましたら、接続に失敗しています。もう一度手順をご確認ください。