Azure IoT HubをESP8266で使おう!

日本での発売から一年がたち多数の作例が出てくる「ESP8266」(ESP-WROOM-02)をもっと使いこなしてみませんか?

今回はAzureのサービスの一つであるIoTHub、それを簡単に扱えるライブラリーを作ったので紹介してみようと思います。

ちょこっと宣伝

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

dotstudioさんにて販売中です!!

USBに直接繋げられたり、Webページ上でWiFiの設定やESP8266の端末設定ができるようになっていたりとESP8266をより簡単に扱えるものになっています。

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

自作したオリジナルIoTデバイス「Nefry」とインターネットを繋いでみた

Webサービス同士を連携できる「IFTTT」と自作IoTデバイスを繋いで生活を便利にしてみた

Azure IoT Hub って?

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

IoTHubの優れた点

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

http://qiita.com/hiiyan0402/items/9c93d9673114675a57d4

用意するもの

IoTHubで通信をしてみる

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

Azure IoTHubの設定

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

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

新規からモノのインターネット(IoT)をクリックして、IoTHubをクリックします。これから必要な設定を行っていきます。

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

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

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

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

ここまで問題なくできていれば、作成ボタンをクリックしてIoTHubをデプロイしていきます。

数分かかりますのでしばしお待ちを…

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

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

このプライマリキーは次の作業で使用します。

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

Device Explorerのダウンロード

こちらのリンクからダウンロードしてインストールをよろしくお願いします。

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

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

説明が長くなりましたが、それではこのDevice Explorerに先ほどのプライマリキーを入力してUpdateをクリックしてください。

プライマリキーが合っていれば、このような表示がされます。この表示がでれば先ほど作ったIoTHubと連携ができるようになります。

これからIoTHubに接続できるデバイスの設定をしていこうと思います。

この作業はデバイスごとにIDを割り振る作業になります。 ManagementからCreateをクリックします。

Createをクリックするとこのような画面が出ますので、Device IDに接続するデバイス名を入力してください。

入力が終わったらCreateをクリックしてください。

無事にデバイスが作れると先ほどのDevice IDを持ったものが増えているはずです。

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

そうすると必要な情報がコピーされますので、その情報をESP8266に書き込むプログラムに貼り付けます。

デバイスの設定

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

それでは、AzureIoTHubライブラリー(https://github.com/wamisnet/Azure-iothub-mqtt-esp8266) をこちらのリンクから移動して写真を参考にZipでダウンロードしてください。

ダウンロード終わりましたら、ArduinoIDEを開いてスケッチ→ライブラリーをインクルード→.zip形式のライブラリーをインストールをクリックし、先ほどダウンロードしたファイルを選んでください。そうすると自動的にライブラリーのインストールが始まります。

問題なくライブラリーのインストールが完了するとライブラリーが追加されました。と表示されます。

ライブラリーがインストールしたところで実際に使ってみようと思います。

ファイル→スケッチの例→AzureIoTHubの中にあるAzure-iothub-mqtt-esp8266が選択できますので選択してください。

qiita Arduino (3).png

サンプルプログラムが表示されますので、それを使ってAzureIoTHubに接続してみようと思います。

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

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

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から届いたデータを渡されますのでそのデータを活用してみてください。 サンプルプログラムでは、シリアルで表示するようになっています。

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

簡単ではありますが、2点を注意して書き換えてください。

続いて、loopの中を簡単に解説していきます。

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

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が点滅するようになっています。 そこまでラグなく点滅しているのが見えると思います。

こちらはAzureIoTHub(Device explorer)とNefryのコンソール画面になりますが、ほとんどクリックしたタイミングでデータが届いていると思います。

Nefry→AzureIoTHub

こちらはNefry(ESP8266)からAzureIoTHubにデータを送っています。 GROVEのジョイスティックをつかってアナログ値をAzureIoTHubへデータを1秒ごとに送っています。

Device explorerにて届いた値を見ることができます。 今回はESPAnalogという項目にデータが入っているのが見ずらいですがわかると思います。

まとめ

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

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

ESP8266で静的なIPをわりふってみる

家のネット環境によってはDHCPでIPアドレスを取得するより、静的(static)なIPで割り振りたいという要望を聞きましたのでソースコードを公開します。

#表示内容

ESP8266のlocalIP ゲートウェイのIP サブネットマスク ESP8266のmacAddress

#コード

#include <ESP8266WiFi.h>
#define debug Serial
/*
IPアドレスをDHCPではなく手動で割り振ることをすることができる。
localIP:moduleのIP gateway:デフォルトゲートウエイ subnet:サブネットマスク DNSは指定しなくてよい。
config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
*/
void setup(){
debug.begin(115200);
WiFi.config(IPAddress(192,168,1,2),IPAddress(192,168,1,1),IPAddress(255,255,255,0));
debug.print("Local IP :");debug.println(address(WiFi.localIP()));
debug.print("Gateway IP:");debug.println(address(WiFi.gatewayIP()));
debug.print("SubnetMask:");debug.println(address(WiFi.subnetMask()));
debug.print("macAddress:");debug.println(WiFi.macAddress());
}
void loop(){
}
String address(IPAddress ip){
String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
return ipStr;
}

ESP8266でWPSを実装してみる

http://bbs.espressif.com/viewtopic.php?t=1096

ソース元はこちら

ESP-WROOM-02にはWPSでWiFiの設定をすることができる環境がつくられているようなのでその解説と結果を報告します。

環境

Arduino IDE 1.6.7 Arduino core for ESP8266 WiFi chip (https://github.com/esp8266/Arduino) v2.2.0

Arduino coreのバージョンが古いと実装されてない可能性があります。

コード

#include <ESP8266WiFi.h>
void Wifi_wait();
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
//WiFi.begin("","")このようにすることでWPSで保存したデータがある場合そちらに接続するようになる
WiFi.begin("", "");
Wifi_wait();
// Wifiに接続していないときにはWPSを開始します
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nAttempting connection ...");
WiFi.beginWPSConfig();
Wifi_wait();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected!");
Serial.println(WiFi.localIP());
Serial.println(WiFi.SSID());
Serial.println(WiFi.macAddress());
} else {
Serial.println("Connection failed!");
}
} else {
Serial.println("\nConnection already established.");
}
}
void loop() {
}
void Wifi_wait() {
int wait=0;
Serial.println("WiFi connecting");
while (wait < 20) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi connected");
return;
}
Serial.print(".");
wait++;
delay(250);
}
Serial.println("Connect timed out");
}

使いかた

Wifiに接続失敗したときにWPSで設定中のルータをさがしに行きます。

WPSで設定中のものがあったとき、ESP-WROOM-02はそのルータから設定を取得し、今後そのルータに接続するようになります。

Wifiに詳しくない人でもESP-WROOM-02を手軽に扱えるようになる技術だと思います、

結果

私の所持しているWifiルータではWPSでの接続は成功しませんでした…

それは、私の持っているWifiルータが悪いのかもしれないのでもしよければ、試して成功したかどうか教えてください。