チュートリアル:Azure Maps を使用して IoT 空間分析を実装する
IoT シナリオでは、空間と時間に生じる関連イベントをキャプチャして追跡するのが一般的です。 たとえば、フリート管理、資産追跡、モビリティ、スマート シティといったアプリケーションが考えられます。 このチュートリアルでは、Azure Maps API シリーズを使用して、使用されたレンタカーの移動を追跡するソリューションについて説明します。
このチュートリアルでは、次のことについて説明します。
- 車の追跡データをログに記録するための Azure ストレージ アカウントを作成します。
- ジオフェンスを Azure ストレージ アカウントにアップロードします。
- Azure IoT Hub でハブを作成して、デバイスを登録します。
- Azure Functions で関数を作成し、Azure Maps 空間分析に基づいてビジネス ロジックを実装します。
- Azure Event Grid 経由で Azure 関数から IoT デバイス テレメトリ イベントをサブスクライブします。
- IoT Hub のメッセージ ルーティングを使用して、テレメトリ イベントをフィルター処理します。
前提条件
Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
ヒント
サンプルのルートに移動し、緑の コード ボタンを選択し、[ZIP のダウンロード] を選択することで、rentalCarSimulation C# プロジェクト全体を 1 つの ZIP ファイルとして GitHub からダウンロードできます。
このチュートリアルでは bruno アプリケーションを使用していますが、別の API 開発環境を選択することもできます。
重要
URL の例で、{Your-Azure-Maps-Subscription-key}
を、実際の Azure Maps サブスクリプション キーに置き換えてください。
ユース ケース: レンタカーの追跡
あるレンタカー会社で、レンタカーの位置情報、移動距離、運転状態を記録する必要があるとします。 また、この会社は、車が承認された適切な地理的領域から出た場合は常にこの情報を保存したいとも考えています。
レンタカーには、テレメトリ データを IoT ハブに定期的に送信する IoT デバイスが搭載されています。 テレメトリには現在の場所が含まれ、車両のエンジンが作動中であるかどうかが示されます。 デバイスの場所スキーマは、地理空間データ用の IoT プラグ アンド プレイ スキーマに準拠しています。 レンタカーのデバイス テレメトリ スキーマは、次の JSON コードのようになります。
{
"data": {
"properties": {
"Engine": "ON"
},
"systemProperties": {
"iothub-content-type": "application/json",
"iothub-content-encoding": "utf-8",
"iothub-connection-device-id": "ContosoRentalDevice",
"iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
"iothub-connection-auth-generation-id": "636959817064335548",
"iothub-enqueuedtime": "2019-06-18T00:17:20.608Z",
"iothub-message-source": "Telemetry"
},
"body": {
"location": {
"type": "Point",
"coordinates": [ -77.025988698005662, 38.9015330523316 ]
}
}
}
}
このチュートリアルで追跡する車は 1 台のみです。 Azure サービスを設定した後、車のシミュレーターを実行するには、rentalCarSimulation C# プロジェクトをダウンロードする必要があります。 イベントから関数の実行までのプロセス全体が次の手順に要約されています。
車載デバイスにより、テレメトリ データが IoT ハブに送信されます。
車のエンジンが動作している場合、ハブはテレメトリ データを Event Grid に発行します。
Azure 関数が、デバイス テレメトリ イベントに対するイベント サブスクリプションによってトリガーされます。
この関数は、車載デバイスの位置座標、イベント時刻、デバイス ID をログに記録します。 次に、Spatial Geofence Get API を使用して、車がジオフェンスの外側に移動したかどうかを判断します。 ジオフェンス境界の外側で走行した場合、この関数により、イベントから受信した位置データが BLOB コンテナーに格納されます。 また、関数によって住所の逆引き検索に対してクエリが実行されて、座標位置が住所に変換され、残りのデバイス位置データと共に格納されます。
次の図は、このシステムの概要を示したものです。
次の図では、ジオフェンス領域が青で強調表示されています。 レンタカーのルートは、緑色の線で示されています。
Azure のストレージ アカウントの作成
車の違反の追跡データを格納するために、リソース グループに汎用 v2 ストレージ アカウントを作成します。 リソース グループを作成していない場合は、リソース グループの作成に関するセクションの指示に従ってください。 リソース グループにContosoRental という名前を付けます。
ストレージ アカウントを作成するには、「ストレージ アカウントの作成」の手順に従います。 このチュートリアルでは、ストレージ アカウントの名前を contosorentalstorage としていますが、通常は好きな名前を付けることができます。
ストレージ アカウントを正常に作成したら、ログ データを格納するコンテナーを作成する必要があります。
新しく作成したストレージ アカウントに移動します。 [要点] セクションの [コンテナー] リンクをクリックします。
左上隅の [+ Container](+ コンテナー) を選択します。 ブラウザーの右側にパネルが表示されます。 コンテナーに contoso-rental-logs という名前を付け、 [作成] を選択します。
自分のストレージ アカウントの [アクセス キー] ペインに移動し、ストレージ アカウント名と [key1] セクションの [キー] の値をコピーします。 「関数を作成して Event Grid サブスクリプションを追加する」方法に関するセクションで、両方の値が必要になります。
ジオフェンスを Azure ストレージ アカウントにアップロードする
ジオフェンスにより、レンタカーの承認された地理的領域が定義されます。 Azure 関数でジオフェンスを使用して、車がジオフェンス領域の外に移動したかどうかを判断します。
「データ レジストリの作成方法」に記載されている手順に従って、ジオフェンス JSON データ ファイルを Azure ストレージ アカウントにアップロードし、Azure Maps アカウントに登録します。 一意識別子 (udid
) の値は必要になるため、必ずメモしておいてください。 udid
は、ソース コードから Azure ストレージ アカウントにアップロードしたジオフェンスを参照する方法です。 ジオフェンス データファイルの詳細については、「GeoJSON データのジオフェンシング」を参照してください。
IoT ハブを作成する
IoT ハブを使用すると、IoT アプリケーションとそれが管理するデバイスの間で、セキュリティで保護された信頼性の高い双方向通信を実現できます。 このチュートリアルでは、車載デバイスから情報を取得して、レンタカーの位置を特定する必要があります。 このセクションでは、ContosoRental リソース グループ内に IoT ハブを作成します。 このハブは、デバイス テレメトリ イベントを発行する役割を担います。
ContosoRental リソース グループに IoT ハブを作成するには、IoT ハブの作成に関するセクションの手順に従います。
IoT ハブにデバイスを登録する
デバイスは、IoT ハブ ID レジストリに登録されていない限り、IoT ハブに接続できません。 InVehicleDevice という名前のデバイスを 1 つ作成します。 IoT ハブ内にデバイスを作成して登録するには、「IoT ハブに新しいデバイスを登録する」の手順に従います。 デバイスのプライマリ接続文字列を必ずコピーしてください。 この情報は後で必要になります。
関数を作成して Event Grid サブスクリプションを追加する
Azure Functions はサーバーレス コンピューティング サービスです。これを使用すると、コンピューティング インフラストラクチャの明示的なプロビジョニングや管理を行うことなく、小規模なコード ("関数") を実行できます。 詳細については、Azure Functions に関するページをご覧ください。
関数は、特定のイベントによってトリガーされます。 Event Grid トリガーによってトリガーされる関数を作成します。 IoT ハブのデバイス テレメトリ イベント用のイベント サブスクリプションを作成して、トリガーと関数の間の関係を作成します。 デバイス テレメトリ イベントが発生すると、関数はエンドポイントとして呼び出され、前に IoT ハブに登録したデバイスの関連データを受け取ります。
関数に含める C# スクリプト コードをご確認ください。
次に、Azure 関数を設定します。
Azure portal のダッシュボードで、 [リソースの作成] を選択します。 検索テキスト ボックスに「関数アプリ」と入力します。 [関数アプリ]>[作成] を選択します。
[関数アプリ] 作成ページで、関数アプリに名前を付けます。 [リソース グループ] のドロップダウン リストから [ContosoRental] を選択します。 [ランタイム スタック] として [.NET] を選択します。 ページの下部にある [次へ: ストレージ >] を選択します。
[ストレージ アカウント] で、「Azure のストレージ アカウントの作成」で作成したストレージ アカウントを選択します。 [Review + create](レビュー + 作成) を選択します。
関数アプリの詳細を確認し、 [作成] を選択します。
アプリが作成されたら、それに関数を追加します。 Function App に移動します。 [Azure portal で作成する] ボタンを選択します。
重要
Azure Event Hub トリガーと Azure Event Grid トリガーのテンプレートには似た名前が付いています。 Azure Event Grid トリガー テンプレートを選択していることを確認します。
[関数の作成] パネルが表示されます。 [テンプレートの選択] パネルを下にスクロールし、[Azure Event Grid トリガー] を選択し、[作成] ボタンを選択します。
関数に名前を付けます。 このチュートリアルでは、GetGeoFunction という名前を使用しますが、通常はお好きな名前を使用できます。 [関数の作成] を選択します。
左側のメニューで、 [コードとテスト] ペインを選択します。 C# スクリプトをコピーし、コード ウィンドウに貼り付けます。
C# コード内で、次のパラメーターを置き換えます。
- SUBSCRIPTION_KEY を、自分の Azure Maps アカウントのサブスクリプション キーに置き換えます。
- UDID を、「ジオフェンスを Azure ストレージ アカウントにアップロードする」でアップロードしたジオフェンスの
udid
に置き換えます。 - スクリプト内の
CreateBlobAsync
関数では、データ ストレージ アカウントでイベントごとに BLOB を作成します。 ACCESS_KEY、ACCOUNT_NAME、STORAGE_CONTAINER_NAME を、自分のストレージ アカウントのアクセス キー、アカウント名、データ ストレージ コンテナーに置き換えます。 これらの値は、「Azure のストレージ アカウントの作成」でストレージ アカウントを作成したときに生成されました。
左側のメニューで、 [統合] ペインを選択します。 ダイアグラムの [Event Grid Trigger](Event Grid トリガー) を選択します。 トリガーの名前 eventGridEvent を入力し、 [Event Grid サブスクリプションの作成] を選択します。
サブスクリプションの詳細を入力します。 イベント サブスクリプションに名前を付けます。 [イベント スキーマ] で [Event Grid Schema](Event Grid スキーマ) を選択します。 [トピックの種類] で、 [Azure IoT Hub Accounts](Azure IoT Hub アカウント) を選択します。 [リソース グループ] で、このチュートリアルの冒頭で作成したリソース グループを選択します。 「IoT ハブを作成する」で作成した IoT ハブを [リソース] で選択します。[イベントの種類のフィルター] で、[Device Telemetry](デバイス テレメトリ) を選択します。
これらのオプションを選択すると、 [トピックの種類] が [IoT Hub] に変更されたことがわかります。 [System Topic Name](システム トピック名) には、リソースと同じ名前を使用できます。 最後に、 [エンドポイントの詳細] セクションで [エンドポイントの選択] を選択します。 すべての設定を受け入れ、 [選択の確認] を選択します。
設定を確認します。 このセクションの冒頭で作成した関数がエンドポイントで指定されていることを確認します。 [作成] を選択します
ここで、 [トリガーの編集] パネルに戻ります。 [保存] を選択します。
IoT ハブのメッセージ ルーティングを使用してイベントをフィルター処理する
Azure 関数に Event Grid サブスクリプションを追加すると、指定された IoT ハブにメッセージング ルートが自動的に作成されます。 メッセージ ルーティングを使用すると、各種データ型をさまざまなエンドポイントにルーティングできます。 たとえば、デバイス テレメトリのメッセージ、デバイスのライフサイクル イベント、デバイス ツインの変更イベントをルーティングできます。 詳細については、IoT ハブのメッセージ ルーティングの使用に関するページをご覧ください。
このシナリオ例では、レンタカーの移動中にのみメッセージを受信する必要があります。 Engine
プロパティが "ON" になっているイベントをフィルター処理するルーティング クエリを作成します。 ルーティング クエリを作成するには、RouteToEventGrid ルートをクリックし、 [ルーティング クエリ] の値を "Engine='ON'" で置き換えます。 次に、 [保存] を選択します。 これで、IoT ハブにより、エンジンがオンになっているデバイス テレメトリのみが発行されます。
ヒント
IoT device-to-cloud メッセージを照会するさまざまな方法があります。 メッセージ ルーティング構文の詳細については、IoT Hub のメッセージ ルーティングに関するページを参照してください。
テレメトリ データを IoT Hub に送信する
Azure 関数が実行されると、テレメトリ データを IoT ハブに送信して、そのデータが Event Grid にルーティングされるようになりました。 C# アプリケーションを使用して、レンタカーの車載デバイスの位置情報データをシミュレートします。 アプリケーションを実行するには、自分の開発用コンピューター上に .NET SDK 6.0 が必要です。 以下の手順に従って、シミュレートされたテレメトリ データを IoT ハブに送信します。
まだ行っていない場合は、C# プロジェクト rentalCarSimulation をダウンロードします。
任意のテキスト エディターで
simulatedCar.cs
ファイルを開き、connectionString
の値を、デバイスを登録したときに保存したもので置き換えます。 変更をファイルに保存します。マシンに ASP.NET Core Runtime がインストールされていることを確認します。 ローカル ターミナル ウィンドウで、C# プロジェクトのルート フォルダーに移動し、次のコマンドを実行して、シミュレートされたデバイス アプリケーションに必要なパッケージをインストールします。
dotnet restore
同じターミナルで次のコマンドを実行して、レンタカー シミュレーション アプリケーションをビルドして実行します。
dotnet run
ローカル ターミナルは次のスクリーンショットのようになります。
ここで BLOB ストレージ コンテナーを開くと、車がジオフェンスの外側にあった位置の BLOB を 4 つ表示できます。
以下のマップには、ジオフェンス外の車の位置が 4 か所示されています。 各位置は定期的にログされました。
Azure Maps と IoT について調べる
このチュートリアルで使用した Azure Maps API シリーズの詳細については、以下を参照してください。
Azure Maps REST API シリーズの完全な一覧については、次を参照してください。
Azure で IoT の認定を受けたデバイスの一覧を取得するには、次のページにアクセスします。
リソースをクリーンアップする
クリーンアップが必要なリソースはありません。
次の手順
device-to-cloud、およびその逆方向にテレメトリを送信する方法については、次を参照してください。