AWS IoT Coreを使ってみた

# はじめに
> 初めてawsに触れるため、まずはインターネットに接続されたIoTデバイスの接続、管理できるAws IoT Coreというサービスを使ってみようと思う
Azure IoT Hubサービスに似ているものかな？

# 使用したもの
 - RaspberryPi 3B+
 - DHT22温湿度センサー
 - Aws IoT Core
 - node.js

# AWS設定

# ポリシーの作成
1) AWSマネージメントコンソールにログイン
[マネージメントコンソールにログイン](https://aws.amazon.com/jp/console/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/906e24e3-b0a0-0f6f-dcbc-d56751f1760b.png)

2) 画面上の検索で「**IoT Core**」と検索し、IoT Coreを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/2e303a59-4d1d-b7a6-d051-7500a4092de9.png)

3) 「**安全性**」→　「**ポリシー**」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/7571c2b9-6d68-8e28-174f-e1d6f4729aa2.png)

4) 「**作成**」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/5c1e3472-64a6-85a8-ff5f-0e1bf4bd9f98.png)

5) それぞれ必要事項を入力して作成をクリック

- 名前：任意の名前を入力
- アクション：今回は、広い権限を持たすために「IoT.*」を入力
- リソースARN：今回は、広い権限をもたすために「*」を入力
- 効果：「許可」にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/6b8a0c64-dc13-31a8-2120-d07730a376c4.png)

# モノの作成
6) 「**管理**」→ 「**モノ**」を選択し、「**モノを作成**」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/87fa35be-1cef-699d-1a70-cdc229311c48.png)

7) 「1つのモノを作成」を選択し、「**次へ**」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/5931f757-52d1-ce17-6931-304265cacba8.png)

8) 必要な事項を入力し、「**次へ**」をクリック

- モノの名前：任意の名前を入力
- その他は、デフォルトのままでok

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/3a60b54a-5483-e4f3-378e-6285d194c7d8.png)

9) 「**新しい証明書を自動生成**」を選択し「**次へ**」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/4466e033-6d58-4509-f1df-df5d3db728e8.png)

10) 先ほど、任意の名前で作成したポリシーを選択し、「**モノを作成**」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/406da088-de1c-bf33-4fa5-fa55af475595.png)

11) ダウンロードできるものすべてダウンロードして「**次へ**」をクリック
- **注意**：証明書とキーは、二度とダウンロードできないので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/1598ba7f-93fa-37ef-2a84-ebb8f3c030dd.png)

12) 「**設定**」を選択し「エンドポイント」をコピーしてメモしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/0afc687c-0243-4df2-6474-3fcfd05027c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/414264e1-d7b4-6816-9256-b44d2b947d62.png)


# RaspberryPi

13) 先ほど、ダウンロードした以下のファイルをraspberrypiに転送する

- 秘密鍵ファイル
- 証明書ファイル
- AmazonルートCA1ファイル

```command
$ scp -r ローカルパス pi@raspberrypi.local:コピー先パス
```
# ライブラリーのインストール

14) 以下のライブラリーをインストール

```command
$ npm install --save-dev node-dht-sensor
$ npm install --save-dev aws-iot-device-sdk
```

15) mainファイルを作成して編集

```command
$ touch main.js
```

```main.js
// AWS IoT DeviceSDKの利用
const awsIot = require('aws-iot-device-sdk');
const sensor = require("node-dht-sensor");

// 秘密鍵、証明書などの設定
const device = awsIot.device({
  keyPath: './private.pem.key', // ダウンロードした秘密鍵
  certPath: './certificate.pem.crt', // ダウンロードした証明書
  caPath: './AmazonRootCA1.pem', // ダウンロードしたルートCA
  clientId: 'test', // ポリシーで許可したユニークなクライアント名
  host: '・・・・.amazonaws.com' // エンドポイント。コンソール画面でチェックできる
});

let count = 0;

// 通信確立した後、5秒ごとに呼び出されるイベント
device.on('connect', () => {
  console.log('connect');
  setInterval(async () => {
    count++;
    const res = await sensor.read(22, 4);  // 第二引数にピン番号を入力
    const temps = Math.round(res.temperature *10)/10;
    const humids = Math.round(res.humidity *10)/10;
    const data = {
        temp: temps,
        humid: humids
    }
    device.publish('topic', JSON.stringify(data)); // topic名もポリシーで許可したものを設定
    console.log(`published message for ${count} time`);
  }, 5000);
});

```

# 実行

```command
$ node main.js


connect
published message for 1 time
published message for 2 time
published message for 3 time
published message for 4 time
published message for 5 time
published message for 6 time
published message for 7 time
published message for 8 time
published message for 9 time
published message for 10 time
```

#接続確認
16) AWS コンソールに戻り「**テスト**」→「**MQTTクライアント**」を選択し、topic名を入力し「**サブスクライブ**」をクリックすると受信データを確認することができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/4be0b147-92f8-cd20-aec2-dbd5118d21fe.png)

# まとめ
手探りで色々と手こずりましたが、覚えてしまえば簡単に使えるサービスですね！
デバイスとの接続ができたので、次はAws IoT Coreで受け取ったデータをDynamoDBを使ってデータを格納してみようと思います。