Check! IoT ができるようになるまで ～ ESP-WROOM-02 を IoT Foundation で Bluemix につなぐ！

おはようございます、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
====
さぁ、いよいよ IoT プラットフォームにつなぐ準備ができました！

Bluemix Advent Calendar 2015 でお披露目するべく、着々と準備を進めていたこの `ESP-WROOM-02` !
![20151212_arduino_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/38dd26d0-f6be-dfa5-39bb-0bb408b903ed.png)
(WiFiモジュール、Arduino互換のプログラム書き込み可能)

キミを、 IBM IoT Foundation で Bluemix につなげてあげるよー！(/・ω・)/

準備
====
前提
----
`ESP-WROOM-02` がインターネットに接続できる状態であることが前提です。

過去の記事で `ESP-WROOM-02` の準備をしたので、ぜひご参照くださいませ。

- [Check! IoT ができるようになるまで ～ まずはシリアル通信を使えるようになる](http://qiita.com/dz_/items/277eba8cb760b81a2688 "Check! IoT ができるようになるまで ～ まずはシリアル通信を使えるようになる")
- [Check! IoT ができるようになるまで ～ ESP-WROOM-02 にシリアル通信で接続する](http://qiita.com/dz_/items/7cca78ffa792a55416e2 "Check! IoT ができるようになるまで ～ ESP-WROOM-02 にシリアル通信で接続する")
- [Check! IoT ができるようになるまで ～ ESP-WROOM-02 にプログラムを焼く](http://qiita.com/dz_/items/eb7c80d3caf4a5c84274 "Check! IoT ができるようになるまで ～ ESP-WROOM-02 にプログラムを焼く")


おおまかな手順
----
さて、準備ができたら Bluemix IBM IoT Foundation に接続する準備を進めましょう。

1. Arduino IDE に MQTT ライブラリを導入する
2. Bluemix で IoT Foundation サービスを作成する
3. IoT Foundation にデバイスを登録する
4. Bluemix で IoT Foundation Starter を作成する
5. データを送ってみる

Arduino IDE に MQTT ライブラリを導入する
====
Arduino IDE に MQTT ライブラリを導入します。

今回は、参考にしている [IBM developerWorks レシピ](https://developer.ibm.com/recipes/tutorials/connect-an-esp8266-with-the-arduino-sdk-to-the-ibm-iot-foundation/ "Connect an ESP8266 with the Arduino SDK to the IBM IoT Foundation") で紹介されている [Arduino Client for MQTT](https://github.com/knolleary/pubsubclient "Arduino Client for MQTT") を利用します。

Git で導入する場合
----
Arduino IDE のインストールディレクトリに、 `libraries` があるので、その下に任意のディレクトリを作って `git clone` してください。
![20151214_arduino_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/ce3a747d-596e-527d-21cb-c402dc578505.png)

「スケッチ」>「Include Library」>「Manage Libraries...」を開きます。
![20151214_bluemix-iot_015.png](https://qiita-image-store.s3.amazonaws.com/0/3812/b5d58e7b-d74a-41a2-bee7-6bdd01d06e09.png)

`PubSubClient` をみつけて、インストールしてください。
![20151214_arduino_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/97cca53c-b0be-90b6-7838-b89217a5a11b.png)

Zip で導入する場合
----
もし、Zip をダウンロードして導入する方は、 Arduino IDE の 「Add .ZIP Library...」を利用できるかと思います。
![20151214_bluemix-iot_014.png](https://qiita-image-store.s3.amazonaws.com/0/3812/bb3a7e7f-6f09-4391-2730-df15fe1976d7.png)

Bluemix で IoT Foundation サービスを作成する
====
それではさっそく、 [Bluemix カタログ](https://console.ng.bluemix.net/catalog/ "Bluemix カタログ") から、「Internet of Things Foundation」を作成します。

![20151214_bluemix-iot_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/df1068bb-b639-7297-4d8d-4e440c73d1dd.png)

名前を付けて、アンバインドのままで作成します。
![20151214_bluemix-iot_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/8e31d144-1867-651e-aa63-b6f08b4b2420.png)

「ダッシュボードを起動」で、Internet of Things Foudation のダッシュボードを開きます。
![20151214_bluemix-iot_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/118e9e3c-88af-200d-2578-e787754d10e8.png)

IoT Foundation にデバイスを登録する
====
次に、 `ESP-WROOM-02` を想定したデバイスを IoT Foundaiton に登録します。[Internet of Things Foundation へのデバイスの登録](https://www.eu-gb.bluemix.net/docs/services/IoT/index.html#gettingstartedtemplate "Internet of Things Foundation へのデバイスの登録") を参考にしました。

Internet of Things Foundation のダッシュボードはこのようになっています。デバイスの追加をクリックします。
![20151214_bluemix-iot_018.png](https://qiita-image-store.s3.amazonaws.com/0/3812/498ed99e-e4f0-ffc6-3475-145b3f7addc0.png)

作成直後は、デバイス・タイプがないので、作成しましょう。
![20151214_bluemix-iot_019.png](https://qiita-image-store.s3.amazonaws.com/0/3812/1de12f38-074d-f53c-7ec7-227c3ba8de7f.png)

任意のデバイス名を入力します。この後オプションでいろいろ入力できるので、好みで入力してください。
![20151214_bluemix-iot_020.png](https://qiita-image-store.s3.amazonaws.com/0/3812/b03a5f08-e52d-e651-046f-62c624862cb5.png)

デバイス・タイプが作成できたので、デバイスの追加に進みます。
![20151214_bluemix-iot_024.png](https://qiita-image-store.s3.amazonaws.com/0/3812/b81d7a71-17e6-b5f6-dc1b-406048100b40.png)

任意のデバイス名を入力します。この後もオプションでいろいろ設定できるのでお好みで設定してください。
![20151214_bluemix-iot_025.png](https://qiita-image-store.s3.amazonaws.com/0/3812/450e4cf3-0262-82e6-4de6-6ceeb34094d9.png)

トークンの設定をします。私は「自動生成認証トークン」を利用しました。
![20151214_bluemix-iot_027.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9d703061-259e-7f7e-65fa-cbf5016eddbf.png)

デバイスの登録が完了しました。
![20151214_bluemix-iot_029.png](https://qiita-image-store.s3.amazonaws.com/0/3812/7112ab17-febb-ee56-70ec-eadb50d09619.png)

この情報はプログラムで使いますので、控えておいてください。トークンはこれ以降は表示されないので、ここで必ず控えておいてください。

- 組織ID
- デバイス・タイプ
- デバイスID
- 認証トークン


Internet of Things Foundation Starter を作成する
====
それから、データの受け手も作成しましょう。

[モノのインターネット・スターター・アプリケーションによるアプリの作成](https://www.eu-gb.bluemix.net/docs/#starters/IoT/../../starters/IoT/iot500.html "モノのインターネット・スターター・アプリケーションによるアプリの作成") を参考に、IoT Foundation と連動するスターターアプリを使ってみます。

これは [Node-RED](http://nodered.org/ "Node-RED") というGUIで処理を描けるオープンソースのツールを用いたアプリケーションがつくれます。私は今回初めて触ってその簡単さにびっくりしました。

[Bluemix カタログ](https://console.ng.bluemix.net/catalog/ "Bluemix カタログ") から、今度は「Internet of Things Foundation **Starter**」を作成します。項目を入力して作成を進めてください。
![20151214_bluemix-iot_035.png](https://qiita-image-store.s3.amazonaws.com/0/3812/5a6a62c9-4979-b8e1-a320-36148ee1677e.png)

作成できたら、アプリケーションの起動を待ちます。

起動できたら、URLをクリックして開いてください。
![20151214_bluemix-iot_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/db54b6d5-d574-4e1f-9f14-e81b66a0fa8c.png)

Node-RED のフローエディタを開きます。
![20151214_bluemix-iot_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/fb5a87f0-0ba8-a6c7-d1df-a7ad89868c4a.png)

こんな画面です。ノードをつなげて処理を作っていきます。この時点ですでに IoT Foundation からの入力を受けてデバッガに出力する処理が設定されています。
![20151214_bluemix-iot_008.png](https://qiita-image-store.s3.amazonaws.com/0/3812/1f55aa33-9e42-c6c5-2c59-e5b0522709bf.png)

ここで、Bluemix のダッシュボードに戻って、このスターターアプリケーションに「Internet of Things Foundation サービス」をバインドします。(アプリケーションの再起動があります。）
![20151214_bluemix-iot_031.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c0e6b889-eed5-3ea3-6107-2f0e64f093f7.png)


アプリケーションの再起動が終わったら、IoT Foundation からの入力を調整するので、Node-RED フローエディタの「IBM IoT App In」をダブルクリックしてください。
![20151214_bluemix-iot_036.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9e4682a1-2a17-ed51-4241-b1f0ce7d97d3.png)

「Authentication」に「Bluemix Service」を選択して「OK」をクリックします。（適宜、「Device Id」を指定してもいいかもしれません。）
![20151214_bluemix-iot_037.png](https://qiita-image-store.s3.amazonaws.com/0/3812/8e0797d7-43cb-ecdf-8955-eafa88679ef8.png)

これで準備は完了です。

データを送ってみる
====

いよいよデータを送ってみましょう！

ソースコードは、[IBM developerWorks レシピ](https://developer.ibm.com/recipes/tutorials/connect-an-esp8266-with-the-arduino-sdk-to-the-ibm-iot-foundation/ "Connect an ESP8266 with the Arduino SDK to the IBM IoT Foundation") のサンプルコードをベースに、[PubSubClient の ESP8266向けサンプルコード](https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino "pubsubclient/mqtt_esp8266.ino at master · knolleary/pubsubclient") を参考に調整しました。

```cpp:esp8266_to_iotf.ino
/** 
 * This source code refer to the recipe of IBM developerWorks, https://developer.ibm.com/recipes/tutorials/connect-an-esp8266-with-the-arduino-sdk-to-the-ibm-iot-foundation/ .
 */ 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

//-------- Customise these values -----------
const char* ssid = "<WIFI SSID>";
const char* password = "<WIFI PASSWORD>";

#define ORG "<ORGANIZATION_ID>"      // 組織ID
#define DEVICE_TYPE "<DEVICE_TYPE>"  // デバイス・タイプ
#define DEVICE_ID "<DEVICE_ID>"      // デバイスID
#define TOKEN "<TOKEN>"              // 認証トークン
//-------- Customise the above values --------

char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

WiFiClient wifiClient;
PubSubClient client(wifiClient);

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.println("callback invoked");
}

void setup() {
 Serial.begin(115200);
 Serial.println();

 Serial.print("Connecting to ");
 Serial.print(ssid);
 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 } 
 Serial.println("");

 Serial.print("WiFi connected, IP address: ");
 Serial.println(WiFi.localIP());

 client.setServer(server, 1883);
 client.setCallback(callback);
}

int counter = 0;

void loop() {

 if (!!!client.connected()) {
 Serial.print("Reconnecting client to ");
 Serial.println(server);
 while (!!!client.connect(clientId, authMethod, token)) {
 Serial.print(".");
 delay(500);
 }
 Serial.println();
 }

 String payload = "{\"d\":{\"myName\":\"";
 payload += DEVICE_TYPE;
 payload += ".";
 payload += DEVICE_ID;
 payload += "\",\"counter\":";
 payload += counter;
 payload += "}}";
 
 Serial.print("Sending payload: ");
 Serial.println(payload);
 
 if (client.publish(topic, (char*) payload.c_str())) {
 Serial.println("Publish ok");
 } else {
 Serial.println("Publish failed");
 }

 if (1000 < counter) {
  counter = 0;
 }
 else {
  ++counter;
 }
 delay(10000);
}
```
いざ！

![20151214_bluemix-iot_030.png](https://qiita-image-store.s3.amazonaws.com/0/3812/0e8c69f8-87d1-a299-33c8-96d2fda2fe17.png)

![20151214_bluemix-iot_033.png](https://qiita-image-store.s3.amazonaws.com/0/3812/3cd5f76e-9345-df82-eef7-8bdf7a799daf.png)

この `ESP-WROOM-02` から Bluemix につながったーーーー！！！(*ﾉωﾉ)

朝4時の感動。

Epilogue - おわりに
====
実は、意気込んで作業開始するも Bluemix の計画メンテナンスにぶつかり、500エラーの連続…(;´Д｀)

普段使ってる米国リージョンをあきらめ、仮眠してヨーロッパがメンテナンスが終わるのを待ち、4時に晴れて繋がるというぎりぎりな Advent Calendar 参戦と相成りました(/・ω・)/

あー！もう朝だけど 12/14 の Advent Calendar として投稿します！おやすみなさい！

[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"