sakura.ioとAlibaba Cloud が繋がった!  enebular のおかげ！

この記事は[Alibaba Cloud Advent Calendar 2018](https://qiita.com/advent-calendar/2018/alibabacloud)の16日目の記事です。(公開するの遅れた勢)

こんにちは、寺尾です。

自分の IoT 周りの知識を強化したいのと、10月までさくらインターネットでsakura.ioのハンズオン講師などをしていた関係で、折角なら sakura.io とAlibaba Cloud の IoT Platform を連携させるとこをやろうと思い立ちました。

# Alibaba Cloud  IoT Platform

まずは、Alibaba Cloud の IoT Platform を調べ始めました。 IoT Platform の概要はこんな感じ。

<img width="1382" alt="24CBA5958AC6D3189C6B49430FDAFD62.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/70132/9a07b4be-28df-3631-94c0-6b82be12d062.jpeg">

AWS の IoT Core などを触ってないので比較が出来ないんですよね。似たような感じだと思います。後で触ってみたいと思います。

ちなみに、Alibaba CloudのプロダクトラインナップはAWSに似ていて、ネーミングはAzureに似て機能＝名前というプロダクトが多いという感じです。

# IoT Platform 概要

デバイスの通信を受け取るIoT Hub、デバイス認証、デバイス管理、ルールエンジンでメッセージの処理を高度に制御可能なサービスです。

気になった仕様をピックアップしてみます。

- MQTT , CoAP , HTTP などをサポートする。SDKも提供
- リアルタイム通信用の persistent 接続、低消費電力の short-lived 接続に対応
- C, Node.Js, Java などのオープンソースSDK提供
- アップストリーム、ダウンストリームの両方に対応。
- デバイス認証にはデバイスごとにユニークなKeyを発行
- TLSをサポートし通信経路の暗号化が可能
- ルールエンジンで絞り込み、送信先（連携先）を定義可能

## 料金

気になる料金は、100万メッセージまで無料、10デバイス / 日 まで無料。

1デバイス 0.35円/日   10.5円/月(30日)
※その日に通信をしたデバイスの数を課金
※その日に通信したデバイスが10デバイス以下なら無料

100万メッセージ  92円
※1メッセージは 512バイト。512バイト超えるごとに1メッセージカウント。
※ルールエンジン経由でTableStoreなどに送信するのは無料
※1分に1回送信するデバイスなら、23デバイスまで無料になる。10デバイスなら30秒に1回でも無料になる。

実験程度であればまったく料金はかからない感じです。

より詳しくは以下のページを参照してください。
https://jp.alibabacloud.com/help/doc-detail/55733.htm

ちなみに、データを保存する Table Storeの料金ですが、東京の容量型インスタンスで、0.014/GB*時間なので、1分に1回のデータを1か月保存すると2.6GBなので、約16円程度で利用可能です。

 計算はこんな感じですがちょっと複雑ですね。
 0.4KB * 60 * 60 * 24 * 30= 2,592MB = 2.6GB —> 3GB * 0.014円 = 0.042円 
 0.042円 * 744時間 ÷ 2 = 15.624円/月

# 今回の構成

今回の構成はこんな感じになる予定です。

とりあえず、素直にsakura.ioの組み立てを行って、sakura.ioプラットフォームへデータを持ってきます。

<img width="1217" alt="今回の構成" src="https://qiita-image-store.s3.amazonaws.com/0/70132/433f3202-5c3e-a79c-7173-5d03ce0c1f9f.png">

sakura.ioプラットフォームからは、WebsocketやMQTTでデータを持って来れます。
Alibaba Cloudとのプロトコルの相性を考えると、MQTTがsakura.io側もAlibaba Cloud側も対応していて行けそうなのでこれを使いたいと思います。

## Alibaba Cloud での MQTT での接続準備

Alibaba Cloud側は、リージョンの選択、プロダクトの登録、デバイスの登録、をすれば受け入れ準備はとりあえず整います。接続方法については[こちらの記事](https://qiita.com/makotaka/items/388fa1ee0eb1f0237012)がとても分かりやすく書いて有ったので参考にしながら準備しました。

その結果、この4つが必要だと分かりました。Passwordをハッシュで自分で生成しないと行けないのが面倒ですが、これは後で何か簡単な方法が無いか調べたいと思います

1. Broker Address
2. ClientID(MQTTプロトコル上)
3. UserName
4. Password

これで、Alibaba側の用意は終わりました。次に、sakura.io 側の用意を始めます。

## sakura.io のデバイスの準備〜登録

何度もハンズオンをやっているので、こっちは慣れたもので組み立ては直ぐに終わり、sakura.ioプラットフォームへの登録も完了します。

![sakura.io + Arduinoの組み立て](https://qiita-image-store.s3.amazonaws.com/0/70132/ac1c571a-9ead-7f86-c296-35f472104c32.jpeg)

ハンズオンでやっているように温度を送信するようにして、無事にsakura.ioプラットフォーム側で受け取れていることまで確認します。
ここの手順はさくらインターネットがハンズオンを定期的にやっていますので是非とも参加してみてください。

## sakura.io 側のMQTT設定で課題が...

sakura.io の画面で MQTT Client の設定を進めていきます。図のようにある程度順調に進みました。今回はTLSは使わないので入れません。

<img width="525" alt="sakura.io の MQTT Clientの設定" src="https://qiita-image-store.s3.amazonaws.com/0/70132/5c03f440-1c86-80ea-9488-d3f2c09251fa.png">

と、ここでふと、ClientIDを入れるところが無いぞ。。。UserNameがClientIDかなと、入れ替えたり色々としていましたが、何をやってもコネクションエラーで繋がりません。

それぞれの仕様を見てみると、以下のような片思いがあることが分かりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/a701431e-a203-d0d6-35a6-1e7edd207a63.png)

そこで、sakura.ioの中の人にメッセンジャーで、「MQTT Client の ClientID ってどこで指定すれば良いんですか？」って聞いてみたら、「ClientID使ってるの初めて見た。指定するところはありません。」という残念の回答が。。。さくらインターネットさんには対応をしてほしいとお願いをしながら、このままだと直ぐには繋がりません。正直面倒で少し寝かしていましたが、11月の enebular の勉強会に行ったときにこれ使えば手軽に出来るんじゃね？ってことでやってみました。

## enebular で橋渡し！！

サイトによると、「enebular（エネブラー）は、IoT製品・サービスづくりを包括的に支援する、開発・運用サービスです。」
enebulerは、クラウド側も、デバイス側（ラズベリーパイなど）も、どちらの開発もNode-REDで行うことが出来、デバイスへリモートデプロイが可能なサービスです。
決して、Node-REDが手軽に使えるだけのサービスではありませんが、今回はそれがとても便利と言うことで使わせて貰いました。enebuler を使った後の構成はこんな感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/c5474fa2-e026-e498-43f1-d664975a8f51.png)

こういう構成にすれば、以下のように通信することが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/6f16d617-1e7c-5c43-4d30-4fbb04c86a36.png)

結果として、以下のようなフローを動かして、無事に通信することが出来ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/8c6d25a2-197b-a2ae-6eb8-262f1082bae4.png)

## しかし、しばらくすると通信出来なくなる


しかし、翌朝見てみるとデータが止まっています。しばらく悩んだ結果、enebularのNode-REDはフロー編集用に一時的に起動されているだけで、編集終了後しばらくすると終了してしまいます。よくよくenebularの管理画面を見てみると、デプロイ（Node-REDのデプロイでは無く）という機能があります。

（新しく出たenebular editorというPC/Macで動くエディタを使うと一定時間後に自動的に終了は無いですが、そうなると、インターネット(sakura.io)からの接続性が課題）

ということで、sakura.ioとAlibabaを繋ぐだけのサービスですが、Herokuにデプロイしてみたいと思います。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/e60b0ec5-1e85-d6f5-394e-27281f4f13a5.png)

Appをデプロイした後、フローをデプロイします。（結果、Herokuもアクセスが無いと落ちてしまうので、定期的に自分自身にアクセスして止まらないようにするギミックを追加）

その後も、無事通信しています。

## 無事通信が安定！Alibaba Cloud Rule Engene の設定

デバイスがアクティブになり、通信が出来ることが分かりました。

次に、Alibaba Cloudのルールエンジンの設定です。

どのデータを対象にするかは、SQLの書式でデータを指定します。SQLを使いますが別にデータベースを検索しているわけではありません。フローデータを絞り込んでいるだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/36491f95-4215-27bb-54bb-5dbe35508b89.png)

この例では、a6Giu3aFoXQ というプロダクトの、sakuraioB41 というデバイスの update というトピックに来たデータのうち、データ(JSON)の中身にtype="channels"がふくまれているものを対象としています。

次に、対象を絞り込んだデータをどこに転送するかを指定します。転送先は複数指定出来ますが、今回はAlibabaCloudのKVS型のデータベースである、TableStoreへ格納します。
TableStoreが無い場合はここで作成します。一時的な利用では容量型が安いので容量型を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/958acd63-bcc0-f2a5-fb96-c85ed818e283.png)

プライマリーキーには、日時を指定しています。届いたデータ（JSON）内の値を使う場合は ${datetime} のように括弧でくくって指定します。こうすることで動的なプライマリーキーを指定出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/9076b0f5-abc3-85b9-09b0-9829f7097617.png)

何らかのエラーが発生した場合は、iot というテーマでMessage Serviceへ送信しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/8c7e126f-94e9-a130-44fa-406633fe7765.png)

## Table Storeを確認

では、TableStoreの中身を確認してみると、確かにデータが届いているのが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70132/e1d7a8da-1885-54b3-28af-40aeb6978422.png)

# まとめ

今回はここでタイムオーバー。DataVと接続するところは、また別記事で書くことにします。

- Alibaba Cloudでの IoT Platform はデバイスの管理、認証、受信、データ処理、データ転送等が可能です。
- MQTTやCoAP、HTTP/HTTPSでデバイスと通信が出来ます
- 連携サービスには RDSやTableStore、メッセージサービス、Function Computeなどが選べます。
- 今回は扱いませんでしたが、ファームウェアの更新や、設定の配布などもサポートします。

また、今回の記事でsakura.ioに興味がある方は、2019-01-30（水）19:00 -  に、
[【2018年1月】sakura.io体験ハンズオン＠東京](https://sakura-kanto.doorkeeper.jp/events/84227) が有りますので良かったら参加してみてください。教材はAmazonや秋月で売っていますし、テキストや資料はすべて公開されています。参加しなくても、全部を体験することが可能です！

Alibaba Cloudでは[無料トライアル](https://jp.alibabacloud.com/campaign/coupon-freetrial?)をいつでも募集しています。興味を持った方は是非お試し下さい。

明日の [Alibaba Cloud Advent Calendar 2018](https://qiita.com/advent-calendar/2018/alibabacloud)もお楽しみに。

Happy Alibaba Cloud Life!!