AWSとBLE人感センサーで会議室の利用状況を可視化してみる[第2話]

# 概要
エヌシーアイ総合システムのtaguchyです。
普段は主にBtoCのWEBシステムや、BtoB向けWEB APIの開発などをしています。
最近はIoT関連でもお仕事させていただいております。

さて、今回は第二話ということで、今日は以下までを行おうと思います。
(前回は[こちら](https://qiita.com/taguchy/items/a137c54d88cf605b4093 "AWSとBLE人感センサーで会議室の利用状況を可視化してみる[第1話]"))

1. AWSIoTにて証明書を作成
2. 証明書をmonoコネクトのGWにインストール
3. センサーデータをAWSIoTから見る

## 利用デバイス
センサーはレンジャーシステムズ株式会社様の「monoコネクト」を利用して、以下のデバイスを使用します。

* BLE/WiFiゲートウェイ：１台
* 人感センサー：３台

※届きました！

<img src="https://qiita-image-store.s3.amazonaws.com/0/197194/3e1b38cd-b664-653b-45e1-605499711b99.jpeg" width=60%>

中央が人感センサー、右がBLE/Wifiゲートウェイになります。
小さいです。
センサーが検知した人感データはBLEにてゲートウェイに送られ、そしてWifiにてネットワークに出ていきます。

# AWSIoTにて証明書を作成

AWSIoTを使用する場合、AWSIoTにて作成した証明書・秘密鍵を、AWSIoTにデータを送る端末にインストールしなくてはいけません。

monoコネクトの場合、AWSIoTにデータを送信するのはゲートウェイになるため、ゲートウェイに証明書・秘密鍵をインストールします。

## 証明書の作成

AWSコンソールにて、AWSIoTを開き、証明書の作成を行います。

![AWS_IoT1_edit.png](https://qiita-image-store.s3.amazonaws.com/0/197194/7b408662-8f03-a746-7075-99bfc5d2767a.png)

![AWS_IoT1.5.png](https://qiita-image-store.s3.amazonaws.com/0/197194/8a7df15a-0908-b937-dfc9-8b464d47e792.png)

![AWS_IoT1.7.png](https://qiita-image-store.s3.amazonaws.com/0/197194/20123d13-2a58-3c80-7849-a2108798124e.png)



簡単に作れます。
作成した証明書、パブリックキー、プライベートキー、CA証明書をダウンロードします。
（本記事では証明書とプライベートキーのみ使用します。）

ダウンロードが完了したら証明書を有効化して、ポリシーのアタッチ（アクセス許可の設定）を行います。
※AWSIoTでは証明書の単位でアクセスの許可設定を行います。

## 証明書へポリシーのアタッチ

![AWS_IoT1.8.png](https://qiita-image-store.s3.amazonaws.com/0/197194/82c335e1-f080-0615-6dfc-509d455c6599.png)

![AWS_IoT1.9.png](https://qiita-image-store.s3.amazonaws.com/0/197194/eb55e88e-242b-df8a-8f08-6b864bb04253.png)

![AWS_IoT2.png](https://qiita-image-store.s3.amazonaws.com/0/197194/11f66a98-b47d-fa83-f26f-0052495bb1de.png)

本証明書を持っている端末はすべての操作を許可するように作成しました。
サービス要件によって、許可の範囲は最低限とすべきですが、今回はお試しのため、iotに関する全権限を与えています。
ポリシーを作成したら先ほど作成した証明書にポリシーをアタッチします。

![AWS_IoT3.png](https://qiita-image-store.s3.amazonaws.com/0/197194/62e056f8-2838-4802-2973-857f01e0d303.png)

![AWS_IoT3.1.png](https://qiita-image-store.s3.amazonaws.com/0/197194/d61ea6de-938c-d7b7-8f35-53c35e80cf74.png)

## 証明書へデバイスのアタッチ

最後にデバイス（モノ）を登録します。

![AWS_IoT8.png](https://qiita-image-store.s3.amazonaws.com/0/197194/4066270d-c1bc-9b89-5773-e678b5033f1b.png)

![AWS_IoT8.1.png](https://qiita-image-store.s3.amazonaws.com/0/197194/79d30cc9-ba0a-bf8e-ac89-ffd9e5400963.png)

![AWS_IoT8.2.png](https://qiita-image-store.s3.amazonaws.com/0/197194/ba73b331-2ce9-017a-1113-b575cb0f128a.png)

タイプやグループ設定などは適宜行い、証明書の追加はスキップして作成完了します。

![AWS_IoT8.3.png](https://qiita-image-store.s3.amazonaws.com/0/197194/e529c698-6559-3399-61d8-05755b265c05.png)

モノを作成したら、ポリシーと同じような手順で証明書にアタッチします。

![AWS_IoT8.4.png](https://qiita-image-store.s3.amazonaws.com/0/197194/7b112caf-aedc-c24c-ff56-261bf89d8e1e.png)

![AWS_IoT8.5.png](https://qiita-image-store.s3.amazonaws.com/0/197194/f0096be7-349b-2b7d-5346-ccdf2e29f8fa.png)

以上でAWSIoTにて証明書の作成ができました。

# 証明書をmonoコネクトのGWにインストール

AWSIoTにて作成した証明書・秘密鍵を、BLE/Wifiゲートウェイにインストールします。
monoコネクトのGWではWEB UIで証明書のインストールができます（便利！）。

GWに電源を入れて、Wifiにて接続しWEB UIを操作します。

## Wi-Fi設定

Wi-Fi Modeを"Station"モードに変更し、Internet接続ができるWiFiをスキャンします。
（WPSにも対応しているので、WiFiがWPS対応であればそちらの方が簡単です。）

![GW設定変更.png](https://qiita-image-store.s3.amazonaws.com/0/197194/62ce6f79-e779-6cff-921b-5260c580ecac.png)

## Applications設定

AWSIoTとの通信に使用する設定を行います。
今回はMQTTにて接続するため、MQTT Clientを選択し、画像の通りに設定を変更しました。
※Publish Topicについては後から「ble/meeting」と変更しました。

![FireShot Capture 009 - Config Panel - http___192.168.10.1_index.html#_applications.png](https://qiita-image-store.s3.amazonaws.com/0/197194/7d66bee6-4cac-f7ab-3378-6a75d9b65c1d.png)

## Advanced設定

証明書のインストールを行います。
Certicateに証明書、Keyに秘密鍵を設定します。

![GW設定変更2.png](https://qiita-image-store.s3.amazonaws.com/0/197194/2d1dc627-5e93-b2c4-9cbb-e6525590a57f.png)

※BLE Filterについて
周りにBLE対応端末(ノートPCなど)がある場合、GWはセンサー以外のBLE情報もAWSIoTに送信しようとします。
センサーのデータのみを送信するように設定を行う場合、以下のような設定を行います。

|項目|設定値|
|:-:|:-:|
|Payload Pattern|02010612FF|
|Payload Mask|FFFFFFFFFF|

## 設定の反映(Reboot)

設定が完了したらRebootを行います。
【注意】
RebootをすることでGWが"Station"モードとなります。
GWが"Station"モードとなるとWEB UIでの操作は不可能となります。

以上でGWにAWSIoT証明書のインストールができました。

# センサーデータをAWSIoTから見る

実際に上がっているデータを見てみます。
AWSIoTのテスト機能を用いて、センサーのデータがAWSIoTに届いているかを確認します。

## AWSIoTのテストの利用

GWにて設定したトピック名を設定し、トピックへのサブスクライブを行います。

![AWS_IoT9.png](https://qiita-image-store.s3.amazonaws.com/0/197194/fb9f7d44-1c00-bfd5-3393-c21626bd9c18.png)

![AWS_IoT9.1.png](https://qiita-image-store.s3.amazonaws.com/0/197194/abf441f6-e350-4733-6d69-f74fddf52a8f.png)

トピックに送られてきたセンサーデータを確認することができます。

## センサーのデータフォーマット

センサーのフォーマットは以下のようなCSV形式となっています。

```
$GPRP,{センサーのMACアドレス},{GWのMACアドレス},{RSSI強度},{データ(Payload)}
```
Payloadはさらに以下のようなフォーマットになっています。

|02010612FF0D0082BC|2byte|1byte|4byte|2byte|1byte|3byte|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|固定値|バッテリー残量|ステータス|予約値|ユーザ設定値|固定値|予約値|


以上でAWSIoTにてセンサーデータの確認ができました。

# 次回更新予定
次回はAmazon Kinesis Data Firehoseを利用して、S3とElasticsearchにデータを流してみようと思います。

![AWS構成.png](https://qiita-image-store.s3.amazonaws.com/0/197194/4e1d7788-95e2-86f2-449b-f4d04224b59d.png)


12月22日の更新予定です。