AWS IoT Core for LoRaWAN と Dragino LPS8 を利用して LoRaWANネットワークを構築する

# はじめに
以下の記事で、LoRaWANゲートウェイである Dragino LPS8 をセットアップし、The Things Network（TTN） に接続する方法について確認しました。

- [LoRaWANゲートウェイ Dragino LPS8 のセットアップ方法](https://qiita.com/takanorig/items/632bcdb838a0558dd5e1)
- [LoRaWANゲートウェイ Dragino LPS8 を使って The Things Network（TTN）と接続する](https://qiita.com/takanorig/items/800320319a9bec22df52)

本記事では、Dragino LPS8 を、AWS IoT Core for LoRaWAN に接続させ、デバイスからLoRaWANネットワークを介して、AWSにデータの送信を行ってみます。

# 構成

全体の構成は、以下のようになります。

![awsiot-lorawan-figure01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/545caab1-3f1e-6cf6-3ae8-2b2d1ed47914.jpeg)


## ゲートウェイの要件
LoRaWANゲートウェイが、AWS IoT Core for LoRaWAN に接続するためには、以下のことに対応している必要があります。

- LoRa Basics Station（2.0.4以降）に対応


# 前準備

IAMロール／ポリシーの作成を行います。
IAMロール／ポリシーの関係を以下に示していますが、IAMポリシーを作成したら、対応するIAMロールでそのポリシーを許可してください。

### LoRaWANゲートウェイに設定するロール／ポリシー

AWS IoT Core for LoRaWAN で、ゲートウェイに付与するロール／ポリシーを作成します。

#### IAMロール：IoTWirelessGatewayCertManagerRole

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iotwireless.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}
```

#### IAMポリシー：AWSIoTWirelessGatewayCertManager

こちらは既存で存在しているポリシーになります。
**IoTWirelessGatewayCertManagerRole** の「許可」でポリシーを追加してください。

### LoRaWANメッセージ受信時の転送ロール

AWS IoT Core for LoRaWAN で、ゲートウェイでメッセージをAWSサービスに転送するためのロール／ポリシーを作成します。

#### IAMロール：LPWAN-DeviceDestinationRole

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iotwireless.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

#### IAMポリシー：LPWAN-DeviceDestinationPolicy

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": "arn:aws:iot:<リージョン>:<AWSアカウントID>:topic/$aws/rules/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:DescribeEndpoint"
            ],
            "Resource": "*"
        }
    ]
}
```

### LoRaWANメッセージ受信時の転送ロール

IoT Core Rules で、受信したメッセージに対してアクションを行うためのロール／ポリシーを作成します。
ここでは、IoT Core に Publish するための権限を設定していますが、用途に応じて変更してください。

#### IAMロール：LPWAN-IoTRuleRole

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

#### IAMポリシー：LPWAN-IoTRulePolicy

```
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "iot:Publish",
        "Resource": "arn:aws:iot:<リージョン>:<AWSアカウントID>:topic/*"
    }
}
```

# AWS IoT Core for LoRaWAN の設定

AWS IoT Core for LoRaWAN での設定は、複数のコンポーネントが関係します。
以下はイメージですが、おおよそ、このような関係になります。

![awsiot-lorawan-figure02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/0f7eb8d7-f17e-f874-0cd7-fb9c09de5ec5.jpeg)


## ゲートウェイの登録

ゲートウェイの登録を行います。

### AWS側でのゲートウェイでの設定

ゲートウェイを登録するために必要なEUI（Extended Unique Identifier ）を確認しておきます。
LPS8 では、「LoRaWAN」→「LoRaWAN -- Basic Station」の画面で確認できます。

![lps8-awsiot01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/e43a3122-8504-cb16-7dd2-8fb472204e42.jpeg)

次に、AWSコンソールにログインし、AWS IoT Core for LoRaWAN の画面を開き、ゲートウェイの追加を行います。

![awsiot-lorawan01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ac896b0e-aec1-af98-f124-049e4e3214ee.jpeg)

![awsiot-lorawan02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/d39cd50e-345e-eb5d-8fd6-1d2e51510025.jpeg)

ゲートウェイの設定を入力します。

- 「ゲートウェイのEUI」は、先ほど確認したEUIを指定してください。
- 「周波数帯」は、**「AS923-1」** を選択してください。

![awsiotcore-lorawangw01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/c0930375-73ee-e6c1-97af-7648ae3b5f68.jpeg)

ゲートウェイの証明書やエンドポイントの情報を確認し、ダウンロードしておきます。
これらの情報は、失くさないように保存しておいてください。

- 「ゲートウェイ証明書」の内容で、**「証明書を作成」** ボタンを押下し、ダウンロードします。
- 「認証情報のプロビジョニング」の内容で、**「CUPSエンドポイント」「LNSのエンドポイント」** の情報を、コピーして保存しておきます。
- 「認証情報のプロビジョニング」の内容で、**「サーバー信頼証明書をダウンロード」** ボタンを押下し、ダウンロードします。
- 「ゲートウェイのアクセス許可」では、前準備で作成した **「IoTWirelessGatewayCertManagerRole」** ロールを指定してください。

![awsiotcore-lorawangw03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/4eda3529-0b16-08af-610f-1d69a0572698.jpeg)

この内容で、ゲートウェイの登録を行います。

### LSP8側での設定

次に、LSP8側で、AWS側と連携するための設定を行います。
LPS8 で、「LoRaWAN」→「LoRaWAN -- Basic Station」の画面を開いてください。

AWS側でダウンロードやコピーした情報を指定します。

- Service Provider の項目で、**「Amazon IoT -- Basic Stion」** を選択してください（※「Stion」となっているのは「Station」の誤字だと思いますが）。
- 「CUPS URI」の項目は、AWS側でコピーした **「CUPSエンドポイント」** の値を指定してください。
- 「LNS URL」の項目は、AWS側でコピーした **「LNSのエンドポイント」** の値を指定してください。
- AWS側でダウンロードしたファイルを、それぞれ、アップロードします。
    - CUPS strust ・・・ **サーバー信頼証明書の「cups.trust」**
    - LNS trust   ・・・ **サーバー信頼証明書の「lns.trust」**
    - Private key ・・・ **ゲートウェイ証明書の「xxxxxx.private.key」**
    - Cert pem    ・・・ **ゲートウェイ証明書の「xxxxxx.cert.pem」**

![lps8-awsiot02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/7a8da3b1-73b8-b970-7b59-b1e6bb258b3e.jpeg)

この状態で、**「Save&Apply」** ボタンを押下してください。
この設定に切り替わると、「Current Mode」の部分に **「Basic Station -- AWS」** と表示されます。

### ゲートウェイの接続確認

両方のゲートウェイの設定が完了したら、AWSコンソールの以下の詳細画面で内容を確認できます。
ゲートウェイ本体の電源がONになっており、接続が確認できたら、接続ステータスの部分が **「Connected」** になっていることを確認してください。

![awsiotcore-lorawangw05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/fa5932ed-7bf3-744e-ba24-40f5867f18d9.jpeg)

## プロファイルの設定

デバイス共通となる設定内容を、プロファイルとして設定することができます。
AWS IoT Core for LoRaWAN では、「デバイスプロファイル」と「サービスプロファイル」の2つが存在します。

### デバイスプロファイル

まず最初に、デバイスプロファイルを登録します。

![awsiotcore-lorawanprofile01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/4e2b3ce2-76fb-1408-e4a9-45a3cb75b3c1.jpeg)

デバイスプロファイルでは、以下のように設定を行います。

- 「デフォルトのプロファイルを選択してカスタマイズ」で **「AS923-1 - A」** を選択します。
    - これは日本において利用できる周波数帯であるAS923-1と、デバイス側がクラスAに対応しているプロファイルを示しています。
    - 利用するデバイスによって、適宜指定してください。
- 「デバイスプロファイル名」は、任意の名前を指定してください。
- 「周波数帯」は、日本で利用する場合は、原則 **「AS923-1」** を指定してください。
- 「MACバージョン」は、、デバイス側で対応しているLoRaWANのバージョンを指定してください。特に指定がない場合は **「1.0.3」** を指定してください。
- 「リージョン別パラメータバージョン」は、デバイス側で対応している内容を指定してください。特に指定がない場合は **「RP002-1.0.1」** を指定してください。
- 「MaxEIRP」は、デバイスの電波の電力の強さを示します。ここでは **「15」** を指定しておきます。

![awsiotcore-lorawanprofile02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ec1f03a9-d675-6842-9299-bf9dc58fcac9.jpeg)


### サービスプロファイル

次に、サービスプロファイルを登録します。

![awsiotcore-lorawanprofile03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ce747adb-2638-ddf6-6611-18ac1d2c1ae4.jpeg)

サービスプロファイルでは、以下のように設定を行います。

- 「サービスプロファイル名」は、任意の名前を指定してください。
- 「AddGWMetaData」が、ONになっていることを確認してください。
    - このパラメータをONにすると、各デバイスのデータ受信時に、RSSIやSNRといった電波状況を示すメタデータも付与されます。

![awsiotcore-lorawanprofile04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ac138059-aecb-e62a-a610-ed55d9d5158e.jpeg)

登録が完了すると、以下のようになります。

![awsiotcore-lorawanprofile05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/6f916a1b-daf2-e851-4981-f26d66da05b5.jpeg)


## 送信先の設定

デバイスから、メッセージが届いた際の送信先を登録します。

![awsiotcore-lorawandest01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ec1cde98-83fd-a1d5-9fa0-31444a760fb2.jpeg)

送信先では、以下のように設定を行います。

- 「送信先名」は、任意の名前を指定してください。ここでは **「LoRaWAN_TestDestination」** とします。
    - 分かりやすい名前を付けておいてください。
- 「ルール名を入力」を選択し、任意の名前を指定してください。ここでは **「LoRaWAN_TestIoTRule」** とします。

    - ただし、この名前は後でIoT Ruleで使用される名前になるため、ルールを想定した名前にしておくと良いです。
- ロールは、前準備で作成した **「LPWAN-DeviceDestinationRole」** を選択します。
    - 「ロールにポリシーをアタッチ」を選択すると、この送信先に応じたIAMポリシーが自動作成され、指定されたIAMロールに追加されます。 

![awsiotcore-lorawandest02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/e1ddeb40-cb58-10c2-def6-9cca5b5bce2d.jpeg)

登録が完了すると、以下のようになります。

![awsiotcore-lorawandest03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/4d3b554e-c61e-2427-2f41-44d9dce39179.jpeg)


## IoT Rule の設定

受信したメッセージの処理を行う、IoTルールの登録を行います。

![awsiotcore-rule01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/03078b64-1ed6-d590-dc7c-f4bbb2bc7865.jpeg)

IoTルール名を指定します。

<b><font color="#ff0000">※注意※</font></b>
ここでは、送信先で指定したルール名と合わせてください。

![awsiotcore-rule02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/79a4ab41-af3b-05de-f78b-e456821c729e.jpeg)

IoTルールでは、SQL構文が利用できます。
ここでは、受信したメッセージに対して、タイムスタンプを追加するように、以下のSQLを指定します。

```SQL
SELECT *, timestamp() as timestamp
```

![awsiotcore-rule03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/f700d7f3-e556-0343-79cb-53c707afdfa8.jpeg)

IoTルールのアクションを設定します。
ここでは、IoT Core に、MQTTメッセージとして再Publishするようにします。
アクションは、複数定義することも可能です。

- アクションで、 **「Republish to AWS IoT topic」** を選択します。
- 送信先のトピックは、 **「test/lorawan/messages」** とします。
- ロールは、前準備で作成した **「LPWAN-IoTRuleRole」** を選択します。

![awsiotcore-rule04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/70c2a4d6-6b1c-d999-eb13-da787e0d374f.jpeg)

定義内容を確認し、IoTルールを作成します。

![awsiotcore-rule05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/89e70de5-4af2-716c-1f54-1aaf779f9379.jpeg)


## LoRaデバイスの設定

LoRaWANゲートウェイに接続される、LoRaデバイスの登録を行います。

![awsiotcore-lorawandevice01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/ebadc480-c71a-87e8-079c-ecce9c784a45.jpeg)

デバイスは、以下のように設定を行います。

![awsiotcore-lorawandevice02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/67e1e181-6ef4-51d1-b69d-c60b88436341.jpeg)

- **LoRaWAN仕様とワイヤレスデバイス設定**
    - 「ワイヤレスデバイスの仕様」では、**「OTAA v1.0.x」** を指定します。
        - ABP方式の指定も可能です。デバイスに合わせて指定してください。
    - 「DevEUI」「AppKey」「AppEUI」は、デバイスで指定されている固有のIDを指定してください。
    - 「ワイヤレスデバイス名」は、任意の名前を指定してください。
- **プロファイル**
    - 事前に作成したプロファイルを指定します。
    - 「ワイヤレスデバイスプロファイル」は、**「AS923-1-A-OTAA」** を選択します。
    - 「サービスプロファイル」は、**「Default service profile」** を選択します。
- **送信先**
    - 事前に登録した送信先を指定します。
    - 「送信先名」は、**「LoRaWAN_TestDestination」** を選択します。

位置情報の管理も可能ですが、今回は行わないので、スキップします。
「デバイスを追加」ボタンを押下すると、デバイスの登録が完了します。

![awsiotcore-lorawandevice03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/4f201d98-6c82-7297-7ae8-fe0230bdf8bd.jpeg)

これで、LoRaWANデバイスの登録が完了しました。

![awsiotcore-lorawandevice04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/61e0640e-b645-7b51-8d77-877220e827cf.jpeg)

デバイスの詳細画面を確認し、「デバイストラフィック」のタブで、ゲートウェイなどの情報が表示されていれば、接続できていることが確認できます。
接続が確認できない場合、LoRaWANデバイスとLoRaWANゲートウェイの接続状況や、AWS側での設定を確認してください。

![awsiotcore-lorawandevice05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/3774ed49-6679-40c3-c326-4464af3c2263.jpeg)


# デバイスからのメッセージ受信

今回、デバイスからメッセージを受信すると、IoT Core に、MQTTメッセージがPublishされる設定にしています。
そのため、IoT Core のMQTTテストクライアントから、メッセージを確認しています。

IoTルールで指定したMQTTトピック設定を確認し、メッセージをSubscribeできるように設定します。
デバイスからメッセージを送信すると、以下のように、メッセージが確認できました。

![awsiotcore-lorawantest01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/6ea0b063-adae-44ac-8fdb-df9b5ff94c70.jpeg)

いろいろなパラメータが確認できますが、いくつか重要なパラメータを以下に示します。

|パラメータ|説明|
| ---- | ---- |
|**PayloadData**|デバイスから送信されたデータ（ペイロード）をBase64でエンコードした値|
|**WirelessMetadata.FPort**|デバイスが使用する FPort|
|**WirelessMetadata.LoRaWAN.DevEui**|送信元のデバイスのEUI|
|**WirelessMetadata.LoRaWAN.Gateways**|送信元のゲートウェイの情報|

# まとめ
AWS IoT Core for LoRaWAN と LoRaWANゲートウェイ LPS8 を使って、LoRaWANネットワークの処理が確認できました。
設定項目は多いですが、複数デバイスも一括で管理することが可能です。

また、メッセージ受信時の処理は、IoTデバイスがMQTTでメッセージングするときと同様に、IoTルールに集約できるので、受信したメッセージの処理も、他のAWSサービスに簡単に連携することができます。


# 参考情報

- [AWS IoT Core for LoRaWAN デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/connect-iot-lorawan.html)
- [AWS IoT Core for LoRaWAN【AWS Black Belt】（2023/02/02）](https://www.youtube.com/watch?v=y3Qpw1H_Z7o)
- [TTN V3対応最新版LoRaWANゲートウェイLPS8-JP日本語マニュアル](https://www.slideshare.net/copstalk/ttn-v3lorawanlps8jp)
- [LoRaWAN 対応温度・湿度センサ LHT65 ユーザーマニュアル](https://www.slideshare.net/copstalk/lorawan-lht65)