Azure IoT HubをESP8266で使おう！

日本での発売から一年がたち多数の作例が出てくる「ESP8266」(ESP-WROOM-02)をもっと使いこなしてみませんか？
今回はAzureのサービスの一つであるIoTHub、それを簡単に扱えるライブラリーを作ったので紹介してみようと思います。

#ちょこっと宣伝
ところどころで出てくるESP8266の基板ですが、私が作成した「Nefry」(ねふりー)という基板を使っています。

**[dotstudio](https://dotstud.io/projects/nefry-connect-internet/)さんにて販売中です！！**

![](https://qiita-image-store.s3.amazonaws.com/0/97208/95705e6e-e8e8-9f9d-6778-7de63860a01e.jpeg)
USBに直接繋げられたり、Webページ上でWiFiの設定やESP8266の端末設定ができるようになっていたりとESP8266をより簡単に扱えるものになっています。

詳しくはLigブログで記事をいくつか載せていますのでご覧ください。

[自作したオリジナルIoTデバイス「Nefry」とインターネットを繋いでみた](http://liginc.co.jp/236620)

[Webサービス同士を連携できる「IFTTT」と自作IoTデバイスを繋いで生活を便利にしてみた](http://liginc.co.jp/263899)

#Azure IoT Hub って？

IoT Hubは、その名の通りIoTデバイスとクラウドを繋ぐHubとなるサービスです。
似たようなサービスとして「Event Hubs」がありますが、Event Hubsとの大きな違いは2つあります。

IoTHubの優れた点

- デバイスとクラウドとの双方向通信が可能。(Event Hubsはデバイス→クラウドの一方のみ)
- デバイス毎にIDを登録して認証する為、よりセキュアに利用できる。(Event HubsはEvent Hubsごとの許可)


[![](https://qiita-image-store.s3.amazonaws.com/0/29243/2caf6e0b-dac1-b955-0462-dae490ed0217.png)](http://qiita.com/hiiyan0402/items/9c93d9673114675a57d4)
http://qiita.com/hiiyan0402/items/9c93d9673114675a57d4

#用意するもの
- ESP8266(ESP-WROOM-02)
- Azure アカウント
- ArduinoIDE
- Arduino core for ESP8266 WiFi chip(https://github.com/esp8266/Arduino)
- AzureIoTHubライブラリー(https://github.com/wamisnet/Azure-iothub-mqtt-esp8266)


#IoTHubで通信をしてみる

今回はESP8266からIoTHubで通信するところまでを作っていきます。

##Azure IoTHubの設定
それでは、AzureにログインしてIoTHubを実際に作っていきましょう！

Azure ポータルを開いていきます。

新規からモノのインターネット(IoT)をクリックして、IoTHubをクリックします。これから必要な設定を行っていきます。
![qiita (1).png](https://qiita-image-store.s3.amazonaws.com/0/97208/ce4352be-1343-811e-9aff-3c9564616c34.png)

無事にIoTHubが開かれると複数の入力欄が出るので写真を参考に入力欄を埋めていきましょう。
それでは、必須項目であるIoTHubの名前を入力してください。この名前はドメインでも使われますので他の方と重複するとエラーが出ます。入力欄の右端が緑のチェックが入れば大丈夫です。
次に、価格とスケールティアを変更していきます。この際に**Free**を必ず選んでください。Standardを選んだまま作成してしまうと、後からFreeに変更することができず、再度作り直すことになります。

Freeを選択したらクリックして反映させてください。

![qiita (2).png](https://qiita-image-store.s3.amazonaws.com/0/97208/b6ba0433-2f3b-5880-a64a-984963454857.png)

リソースグループは既存ものがあれば、それを使って頂いてもかまいませんが、今回は初めてだという前提で、新規作成で好きなグループ名を入力してください。

Azureサーバーがある場所を指定することができます。東日本、西日本と選べますのでお好みでどうぞ。

ここまで問題なくできていれば、作成ボタンをクリックしてIoTHubをデプロイしていきます。
![qiita (3).png](https://qiita-image-store.s3.amazonaws.com/0/97208/a90ad588-662f-cef3-9a93-0a88d64a35dc.png)

数分かかりますのでしばしお待ちを…
![qiita (4).png](https://qiita-image-store.s3.amazonaws.com/0/97208/b1f92c09-8b7c-051b-a98c-4ec83906cf78.png)

無事にIoTHubのデプロイが終わるとこのような画面が表示されます。
この画面では先ほど設定した内容が見れるほか、IoTHubの使用状態を確認することができます。

![qiita (5).png](https://qiita-image-store.s3.amazonaws.com/0/97208/bdb67499-38b0-1423-a67f-0b3b97ded178.png)


デバイスを繋げるために必要な設定を行っていきます。
共有アクセスポリシーから**iothubowner**をクリックし、プライマリキーをコピーします。
このとき写真で示してある部分をクリックすると簡単にキーをコピーすることができます。

このプライマリキーは次の作業で使用します。
![qiita (6).png](https://qiita-image-store.s3.amazonaws.com/0/97208/0c2bfdd1-e227-a1f5-6cce-ca7b3c4a2293.png)

この作業から**Device Explorer**というツールを使っていきます。
このツールはWindows専用になります。MacやLinuxの場合**iothub-explorer**を使うようですが、今回は取り扱いません。

###Device Explorerのダウンロード
こちらの**[リンク](https://github.com/Azure/azure-iot-sdk-csharp/releases/download/2017-5-5/SetupDeviceExplorer.msi)**からダウンロードしてインストールをよろしくお願いします。

インストールが終わったところで**Device Explorer**を使っていこうと思います。

このツールでIoTHubに接続できる端末の登録、削除、ほかにはデバイスからIoTHubへの通信モニターになったり、IoTHubからデバイスにデータを送ることができるなどIoTHubに必須のものとなっております。

説明が長くなりましたが、それではこのDevice Explorerに先ほどのプライマリキーを入力して**Update**をクリックしてください。
![qiita (7).png](https://qiita-image-store.s3.amazonaws.com/0/97208/807dd4d5-c20e-efe9-7762-7a25b14ddb93.png)

プライマリキーが合っていれば、このような表示がされます。この表示がでれば先ほど作ったIoTHubと連携ができるようになります。
![qiita (8).png](https://qiita-image-store.s3.amazonaws.com/0/97208/f292ae2d-df6a-fb4d-d840-387815e711b2.png)
これからIoTHubに接続できるデバイスの設定をしていこうと思います。

この作業はデバイスごとにIDを割り振る作業になります。
ManagementからCreateをクリックします。
![qiita (9).png](https://qiita-image-store.s3.amazonaws.com/0/97208/f4126134-e9d6-aff1-357c-87f5b8ea69ba.png)
Createをクリックするとこのような画面が出ますので、Device IDに接続するデバイス名を入力してください。

入力が終わったらCreateをクリックしてください。
![qiita (10).png](https://qiita-image-store.s3.amazonaws.com/0/97208/38317460-b23e-cae6-ee33-36a893d7b596.png)


無事にデバイスが作れると先ほどのDevice IDを持ったものが増えているはずです。
![qiita (11).png](https://qiita-image-store.s3.amazonaws.com/0/97208/552087c4-b0e7-fe1c-a726-591d6e9a6ca2.png)

無事に作成できていれば、次はデバイスに必要な情報をコピーしておきましょう。
今回作成したDevice IDをクリックすると青色の欄が移動しますので、選択された状態で右クリックすると**Copy connection string for selected device**を選んでクリックしてください。

そうすると必要な情報がコピーされますので、その情報をESP8266に書き込むプログラムに貼り付けます。
![qiita (12).png](https://qiita-image-store.s3.amazonaws.com/0/97208/278d5b44-99f2-afff-c4da-38a86df31fa9.png)

##デバイスの設定
ArduinoIDEとArduino core for ESP8266 WiFi chip(https://github.com/esp8266/Arduino) の導入が終わっている前提で解説していきます。
導入が済んでなければ、Qiitaに情報がありますのでそちらをご覧ください。

それでは、AzureIoTHubライブラリー(https://github.com/wamisnet/Azure-iothub-mqtt-esp8266) をこちらのリンクから移動して写真を参考にZipでダウンロードしてください。
![qiita Github.png](https://qiita-image-store.s3.amazonaws.com/0/97208/6f363780-4432-7dfb-53aa-e24473fc3065.png)

ダウンロード終わりましたら、ArduinoIDEを開いてスケッチ→ライブラリーをインクルード→.zip形式のライブラリーをインストールをクリックし、先ほどダウンロードしたファイルを選んでください。そうすると自動的にライブラリーのインストールが始まります。
![qiita Arduino (1).png](https://qiita-image-store.s3.amazonaws.com/0/97208/2b86f8bb-0a79-6e6a-4907-d97cbfe34aa0.png)
問題なくライブラリーのインストールが完了すると**ライブラリーが追加されました。**と表示されます。
![qiita Arduino (2).png](https://qiita-image-store.s3.amazonaws.com/0/97208/df8e39da-6a35-0523-6abb-ff61b7571925.png)
ライブラリーがインストールしたところで実際に使ってみようと思います。

ファイル→スケッチの例→AzureIoTHubの中にあるAzure-iothub-mqtt-esp8266が選択できますので選択してください。
![qiita Arduino (3).png](https://qiita-image-store.s3.amazonaws.com/0/97208/d8bec667-8d50-9262-08d4-6de10f0fd2b6.png)
サンプルプログラムが表示されますので、それを使ってAzureIoTHubに接続してみようと思います。

それでは、サンプルプログラムの内容の紹介と変更部分を説明していきます。

ESP8266が接続するWiFiアクセスポイントの設定をWiFi.beginにSSID,Passwordをそれぞれ入力してください。
Azure.beginには、先ほどDevice Explorerで取得したキーを張り付けてください。
例：```Azure.begin("HostName=YourHost.azure-devices.net;DeviceId=YourDevice;SharedAccessKey=");```
注意としては、張り付けたときに両端に**"**(ダブルクォーテーション)を必ずつけてあることを確認してください。

```cpp:Azure-iothub-mqtt-esp8266.ino

  WiFi.begin("SSID", "PASS");
  Azure.begin("Your Key"); //YourKey Example:"HostName=YourHost.azure-devices.net;DeviceId=YourDevice;SharedAccessKey="
 
```

Azureからのデータの取得はこの関数で行います。
```Azure.setCallback(azureCallback);```
このazureCallbackは別で関数宣言してください。引数はStringでAzureから届いたデータを渡されますのでそのデータを活用してみてください。
サンプルプログラムでは、シリアルで表示するようになっています。

```cpp:Azure-iothub-mqtt-esp8266.ino

  Azure.setCallback(azureCallback);

void azureCallback(String s) {
  Serial.print("azure Message arrived [");
  Serial.print(s);
  Serial.println("] ");
}
```

簡単ではありますが、2点を注意して書き換えてください。
![qiita Arduino (4).png](https://qiita-image-store.s3.amazonaws.com/0/97208/41dadda0-700d-8a84-9ad6-3eccd8cf99ad.png)
続いて、loopの中を簡単に解説していきます。

WiFiに接続できたとき、Azureと通信を開始します。
```Azure.connect()```にてAzure IoTHubと接続する処理を行ってます。
```Azure.push(&a);```にてAzure IoTHubにデータ送信処理を行ってます。

```cpp:Azure-iothub-mqtt-esp8266.ino
void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    Azure.connect();
    DataElement a = DataElement();//Azureに送るデータをJsonで作っていきます。
    a.setValue("EspAnalog", analogRead(A0));
    Azure.push(&a);
    Serial.println("pushed");
    delay(2000);
  } else {
    Serial.println("Not connected to the Internet");
    delay(250);
  }
}
```

#実際に動かしてみよう
##AzureIoTHub→Nefry
これはAzureIoTHub(Device explorer)からNefry(ESP8266が中に入ってる)へデータを送っています。届いたときにLEDが点滅するようになっています。
そこまでラグなく点滅しているのが見えると思います。
![azure to device.gif](https://qiita-image-store.s3.amazonaws.com/0/97208/bad92a6e-5423-1535-a947-d6d5ca9d9d05.gif)
こちらはAzureIoTHub(Device explorer)とNefryのコンソール画面になりますが、ほとんどクリックしたタイミングでデータが届いていると思います。
![azure to device Cons .gif](https://qiita-image-store.s3.amazonaws.com/0/97208/11e8cd7a-e18d-eb15-c853-4a905df38457.gif)
##Nefry→AzureIoTHub
こちらはNefry(ESP8266)からAzureIoTHubにデータを送っています。
[GROVEのジョイスティック](https://www.switch-science.com/catalog/884/)をつかってアナログ値をAzureIoTHubへデータを1秒ごとに送っています。
![device to azure.gif](https://qiita-image-store.s3.amazonaws.com/0/97208/16c05b46-2e0b-1133-36cf-664bd9c4ff21.gif)
Device explorerにて届いた値を見ることができます。
今回はESPAnalogという項目にデータが入っているのが見ずらいですがわかると思います。
![device to azure cons.gif](https://qiita-image-store.s3.amazonaws.com/0/97208/0ce1a54f-ebf2-7c77-6aa0-05b2f063802c.gif)

#まとめ

今回このライブラリーを作るまで、お世話になりました@matsujirushi さん、@onoche　さんこの場を借りて御礼を申し上げます。

IoTHub×ESP8266の情報があまり多くなく四苦八苦しましたが、このライブラリーを使ってAzureにある機械学習やPower BIなど様々な仕組みと組み合わせて面白いものを作ってもらえたらうれしいです。