AlibabaCloud IoTPlatformにおけるデータの流れを理解する①　-デバイスからIoT Platformにデータを送信する-

##　はじめに
AlibabaCloudのデバイス管理サービスであるIoT Platform。

* 様々なプロトコルでデバイスと双方向通信ができる
* デバイスの認証・管理ができる
* 受け取ったデータをルールに従って転送できる

と様々な機能があるのだが、いざ利用しようと思うと、

**DataHub/トピック/カテゴリ/RuleEngine**など、データの流れが分かりにくい部分も多い。
（少なくとも、私はそう感じた・・・。）
そこで、今回はAlibabaCoud IoTPlatformにおけるデータの流れを説明しようと思う。

## データの流れ全体像
まず、今回で実現するデータの流れを図示する。
IoT Platformのプロダクトを作成したとき、[解析しない / カスタマイズ (バイナリデータを示す)] と [Alink JSON] のいずれかのデータ型を選択する必要がある。

* 解析しない / カスタマイズ: ルールエンジンはバイナリデータを解析せず、データはターゲットに渡される。
*  Alink JSON: データはまず TSL (Thing Specification Language) に解析され、ルールエンジンは解析されたデータに SQL 文を実行する。

下記は、Alink JSON形式を選択した場合の流れである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/4a213e62-8158-ecf1-654c-aafc8d18b3da.png)
[公式サイト](https://jp.alibabacloud.com/help/doc-detail/87214.htm?spm=a21mg.p38356.b99.55.1ba7488bgeNx7J)から引用

## 構成
具体的な説明にあたっては、実機を使ったほうが分かりやすいので環境を準備する。

DeviceはCentOS7.6で構築したECS上で、Node.js用のサンプルモジュールからデータを送信することにする。
IoT Platformでデータを受信したのち、TableStoreに転送して格納する流れとした。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/60059e37-c72f-bc51-afc6-fd7c246f4e12.png">



## 環境構築順序

### IoT Platform
IoT Platformは、マネジメントコンソールで**[IoTPlatform]**を選択したのち左ペインに表示される**[クイックスタート]**に従って構築した。
なお、**[ステップ2 開発キットの選択]**では、
**デバイスOS：Linux、接続プロトコル：MQTT、SDK：Node.js**を選択した。
基本的に指示通り進めるだけなので、迷うところはないと思うが、<font color="Red">**「ステップ4設定とテスト」はECS構築完了時の動作確認に使うので、閉じないこと。**</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/81a30f09-c9ba-72ed-3547-d173adbf685c.png)

### ECS
※検証なので、すべてrootユーザで実施する。

ECSローンチまでの構築方法は、公式サイト参照のこと。
イメージは、AlibabaCloudが提供する、`centos_7_06_64_20G_alibase_20190711.vhd`を使用した。
上記イメージからローンチした場合、unzipコマンドが通らないので、unzipはインストールしておく。

```
# yum install unzip
```

次にNode.jsもインストール。

```
$ yum install nodejs
```

**[クイックスタート]**の中でダウンロードした`aliyun_iot_device_quickstart.zip`をECS上に配置し解凍。

```
# unzip aliyun_iot_device_quickstart.zip
```

初期状態ではstart.shに実行権限がないので、実行権限を与える。

```
# cd aliyun_iot_device_quickstart
# ll
total 20
-rw-r--r-- 1 root root 154 Aug 20 02:44 device_id_password.json
-rw-r--r-- 1 root root 656 Oct  9  2018 index.js
-rw-r--r-- 1 root root 249 Dec 21  2018 package.json
-rw-r--r-- 1 root root 144 Oct 10  2018 start.bat
-rw-r--r-- 1 root root 121 Oct  1  2018 start.sh
# chmod 744 start.sh 
# ll
total 20
-rw-r--r-- 1 root root 154 Aug 20 02:44 device_id_password.json
-rw-r--r-- 1 root root 656 Oct  9  2018 index.js
-rw-r--r-- 1 root root 249 Dec 21  2018 package.json
-rw-r--r-- 1 root root 144 Oct 10  2018 start.bat
-rwxr--r-- 1 root root 121 Oct  1  2018 start.sh

```

start.shを実行。
Aliyun Iot Device SDKがインストールされたのち、データがIoT Platformに転送され始める。

```

# sh ./start.sh
Installing Aliyun Iot Device SDK...
~中略~
npm WARN simple@1.0.0 No description
npm WARN simple@1.0.0 No repository field.
Connect successfully!
Post properties every 5 seconds...
Post properties: {"Status":1,"Data":"Hello, world!"}
Post properties: {"Status":1,"Data":"Hello, world!"}
```

マネジメントコンソールのIoT Pratform(ステップ4設定とテスト)を確認すると、デバイスがオンラインとなりデータが送信されている
ことが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/8c36788f-ce70-0c88-101a-616dee58407b.png)

## 次回に向けて
今回は、デバイスからIoT Platformに対してデータを送信するところまでを説明した。次回はTableStoreを構築し、
デバイスのデータをTableStoreに格納するまでの流れを説明する。

[AlibabaCloud IoTPlatformにおけるデータの流れを理解する②　-IoT Platformが受信したデータをTableStoreに格納する-](https://qiita.com/TakuyaMihara/items/34e1cb04e232efed31d1)