次の方法で共有



April 2016

Volume 31 Number 4

モノのインターネット - Visual Studio と C++ による Azure 接続型 IoT ソリューションの開発

Marc Goodner | April 2016

最近は、モノのインターネット (IoT) が至る所で見受けられます。IoT には多くの「モノ」がありますが、クラウドに収集されたセンサー データを細かく処理する「モノ」と考えるのが最もシンプルです。この考え方がさまざまな形で表現されます。たとえば、センサー データを収集するために導入されるデバイス、大規模にデータを取り込むリッチなクラウド サービス、そのデータを処理/操作するビッグ データ分析と機械学習、そのデータから洞察を得るリッチなレポート アプリやクライアント アプリなどです。

それでは、IoT に手を付けるにはどうすればよいでしょう。それには、デバイスとクラウドに加え、ソフトウェア ソリューションを作成して配置するデバイス、クラウド、ツールが必要です。

今回は、Visual Studio の C++ プロジェクト テンプレートを使用してデバイスを Azure IoT に接続する方法を説明します。この方法は、一般的なデバイスのほとんどに当てはめることができます。Azure IoT Hub を立ち上げてデバイスのデータを取り込む方法や、そのデータを操作する関連サービスも取り上げます。Azure IoT サービスは 2 つの理由から高い柔軟性を提供します。1 つは、デバイス自体で使用しているプログラミング言語に依存しないため、もう 1 つは、Azure IoT デバイス クライアント SDK を通じて、増え続ける言語とデバイスをサポートするためです。今回は C++ を取り上げます。C++ は、ごく小さく電力効率の高いマイクロコントローラーから、Linux や Windows IoT などのフルバージョンの OS を実行するデバイスまで、幅広いデバイスをサポートする言語で、低レベルのデバイス機能を制御できます。C++ の開発者でない方も本稿を参考にすれば、ネットワーク接続型のデバイスにシンプルなアプリケーションを配置して、データを Azure に取り込めるようになります。

今回のシナリオは、デバイスから光センサー データを収集して Azure に取り込むというシンプルなものです。目標は、エンドツーエンドのソリューションを完成することではなく、基礎を理解することです。つまり、データを収集して、データがクラウドに取り込まれたことを確認する方法に重点を置きます。このデータを他の Azure サービスで使用する方法、Azure サブスクリプションに含まれるサービスにデプロイする方法についても紹介します。IoT の詳細については、aka.ms/iotmsdnb16 (英語) を参照してください。こちらには、今回紹介するツールへのリンクのほか、追加のドキュメントや多数のサンプルに加え、「Connect the Dots」という完成版のエンドツーエンド IoT アプリケーションがあります。このアプリケーションは簡単に Azure サブスクリプションにデプロイして、デバイスに接続できます。

まず、Azure IoT Hub をセットアップしてから、Visual Studio でコードを作成し、テスト データを Azure バックエンドに送信します。その後、さまざまなデバイスからの実データを使用して同じことを行い、収集したセンサー データと Azure サービスを一緒に使用してできることを説明して締めくくります。

Azure IoT Suite と Azure IoT Hub

IoT ソリューションのクラウド部分については Azure からサービスが提供されます。たとえば、Azure IoT Hub や、事前作業を減らし長期的なスケーラビリティを提供する Azure IoT Suite というバンドルなどがあります。Azure IoT Hub は、デバイスの接続ポイントです。Azure IoT Hub は大量データの取り込みをサポートするように最適化されており、連続的に更新を送信することが一般的ではないデバイスを何百万台も導入するのに欠かせない機能です。Azure IoT Hub には、無料エディションと 2 つの有料エディションがあります。無料エディションは 1 日 8,000 件のメッセージまで送信可能で、プロトタイピングや個人プロジェクトに最適です。有料エディションには、1 日に最大 400,000 件のメッセージを送信できる小規模プロジェクト用のエディションと、1 日に最大 6,000,000 件のメッセージを送信できる大規模プロジェクト用のエディションがあります。作成する IoT ソリューションの規模に応じて、ソリューションに必要なメッセージ件数を送信できるだけの IoT Hub をデプロイできます。また、IoT Hub には、IoT デプロイのニーズに合わせたデバイスの管理機能やプロビジョニング機能があるほか、ソリューションのデバイス接続やサービス管理部分を開発するためのさまざまなオープン ソース SDK が用意されています。

Azure IoT Suite では、開発プロセスを簡略化するように事前構成された完全なエンドツーエンドの IoT ソリューションのコレクションが日々追加されています。コレクションには、メンテナンス時期予測 (機械のセンサー データを使用して問題が発生する前に問題を予測する) など、IoT プロジェクトの一般的なソリューションが含まれます。Azure IoT Suite のソリューションは、Azure IoT Hub など、事前構成された一連の Azure IoT サービスで構成されます。Azure IoT Hub は Azure サブスクリプションにプロビジョニングできるため、迅速に IoT ソリューションをデプロイした後、プロジェクト固有のニーズに合わせてソリューションをカスタマイズできます。

アプリケーションのデバイス側を開発するには、Azure IoT Suite の事前構成されたソリューションを使用するか、独自の Azure サービス セットをデプロイするかにかかわらず、同じ Azure IoT SDK を使用します。この後のサンプルでは、Azure IoT Hub インスタンスの背後にシンプルなサービスを手動でセットアップして、シンプルな IoT エンドツーエンド ソリューションのデモを行います。

Azure IoT Hub への接続

最初の手順は Azure IoT Hub のセットアップです。Azure サブスクリプションをお持ちでなければ、無償評価版サブスクリプションを作成できます。作成が完了したら、Azure ポータルにログインして、[新規]、[モノのインターネット (IoT)]、[Azure IoT Hub] の順にクリックし、オプションをすべて指定します。価格レベルを選択します (デプロイできる IoT Hub の無料レベルのインスタンスはサブスクリプションごとに 1 つだけです)。他のフィールドを指定したら、[作成] をクリックします (図 1 参照)。

新しい Azure IoT Hub の作成
図 1 新しい Azure IoT Hub の作成

次に、Visual Studio 2015 Community エディション以上と C++ ツールをインストールし、適切に構成します。また、Visual C++ for Linux Development、Visual C++ for IoT Development、および Azure IoT Hub Connected Service の拡張機能をインストールする必要があります。Windows IoT デバイスをターゲットにする予定の場合は、Windows IoT Core テンプレートもインストールする必要があります。これらの拡張機能は Visual Studio ギャラリーのものを利用するか、Visual Studio で [ツール]、[拡張機能と更新プログラム] メニューを順にクリックしてインストールできます。同様に、Arduino と mbed の例では、PlatformIO を使用してそれらのボードのコンパイラを有効にします。PlatformIO は platformio.org で入手できます。

それでは、IoT Hub に接続するプロジェクトを作成します。Azure IoT SDK には、このコードを含む数多くのサンプルがあります。各サンプルは、特定のプロトコルやデバイスに重点を置いています。このコードを入手する最も簡単な方法は、Azure IoT Hub Connected Service 拡張機能をインストールすることです。この拡張機能は現在、C# プロジェクトと C++ プロジェクトをサポートしています。コードのプロトタイプを簡単に試してからデバイスを扱うために、作業は Windows で行います。拡張機能をインストールしたら、新しい Win32 プロジェクトを Visual C++ で作成します。

プロジェクトで、[参照] を右クリックして、[接続済みサービスの追加] をクリックします。表示されるダイアログ ボックスで、[Azure IoT Hub Connected Service] を選択し、[構成] をクリックします (図 2 参照)。

Azure IoT Hub Connected Service 拡張機能の使用
図 2 Azure IoT Hub Connected Service 拡張機能の使用

Azure アカウントでサインインすると、IoT Hub が表示されます。その IoT Hub を選択し、[追加] をクリックします。これで、IoT Hub にデバイスを既に追加している場合は既存のデバイスの一覧が表示され、追加していない場合は空の一覧が表示されます。[New Device] (新規デバイス) をクリックし、名前を選択します。ここでは「ThingOne」にします。しばらく待って、この名前が表示されたら選択します。これで、必要な NuGet パッケージとライブラリがダウンロードされて、新しいファイル azure_iot_hub.cpp とそれに対応するヘッダー ファイル azure_iot_hub.h が生成されます。このファイルには、選択したデバイスに必要な接続文字列を使用して Azure IoT Hub にデータを送信するベスト プラクティスを盛り込んだヘルパー関数が含まれています。もちろん、送受信するメッセージを処理するには、ここで生成されたコードを変更する必要があります。ここでは、既定のメッセージを送信します。新しいヘッダー参照をコンソール アプリケーション コードに追加し、main で send_device_to_cloud_message 関数を呼び出します。コードは次のようになります。

#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
{
  send_device_to_cloud_message();
  return 0;
}

次に、IoT Hub エクスプローラーを使用してメッセージが IoT Hub に送信されることを検証します。IoT Hub エクスプローラーは Node.js ベースのクロスプラットフォーム CLI ツールです。お使いのコンピューターにインストールされていない場合は、今すぐインストールしてください。ツールは次のように npm を使用して入手します。

npm install -g iothub-explorer@latest

次に、コマンド プロンプトで IoT Hub エクスプローラーを起動して、デバイスから Azure IoT Hub に送信するデータを確認します。接続文字列とデバイス名を含む必要なコマンドは、azure_iot_hub.cpp ファイルのコメントに記述されています。Azure ポータルで自身で接続文字列を見つけるには、IoT Hub を選択した後、[要点] バーの鍵のアイコンを選択して、表示される [共有アクセス ポリシー] パネルを確認します。

iothub-explorer [<connection-string>} monitor-events ThingOne

デバイスのイベントが監視されていることを示すメッセージが表示されます。次に、Visual Studio に戻って、F5 キーを押し、デバッグを開始します。コンソールに、受信したイベント「Hello Cloud」が表示されます。

ここで一時停止して、生成された Azure への接続を処理するコードを確認してもかまいません。send_device_to_cloud_message の中に、作成する IoT クライアントがあります。

IOTHUB_CLIENT_HANDLE iothub_client_handle =
  IoTHubClient_CreateFromConnectionString(connection_string, AMQP_Protocol);

AMQP_Protocol が既定のプロトコルですが、他の HTTP や MQTT などのプロトコルもここで使用できます。このクライアントの作成に関するエラー処理が提供されていることと、適切に破棄されていることもわかります。メッセージ自体はクライアントが正常に作成されるとすぐに送信されます。

d::string message = "Hello, Cloud!";
IOTHUB_MESSAGE_HANDLE message_handle =
  IoTHubMessage_CreateFromByteArray((const unsigned char*)message.data(),
  message.size());

ここでも、エラー処理が提供されていること、受信通知の配信を確認するために要求が IoT Hub に送信されることがわかります。ここで、少し変更を加えて、独自のメッセージを送信できるようになります。

実際のセンサーを使用する段階に進むと、フォトレジスター (光依存性抵抗、LDR とも呼ばれる) を使用して明るさを検知します。そのため、このシナリオに適切な値を含むメッセージを送信するように、コードを変更します。ヘッダー ファイル azure_iot_hub.h に、関数呼び出しのパラメーターとして int を追加します。追加後のヘッダーの内容は次のようになります。

// Insert call to this function in your code:
void send_device_to_cloud_message(int);

send_device_to_cloud_message の関数定義で、「Hello Cloud」を送信するのではなく、センサー データを使用するようにメッセージの値を変更します。JSON 形式で変更した例を以下に示します。

char msgText[1024];
sprintf_s(msgText, sizeof(msgText), "{\"ldrValue\":%d}", ldrValue);
std::string message = msgText;

より複雑な JSON データやその他の形式については、お好みの C++ ライブラリを使用できます。

ここで、main 関数を更新して、値をセンサー データとして渡します。

#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
{
  int ldrValue = 500;  // value will be read from a sensor in later examples
  send_device_to_cloud_message(ldrValue);
  return 0;
}

IoT Hub エクスプローラーを実行したままにして、メッセージの構築を観察し、プロジェクトを実行します。新しいイベントが JSON 形式のデータ { ldrValue: 500 } と一緒に受信されます。

これで、デバイスと、デバイスに接続されたセンサーに接続する IoT クラウドとコードの準備は完了です。

デバイスとセンサー

今回のアプリケーションでは実際のセンサーとして、Seeed Studio の Grove システムを使用します。Grove で提供されるさまざまなセンサーには、デバイスに接続された拡張ボードにつなぐための一般的なコネクターが付いています。そのため、プロトタイプ IoT ソリューションを開発するときは、ハンダ付けの必要のない実験用回路板を用意します。もちろん、使用するセンサーは任意です。デバイス コード内でセンサー データをシミュレーションする場合は、センサーをまったく使用しなくてもかまいません。ここで示すコード サンプルで使用する具体的な Grove デバイスは光センサーです。これを使用する理由の 1 つは、この Grove デバイスはアナログ出力を生成するので、特定のライブラリを確認してインストールするという、プラットフォームごとに異なるプロセスが不要で、簡単だからです。すべての例で、センサーは Grove 拡張ボードの「A0」というラベルの付いたコネクターに接続します。シールドを使用することを好まず、実験用回路板の扱いに慣れていれば、LDR を電源とボードのアナログ入力ピンに接続するだけです。

ソリューションのデバイス部分については、Raspberry Pi、Aruduino、および mbed の 3 つの代替デバイスを取り上げます。IoT プロジェクトのデバイスを選択するときには、考慮すべき要素が数多くあります。この 3 つの選択肢は、さまざまなシナリオを幅広くカバーします。小規模配置の場合、さまざまな市販のデバイスを使用すると開発プロジェクトを簡素化できます。しかし、大規模配置の場合、そのような方法はコスト効率が良くありません (何万台ものデバイスを配置する場合、ハードウェアのコストをほんの 100 ~ 200 円でも削減すると、大きな違いが生まれます)。IoT の学習を始めたばかりの場合は、コストを最小に抑えることよりも、開発を簡素化することの方が勝るでしょう。しかし、プロトタイピングでは、おそらく、コストを考慮することになります。デバイスの基本的なセットアップはここでは扱いませんが、aka.ms/iotmsdnb16 (英語) にオンラインの資料があります。図 3 がここで説明するデバイスとセンサーです。

Raspberry Pi 2 に Grove Hat と光センサーを接続したもの (左下)、Arduino Yun (左上)、Grove ベース シールド (右上)、FRDM 64 mbed ボード (右下)
図 3 Raspberry Pi 2 に Grove Hat と光センサーを接続したもの (左下)、Arduino Yun (左上)、Grove ベース シールド (右上)、FRDM 64 mbed ボード (右下)

本稿執筆時点で、Azure IoT Hub Connected Service 拡張機能では Windows で使用するバイナリ ライブラリしかダウンロードできません。マイクロソフトでは、他のプラットフォームをターゲットとしたライブラリもダウンロードできるように取り組んでいます。とはいうものの、拡張機能で生成されるコードはさまざまなプラットフォームで機能します。ここからの手順では、先ほど生成した、Azure IoT Hub へのメッセージを処理するコードを再利用します。各デバイスの説明は、そのセクションだけで完結するようになっています。そのため、興味のないデバイスの説明については読み飛ばしてかまいません。

Raspberry Pi: Raspberry Pi は、ARM プロセッサと GPU を搭載したシングルボード コンピューターです。さまざまなエディションの Linux を実行でき、Windows 10 IoT もサポートします。Raspberry Pi は高い柔軟性を備え、ネットワーク、USB、GPIO、HDMI を搭載した完全なコンピューターです (ただし、アナログ センサーはサポートしません)。製作者コミュニティが活発に活動しているため、サンプル プロジェクトが豊富で、ヘルプをオンラインで利用できます。しかし、その柔軟性にはコストがかかります。他のデバイスに比べて消費電力が多く、カスタマイズのオプションが限られています。そのため、有線で電源を利用できないデバイスをプロトタイピングする場合や、デバイスを大量に配置する場合は、別のボードも検討してください。

今回は、Dexter Industries の Grove コネクターの拡張ボード (このボードはアナログ サポートも追加します) と、「A0」に接続した光センサーを組み合わせて使用します。最近リリースされた、Linux をサポートする新しいプロジェクト システム (Visual C++ for Linux Development 拡張機能の一部) も使用します。これにより、リモート Linux コンピューターでコードをビルドしてデバッグできます。[ファイル]、[新しいプロジェクト] の順に移動し、[Visual C++] の [クロス プラットフォーム] にある [Console Application (Linux)] (コンソール アプリケーション (Linux)) を選択すると、この種類のプロジェクトの新機能について説明するヘルプ ファイルが開き、リモート Linux コンピューターをプロジェクトに追加する方法を確認できます。この説明には、Linux 用の Azure IoT ライブラリの入手方法や、Grove シールドをセットアップする際のヒントも含まれています。

生成されたファイルを最初のプロジェクトからこのプロジェクトにコピーします。ソリューションにあるプロジェクト関連の名前の付いた cpp ファイルを開き、azure_iot_hub.h への参照を追加します。次に、main のコードを更新して、デバイスから連続的にセンサー データを読み取るようにします (図 4 参照)。

図 4 Raspberry Pi を使用したセンサー データの読み取り

#include "azure_iot_hub.h"
#include <unistd.h>
#include "grovepi.h"
int main()
{
  int ldrValue;
  while(1) {
    ldrValue = analogRead(0);
    send_device_to_cloud_message(ldrValue);
    sleep(5);
  }
  return 0;
}

これで、Visual Studio 内からアプリケーションを実行できます。Visual Studio では、指定した場所にあるソースを Raspberry Pi にコピーしてビルドし、実行します。他の Visual Studio コードと同様、ブレークポイントを設定できます。コードを実行すると、シミュレーションされたデータ (例: { ldrValue: 1013 }) と一緒に、IoT Hub エクスプローラーで受信したイベントが表示されます。

この Linux サポートは Raspberry Pi に限られたものではなく、他の Linux ベースのデバイス (Intel Edison、BeagleBone など任意の Linux コンピューター) でも機能します。

Raspberry Pi 2 で Windows 10 IoT Core を使用するという選択肢もあります。作業の着手に必要な情報は、windowsondevices.com を参照してください。ツールをインストールしたら、[ファイル]、[新しいプロジェクト] の順に移動して、[Visual C++] の [Windows] の下にある [空白のアプリ (ユニバーサル Windows)] を選択します。[Windows IoT Extensions for the UWP] への参照をプロジェクトに追加します。本稿執筆時点では、UWP を使用するために追加の手順が必要です。この追加手順が必要な場合は、生成された azure_iot_hub.cpp ファイルのコメントを参照してください。MainPage.xaml.cpp のアプリケーション コードに、azure_iot_hub.h インクルード ファイルへの参照を追加します。

MainPage.xaml.h インクルード ファイルに、次のプライベート宣言を追加します。

private:
  const int readPin = 4;
  Windows::Devices::Gpio::GpioPin ^pin_;

このコードは、UWP API を使用して GPIO ピンから直接読み取る方法を表しています。C++ による Grove Pi シールドの使用に関する最新情報については aka.ms/iotmsdnb16 (英語) を参照してください。関数の定義と実装を更新して、先ほどの例のようにセンサー値を JSON オブジェクトとして渡すようにします。

次に、MainPage.xaml.cpp の MainPage の実装を次のように更新します。

MainPage::MainPage()
{
  int ldrValue;
  auto gpio = GpioController::GetDefault();
  pin_ = gpio->OpenPin(readPin);
  pinValue = (int) pin_->Read();
  send_device_to_cloud_message(ldrValue);
}

Azure IoT Hub がデバイスをリッスンしていることを確認してから、ビルドして配置します。光センサーからの値を含む JSON メッセージがストリーミング表示されます。ターゲット デバイスが Windows コンピューターなので、デバッグは想定どおりに機能します。ターゲットが Windows IoT デバイスの場合には、特別な構成は必要ありません。

Arduino: おそらく、自作プロジェクトで最も使用されることの多いボードです。Arduino は幅広い魅力を備えているため、多くのプロバイダーが自社ボードに Arduino IDE のサポートを追加しています。Arduino は、センサー メーカーの中でも、サポートのレベルが比較的高く、簡単に Arduino IDE に組み込むことができるライブラリが用意されています。ボード自体には、追加する拡張シールド (Grove ベース シールドなど) の一般的なフォーム ファクターにさまざまなデジタル/アナログ入出力を提供するための一般的なコネクターがあります。このフォーム ファクターは他の数多くのボード プロバイダーで採用されています。低電力 MCU から強力な ARM チップまで、Arduino/Genuino ボードにはさまざまな選択肢があります。また、サードパーティ製ボードの豊富なエコシステムを利用できます。オープン ソース ハードウェア プラットフォームとして、すべての概略図が利用できるため、大規模配置に使用するプラットフォームとして最適です。

しかし、すべての Arduino にネットワーク機能が組み込まれているわけではないので、ネットワーク機能のある Arduino を選ぶか、ネットワーク機能を追加する拡張シールドをデバイスで使用します。Grove ベース シールドを取り付けて、光センサーを「A0」というラベルのポートに接続します。

基本的な Arduino プロジェクトはスケッチと呼ばれ、プロジェクトを構成するフォルダーには .ino で終わる同名のファイルが含まれます。.ino ファイルは単なる C++ ファイルです。Arduino IDE を使用すると、既定の Wiring API ライブラリの多くの複雑さを意識しなくて済むようになります。オンラインには、Arduino の基本的なセットアップと使用法について説明したガイドが多数あります。参照するには、Arduino.cc (英語) または aka.ms/iotmsdnb16 (英語) にアクセスしてください。Visual Studio のすべての機能を使用し、Arduino エコシステム内で作業を完結させ、.ino 形式を使用する場合は、Visual Micro が提供する Arduino IDE のボードとライブラリの管理機能のほとんどを直接 Visual Studio に統合する拡張機能を利用できます。

.ino スケッチ形式ではなく C++ を直接使用するには、Visual C++ for IoT Development 拡張機能をインストールして、新しいプロジェクトを作成します。次に、[Visual C++] の [クロス プラットフォーム] から、[Blank Application (IoT)] (新しいアプリケーション (IoT)) プロジェクトを選択します。これで、このプロジェクトの種類の新しい機能を説明するヘルプ ファイルが開きます。プロジェクト内のボードの追加/構成方法については、この手順を参照してください。

Arduino で使用するために PlatformIO を初期化する方法や、必要な Azure IoT ライブラリをインポートする方法については、プロジェクト内の readme を参照してください。最初の演習の azure_iot_hub.h を lib フォルダーにコピーし、azure_iot_hub.cpp を src フォルダーにコピーします。

#include "azure_iot_hub.h"
int lightSensorPin = 0;
int ldrValue;
void loop()
{
  ldrValue = analogRead(lightSensorPin);
  send_device_to_cloud_message(ldrValue);
  delay(2000);
}

これで、コードをビルドしてボードに配置できます。Azure IoT Hub エクスプローラーが実行されており、ボードから送信されるメッセージを表示できることを確認します。デバッグもサポートされます。このセットアップはさまざまなので、プロジェクトに含まれるヘルプ ファイルを参照してください。

mbed: もう 1 つの優れた選択肢が ARM mbed プラットフォームです。これは、ARM ベースのマイクロコントローラー用の OS で、開発用の一般的なフレームワークを提供します。ARM mbed プラットフォームは、多くの ARM シリコン ベンダーが提供する幅広いプロトタイピング ボードによってサポートされています。これらのベンダーはいずれも、独自のカスタム設計の生産方針を持っています。大規模配置では、mbed がすばらしい開始点になります。マイクロソフトは、Freescale、Marvel、STMicro などのボードに取り組んでいます。しかし、幅広い選択肢があるため、どこから始めたらよいいかわかりづらい場合がありますが、mbed.org のすばらしいオンライン コミュニティが助けになります。mbed に関しては、Raspberry Pi や Arduino とは異なり、オンラインで見つかる自作プロジェクトはあまりありません。mbed ボードを生産する ARM ベンダーが入門ガイダンスを用意しているので、そこから始めることをお勧めします。

ここでは、Freescale Freedom K64F ボードを使用します。このボードにはイーサネットが組み込まれていて、インターネットに簡単に接続できます。このボードには、Arduino に対応するヘッダーもあるため、同じ Grove ベース シールドを使用してセンサーを接続できます。光センサーを「A0」というラベルのプラグに取り付けます。

ここでも、Raspberry Pi や Arduino と同様に、Visual Studio のマイクロコントローラー サポートを使用します。Visual C++ for IoT Development 拡張機能がインストールされていることを確認して、新しいプロジェクトを作成します。[Visual C++]、[クロス プラットフォーム]、[Blank Application (IoT)] (新しいアプリケーション (IoT)) の順に選択します。これで、このプロジェクトの種類の新しい機能を説明するヘルプ ファイルが開きます。プロジェクト内のボードの追加/構成方法については、この手順を参照してください。

このプロジェクトでは、PlatformIO をビルド ツールとして使用します。PlatformIO は、さまざまなマイクロコントローラー プラットフォームをサポートする柔軟性の高いシステムです。mbed ターゲットで使用するために PlatformIO を初期化する方法や、必要な Azure IoT ライブラリをインポートする方法については、プロジェクト内の readme を参照してください。最初の演習の azure_iot_hub.h を lib フォルダーにコピーし、azure_iot_hub.cpp を src フォルダーにコピーします。

プログラム コードを図 5 のように更新します。

図 5 MBed を使用したセンサー データの読み取り

#include "azure_iot_hub.h"
#include "mbed.h"
AnalogIn lightSensorPin(A0);
float ldrSensorValue;
int ldrValue
int main()
{  while(1) {
    ldrSensorValue = lightSensorPin.read();
    ldrValue = (int) (ldrSensorValue * 1000);
    send_device_to_cloud_message(ldrValue);
    delay(2000);
  }
}

これで、コードをビルドしてボードに配置できます。Azure IoT Hub エクスプローラーが実行されており、ボードから送信されるメッセージを表示できることを確認します。デバッグもサポートされます。このセットアップはさまざまなので、プロジェクトに含まれるヘルプ ファイルを参照してください。

Azure サービスでのセンサー データの使用

これで、デバイスから Azure にセンサー データを取り込んで、利用可能な任意の Azure サービスでそのデータを使用できようになります。ここで、可能性やデバイスの接続方法などを確認するのに、Azure IoT Suite の参照実装や Connect the Dots プロジェクトが役立ちます。

たとえば、IoT Hub を通じて提供されるリアルタイム情報を処理して、他のサービスへの入力として使用できます。ここでよくあるパターンは、異常の検出と通知です。この種類の通知を構成するには、IoT Hub を入力として受け取る Stream Analytics サービスを作成します。その後、このジョブの出力を (ストレージ BLOB または PowerBI などに) 定義して、入力からのデータを解析する (たとえば、特定のしきい値を超える値を検索する) クエリを定義します。一致するデータが、定義された出力に送信されます (図 6 参照)。

最もシンプルな Stream Analytics ジョブ
図 6 最もシンプルな Stream Analytics ジョブ

ストレージ BLOB をロジック アプリの入力に使用して、SMS 通知を送信できます。PowerBI の場合は、刻々と状況が変化する、ほぼリアルタイムのダッシュボードで使用できます。機械学習サービスにも、リアルタイム ホット パスと履歴データの分析の両方で、収集可能な膨大な量のセンサー データの価値を引き出す豊富な機会があります。これらは、そのほんの一例です。データを細かく処理したり、データのレポートに利用できるすべての Azure サービスを利用すると、IoT のニーズがわかります。

留意点が1 つあります。それは、IoT Hub は、イベント ハブが使用できる場所であればどこでも使用できることです。使おうとしているサービスに IoT Hub オプションがない場合は、イベント ハブと互換性のある名前にする必要があります。Azure ポータルの IoT Hub に移動して、[Messaging] (メッセージング) を選択します。[Device-to-cloud settings] (デバイス/クラウド設定) に、互換性のあるイベント ハブの名前とエンドポイントが表示されます。

IoT データを最大限に活用するには、必ず複数のサービスが必要です。Azure Resource Manager (ARM) テンプレートは、その複雑さを管理するのに役立ちます。ARM テンプレートは、JSON で記述されており、デプロイする Azure サービスを定義します (デプロイの順序、場所、使用する値など)。ARM テンプレートを使用すると、迅速にサービスの完全なセットをデプロイして、IoT のクラウド バック エンドを作成できます。ARM テンプレートは IoT Suite 内で使用して、特定の Azure サブスクリプションにソリューションをデプロイします。テンプレートは単純な JSON ファイルなので、バージョン管理システム内で追跡して、将来の配置 (プロトタイプから運用配置への移行など) でも利用できます。

IoT がある未来

読者の皆さんには、IoT の組み立てにおいて果たすべき役割があります。まだ、その道を歩み始めていなければ、今回の説明に関心をお持ちいただけたらさいわいです。長年 Arduino や Raspberry Pi デバイスのハッキングを行っている読者の方には、ここで紹介した新しい Visual Studio C++ の機能が役立つでしょう。C++ 開発者でない方は、これらの新しい機能によって C++ がわかりやすいと感じられると思います。

Azure IoT には、ここで紹介した以外にも多くの機能があります。ここでは、作業に着手するための基礎を説明し、それを進化させるためのガイドを示しました。ぜひ試してみてください。皆さんの作品を見られるのを楽しみにしています。

追加の資料については aka.ms/iotmsdnb16 (英語) にアクセスしてください。ぜひ、学び続けてください。


Marc Goodner は、Visual Studio チームの IoT ツールを担当するプログラム マネージャーで、マイクロソフトの Garage Maker コミュニティに積極的に参加しています。彼は、上質なシングル モルトが大好きです。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Olivier Bloch と Artur Laksberg に心より感謝いたします。