リモート監視ソリューション アクセラレータを使用すると、独自のシミュレートされたデバイスを定義できます。 この記事では、新しいシミュレートされた電球デバイスを定義し、ローカルでテストする方法について説明します。 ソリューション アクセラレータには、冷却装置やトラックなどのシミュレートされたデバイスが含まれています。 ただし、実際のデバイスをデプロイする前に、独自のシミュレートされたデバイスを定義して IoT ソリューションをテストできます。
注
この記事では、デバイス シミュレーション サービスでホストされているシミュレートされたデバイスを使用する方法について説明します。 実際のデバイスを作成する場合は、「デバイスをリモート監視ソリューション アクセラレータに接続する」を参照してください。
このハウツー ガイドでは、デバイス シミュレーション マイクロサービスをカスタマイズする方法について説明します。 このマイクロサービスは、リモート監視ソリューション アクセラレータの一部です。 デバイス シミュレーション機能を示すために、このハウツー ガイドでは Contoso IoT アプリケーションで次の 2 つのシナリオを使用します。
最初のシナリオでは、Contoso の既存の Chiller デバイスの種類に新しいテレメトリの種類を追加します。
2 番目のシナリオでは、Contoso は新しいスマート 電球デバイスをテストしたいと考えています。 テストを実行するには、次の特性を持つ新しいシミュレートされたデバイスを作成します。
プロパティ
| 名前 | 価値観 |
|---|---|
| 色 | 白、赤、青 |
| 明るさ | 0 ~ 100 |
| 推定残存寿命 | 10,000 時間からのカウントダウン |
テレメトリ
次の表は、電球がデータ ストリームとしてクラウドに報告するデータを示しています。
| 名前 | 価値観 |
|---|---|
| ステータス | オン、オフ |
| 温度 | 華氏度 |
| オンライン | 真、偽 |
注
オンライン テレメトリの値は、すべてのシミュレーションタイプに必要です。
メソッド
次の表に、新しいデバイスでサポートされるアクションを示します。
| 名前 |
|---|
| オンにする |
| スイッチを切る |
初期状態
次の表に、デバイスの初期状態を示します。
| 名前 | 価値観 |
|---|---|
| 初期色 | 白い |
| 初期明るさ | 75 |
| 初期残存時間 | 一万 |
| 初期テレメトリの状態 | オン |
| 初期テレメトリ温度 | 200 |
このハウツー ガイドの手順を完了するには、アクティブな Azure サブスクリプションが必要です。
Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
Azure Cloud Shell
Azure は、ブラウザーから使用できる対話型シェル環境である Azure Cloud Shell をホストします。 Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。 Cloud Shell にプレインストールされているコマンドを使用すると、ローカル環境に何もインストールしなくても、この記事のコードを実行できます。
Azure Cloud Shell を起動するには:
| 選択肢 | 例/リンク |
|---|---|
| コードまたはコマンド ブロックの右上隅にある[試してみる] を選択します。 [試してみる] を選択しても、コードまたはコマンドは Cloud Shell に自動的にコピーされません。 |
|
|
|
| Azure portalの右上にあるメニュー バーにある Cloud Shell ボタンを選択します。 |
の [Cloud Shell] ボタンを示すスクリーンショット |
Azure Cloud Shell を使用するには:
Cloud Shell を起動します。
コード ブロック (またはコマンド ブロック) の [ コピー] ボタンを選択して、コードまたはコマンドをコピーします。
Windows および Linux では Ctrl+Shift+V を選択し、macOS では Cmd+Shift+V を選択して、コードまたはコマンドをクラウドシェルセッションに貼り付けます。
「を選択し、 を入力してコードまたはコマンドを実行します。」
前提条件
このハウツー ガイドに従うには、次のものが必要です。
- Visual Studio Code。 Mac、Linux、Windows用のVisual Studio Codeをダウンロードできます。
- .NET Core。 あなたは .NET Core を Mac、Linux、Windows にダウンロードできます。
- Visual Studio Code の C#
- 郵便配達人。 Mac、Windows、または Linux 用の Postmanダウンロードできます。
- Azure サブスクリプション にデプロイされたIoT ハブ。 このガイドの手順を完了するには、IoT ハブの接続文字列が必要です。 接続文字列は、Azure portal から取得できます。
- SQL API を使用し、強力な整合性で構成された Cosmos DB データベース。 このガイドの手順を完了するには、Cosmos DB データベースの接続文字列が必要です。 接続文字列は、Azure portal から取得できます。
開発環境を準備する
開発環境を準備するには、次のタスクを実行します。
- デバイス シミュレーション マイクロサービスのソースをダウンロードします。
- ストレージ アダプター マイクロサービスのソースをダウンロードします。
- ストレージ アダプター マイクロサービスをローカルで実行します。
この記事の手順では、Windows を使用していることを前提としています。 別のオペレーティング システムを使用している場合は、環境に合わせて一部のファイル パスとコマンドを調整する必要がある場合があります。
マイクロサービスをダウンロードする
GitHub から リモート監視マイクロサービスをローカル コンピューター上の適切な場所にダウンロードして解凍します。 この記事では、このフォルダーの名前が remote-monitoring-services-dotnet-master されていることを前提としています。
GitHub から デバイス シミュレーション マイクロサービスをローカル コンピューター上の適切な場所にダウンロードして解凍します。 この記事では、このフォルダーの名前が device-simulation-dotnet-master されていることを前提としています。
ストレージ アダプター マイクロサービスを実行する
Visual Studio Code で remote-monitoring-services-dotnet-master\storage-adapter フォルダーを開きます。 [復元] ボタンをクリックして、未解決の依存関係を修正します。
storage-adapter/WebService/appsettings.ini ファイルを開き、cosmos DB 接続文字列を documentDBConnectionString 変数に割り当てます。
マイクロサービスをローカルで実行するには、[デバッグ] > [デバッグの開始] クリックします。
Visual Studio Code の ターミナル ウィンドウには、実行中のマイクロサービスからの出力 (Web サービス正常性チェックの URL を含む) が表示 http://127.0.0.1:9022/v1/status。 このアドレスに移動すると、状態は "OK: Alive and well" になります。
次の手順を完了する間は、Visual Studio Code のこのインスタンスでストレージ アダプター マイクロサービスを実行したままにします。
冷却装置を変更する
このセクションでは、既存の Chiller デバイスの種類に新しい 内部温度 テレメトリの種類を追加します。
ローカル コンピューターに新しいフォルダー C:\temp\devicemodels を作成してください。
デバイス シミュレーション マイクロサービスのダウンロードしたコピーから、次のファイルを新しいフォルダーにコピーします。
情報源 行き先 サービス\data\devicemodels\chiller-01.js C:\temp\devicemodels\chiller-01.json サービス\data\devicemodels\scripts\chiller-01-state.js C:\temp\devicemodels\scripts\chiller-01-state.js サービス\data\devicemodels\scripts\Reboot-method.js C:\temp\devicemodels\scripts\Reboot-method.js サービス\data\devicemodels\scripts\FirmwareUpdate-method.js C:\temp\devicemodels\scripts\FirmwareUpdate-method.js サービス\data\devicemodels\scripts\EmergencyValveRelease-method.js C:\temp\devicemodels\scripts\EmergencyValveRelease-method.js サービス\data\devicemodels\scripts\IncreasePressure-method.js C:\temp\devicemodels\scripts\IncreasePressure-method.js ファイルのC:\temp\devicemodels\chiller-01.jsを開いてください。
InitialState セクションで、次の 2 つの定義を追加します。
"internal_temperature": 65.0, "internal_temperature_unit": "F",Telemetry 配列に、次の定義を追加します。
{ "Interval": "00:00:05", "MessageTemplate": "{\"internal_temperature\":${internal_temperature},\"internal_temperature_unit\":\"${internal_temperature_unit}\"}", "MessageSchema": { "Name": "chiller-internal-temperature;v1", "Format": "JSON", "Fields": { "temperature": "double", "temperature_unit": "text" } } },ファイルにC:\temp\devicemodels\chiller-01.jsを保存します。
C:\temp\devicemodels\scripts\chiller-01-state.js ファイルを開きます。
次のフィールドをの状態の変数に追加します。
internal_temperature: 65.0, internal_temperature_unit: "F",main 関数を次のように更新します。
function main(context, previousState, previousProperties) { // Restore the global state before generating the new telemetry, so that // the telemetry can apply changes using the previous function state. restoreSimulation(previousState, previousProperties); // 75F +/- 5%, Min 25F, Max 100F state.temperature = vary(75, 5, 25, 100); // 70% +/- 5%, Min 2%, Max 99% state.humidity = vary(70, 5, 2, 99); // 65F +/- 2%, Min 15F, Max 125F state.internal_temperature = vary(65, 2, 15, 125); log("Simulation state: " + state.simulation_state); if (state.simulation_state === "high_pressure") { // 250 psig +/- 25%, Min 50 psig, Max 300 psig state.pressure = vary(250, 25, 50, 300); } else { // 150 psig +/- 10%, Min 50 psig, Max 300 psig state.pressure = vary(150, 10, 50, 300); } updateState(state); return state; }C:\temp\devicemodels\scripts\chiller-01-state.js ファイルを保存します。
電球を作成する
このセクションでは、新しい Lightbulb デバイスの種類を定義します。
にファイルC:\temp\devicemodels\lightbulb-01.jsを作成し、次の内容を追加します。
{ "SchemaVersion": "1.0.0", "Id": "lightbulb-01", "Version": "0.0.1", "Name": "Lightbulb", "Description": "Smart lightbulb device.", "Protocol": "MQTT", "Simulation": { "InitialState": { "online": true, "temperature": 200.0, "temperature_unit": "F", "status": "on" }, "Interval": "00:00:20", "Scripts": [ { "Type": "javascript", "Path": "lightbulb-01-state.js" } ] }, "Properties": { "Type": "Lightbulb", "Color": "White", "Brightness": 75, "EstimatedRemainingLife": 10000 }, "Tags": { "Location": "Building 2", "Floor": "2", "Campus": "Redmond" }, "Telemetry": [ { "Interval": "00:00:20", "MessageTemplate": "{\"temperature\":${temperature},\"temperature_unit\":\"${temperature_unit}\",\"status\":\"${status}\"}", "MessageSchema": { "Name": "lightbulb-status;v1", "Format": "JSON", "Fields": { "temperature": "double", "temperature_unit": "text", "status": "text" } } } ], "CloudToDeviceMethods": { "SwitchOn": { "Type": "javascript", "Path": "SwitchOn-method.js" }, "SwitchOff": { "Type": "javascript", "Path": "SwitchOff-method.js" } } }にC:\temp\devicemodels\lightbulb-01.jsへの変更を保存します。
ファイル C:\temp\devicemodels\scripts\lightbulb-01-state.js を作成し、次の内容を追加します。
"use strict"; // Default state var state = { online: true, temperature: 200.0, temperature_unit: "F", status: "on" }; // Default device properties var properties = {}; /** * Restore the global state using data from the previous iteration. * * @param previousState device state from the previous iteration * @param previousProperties device properties from the previous iteration */ function restoreSimulation(previousState, previousProperties) { // If the previous state is null, force a default state if (previousState) { state = previousState; } else { log("Using default state"); } if (previousProperties) { properties = previousProperties; } else { log("Using default properties"); } } /** * Simple formula generating a random value around the average * in between min and max * * @returns random value with given parameters */ function vary(avg, percentage, min, max) { var value = avg * (1 + ((percentage / 100) * (2 * Math.random() - 1))); value = Math.max(value, min); value = Math.min(value, max); return value; } /** * Simple formula that sometimes flips the status of the lightbulb */ function flip(value) { if (Math.random() < 0.2) { return (value == "on") ? "off" : "on" } return value; } /** * Entry point function called by the simulation engine. * Returns updated simulation state. * Device property updates must call updateProperties() to persist. * * @param context The context contains current time, device model and id * @param previousState The device state since the last iteration * @param previousProperties The device properties since the last iteration */ function main(context, previousState, previousProperties) { // Restore the global device properties and the global state before // generating the new telemetry, so that the telemetry can apply changes // using the previous function state. restoreSimulation(previousState, previousProperties); state.temperature = vary(200, 5, 150, 250); // Make this flip every so often state.status = flip(state.status); updateState(state); return state; }変更を C:\temp\devicemodels\scripts\lightbulb-01-state.jsに保存します。
ファイル C:\temp\devicemodels\scripts\SwitchOn-method.js を作成し、次の内容を追加します。
"use strict"; // Default state var state = { status: "on" }; /** * Entry point function called by the method. * * @param context The context contains current time, device model and id * @param previousState The device state since the last iteration * @param previousProperties The device properties since the last iteration */ function main(context, previousState) { log("Executing lightbulb Switch On method."); state.status = "on"; updateState(state); }変更を C:\temp\devicemodels\scripts\SwitchOn-method.jsに保存します。
ファイル C:\temp\devicemodels\scripts\SwitchOff-method.js を作成し、次の内容を追加します。
"use strict"; // Default state var state = { status: "on" }; /** * Entry point function called by the method. * * @param context The context contains current time, device model and id * @param previousState The device state since the last iteration * @param previousProperties The device properties since the last iteration */ function main(context, previousState) { log("Executing lightbulb Switch Off method."); state.status = "off"; updateState(state); }変更を C:\temp\devicemodels\scripts\SwitchOff-method.jsに保存します。
これで、Chiller デバイスの種類のカスタマイズされたバージョンを作成し、新しい Lightbulb デバイスの種類を作成しました。
デバイスをテストする
このセクションでは、前のセクションで作成したデバイスの種類をローカルでテストします。
デバイス シミュレーション マイクロサービスを実行する
Visual Studio Code の新しいインスタンスで GitHub からダウンロードした device-simulation-dotnet-master フォルダーを開きます。 [復元] ボタンをクリックして、未解決の依存関係を修正します。
WebService/appsettings.ini ファイルを開き、Cosmos DB 接続文字列を documentdb_connstring 変数に割り当て、次のように設定を変更します。
device_models_folder = C:\temp\devicemodels\
device_models_scripts_folder = C:\temp\devicemodels\scripts\
マイクロサービスをローカルで実行するには、[デバッグ] > [デバッグの開始] クリックします。
Visual Studio Code の ターミナル ウィンドウには、実行中のマイクロサービスからの出力が表示されます。
次の手順を完了する間は、Visual Studio Code のこのインスタンスでデバイス シミュレーション マイクロサービスを実行したままにします。
デバイス イベントのモニターを設定する
このセクションでは、Azure CLI を使用してイベント モニターを設定し、IoT ハブに接続されているデバイスから送信されたテレメトリを表示します。
次のスクリプトは、IoT ハブの名前が device-simulation-testであることを前提としています。
# Install the IoT extension if it's not already installed
az extension add --name azure-iot
# Monitor telemetry sent to your hub
az iot hub monitor-events --hub-name device-simulation-test
シミュレートされたデバイスのテスト中は、イベント モニターを実行したままにします。
更新された冷却装置デバイスの種類を使用してシミュレーションを作成する
このセクションでは、Postman ツールを使用して、更新された冷却装置デバイスの種類を使用してシミュレーションを実行するようにデバイス シミュレーション マイクロサービスに要求します。 Postman は、REST 要求を Web サービスに送信できるツールです。 必要な Postman 構成ファイルは、device-simulation-dotnet リポジトリのローカル コピーにあります。
Postman を設定するには:
ローカル コンピューターで Postman を開きます。
ファイル インポート >をクリックします。 次に、ファイルを選択をクリックします。
device-simulation-dotnet-master/docs/postman フォルダーにアクセスします。 Azure IoT デバイス シミュレーション ソリューションアクセラレーターの accelerator.postman_collection と accelerator.postman_environment を選択し、[開く]をクリックします。
送信できる要求を増やすために、Azure IoT デバイス シミュレーション ソリューション アクセラレータ を展開します。
「環境を選択しない」をクリックし、「Azure IoT デバイス シミュレーション ソリューション アクセラレータ」を選択します。
これで、デバイス シミュレーション マイクロサービスとの対話に使用できるコレクションと環境が Postman ワークスペースに読み込まれました。
シミュレーションを構成して実行するには:
Postman コレクションで、[変更された冷却装置シミュレーション 作成] を選択し、[を送信] をクリックします。 この要求により、シミュレートされた冷却装置デバイスの種類の 4 つのインスタンスが作成されます。
Azure CLI ウィンドウのイベント モニターの出力には、新しい internal_temperature 値を含む、シミュレートされたデバイスからのテレメトリが表示されます。
シミュレーションを停止するには、Postman で シミュレーション停止 要求を選択し、「送信」をクリックします。
電球デバイスの種類を使用してシミュレーションを作成する
このセクションでは、Postman ツールを使用して、lightbulb デバイスの種類を使用してシミュレーションを実行するようにデバイス シミュレーション マイクロサービスに要求します。 Postman は、REST 要求を Web サービスに送信できるツールです。
シミュレーションを構成して実行するには:
Postman コレクションで、[電球シミュレーション 作成] を選択し、[送信] をクリックします。 この要求により、シミュレートされた電球デバイスの種類の 2 つのインスタンスが作成されます。
Azure CLI ウィンドウのイベント モニターの出力には、シミュレートされた電球からのテレメトリが表示されます。
シミュレーションを停止するには、Postman で シミュレーション停止 要求を選択し、「送信」をクリックします。
リソースをクリーンアップする
Visual Studio Code インスタンスでローカルに実行されている 2 つのマイクロサービスを停止できます ([デバッグ] > [デバッグの停止]を)。
IoT Hub インスタンスと Cosmos DB インスタンスが不要になった場合は、不要な料金が発生しないように、Azure サブスクリプションから削除します。
次のステップ
このガイドでは、カスタムのシミュレートされたデバイスの種類を作成し、デバイス シミュレーション マイクロサービスをローカルで実行してテストする方法について説明しました。
推奨される次の手順は、カスタムのシミュレートされたデバイスの種類を リモート監視ソリューション アクセラレータにデプロイする方法を学習することです。
の [Cloud Shell] ボタンを示すスクリーンショット