チュートリアル:シミュレートされたデバイスを使用して IoT Hub との接続をテストする
このチュートリアルでは、Azure IoT Hub ポータル ツールと Azure CLI コマンドを使用してデバイスの接続をテストします。 このチュートリアルでは、デスクトップ マシンで実行する単純なデバイス シミュレーターも使用します。
Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
このチュートリアルでは、以下の内容を学習します。
- デバイスの認証を確認する
- デバイスからクラウドへの接続を確認する
- クラウドからデバイスへの接続を確認する
- デバイス ツインの同期を確認する
前提条件
このチュートリアルでは、Azure CLI を使ってクラウド リソースを作成します。 CLI コマンドを実行する方法は 2 つあります。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、Azure Cloud Shell の Bash のクイックスタートに関するページを参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
- az login コマンドを使用して、Azure CLI にサインインします。
- 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
- az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
Note
この記事では、
azure-iot
と呼ばれる、Azure IoT 拡張機能の最新バージョンを使用します。 従来のバージョンはazure-cli-iot-ext
と呼ばれます。一度にインストールできるバージョンは 1 つだけです。 コマンドaz extension list
を使用すると、現在インストールされている拡張機能を確認できます。拡張機能の従来のバージョンを削除するには、
az extension remove --name azure-cli-iot-ext
を使用します。拡張機能の新しいバージョンを追加するには、
az extension add --name azure-iot
を使用します。インストール済みの拡張機能を表示するには、
az extension list
を使用してください。このチュートリアルで実行するサンプル アプリケーションでは、Node.js を使用します。 開発用コンピューター上に Node.js v10.x.x 以降が必要です。
複数のプラットフォームに対応する Node.js を nodejs.org からダウンロードできます。
開発コンピューターに現在インストールされている Node.js のバージョンは、次のコマンドを使って確認できます。
node --version
Node.js 用 Azure IoT サンプルからサンプル Node.js プロジェクトをクローンまたはダウンロードします。
ポート 8883 がファイアウォールで開放されていることを確認してください。 このチュートリアルのデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。
IoT Hub の作成
このセクションでは、Azure CLI を使用して IoT ハブとリソース グループを作成します。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 IoT ハブは、IoT アプリケーションとデバイスの間の双方向通信に対する中央メッセージ ハブとして機能します。
Azure サブスクリプションに IoT ハブが既にある場合は、このセクションをスキップできます。
IoT ハブとリソース グループを作成するには、次のようにします。
CLI アプリを起動します。 この記事の以降の部分で CLI コマンドを実行するには、コマンド構文をコピーして CLI アプリに貼り付け、変数の値を編集して
Enter
を押します。- Cloud Shell を使用する場合は、CLI コマンドの [Try It](試してみる) ボタンを選択すると、分割されたブラウザー ウィンドウで Cloud Shell が起動します。 また、別のブラウザー タブで Cloud Shell を開くこともできます。
- Azure CLI をローカルで使用している場合は、CLI コンソール アプリを起動し、Azure CLI にサインインします。
az extension add を実行して、azure-iot 拡張機能をインストールするか、最新バージョンにアップグレードします。
az extension add --upgrade --name azure-iot
CLI アプリで az group create コマンドを実行してリソース グループを作成します。 次のコマンドは、myResourceGroup という名前のリソース グループを eastus という場所に作成します。
Note
必要に応じて、別の場所を設定できます。 選択できる場所を確認するには、
az account list-locations
を実行します。 コマンド例を見るとわかるように、このクイックスタートでは eastus を使用しています。az group create --name MyResourceGroup --location eastus
az iot hub create コマンドを実行して、IoT ハブを作成します。 IoT ハブの作成には数分かかることがあります。
YourIotHubName: 以下のコマンドでは、このプレースホルダーとその前後の中かっこを実際の IoT ハブの名前に置き換えます。 IoT ハブ名は Azure でグローバルに一意である必要があります。 以降、このクイックスタートに出現しているプレースホルダーにはすべて、実際の IoT ハブの名前を使用してください。
az iot hub create --resource-group MyResourceGroup --name {your_iot_hub_name}
デバイスの認証を確認する
ハブとの間でデータを交換するには、デバイスがハブの認証を受ける必要があります。 ポータルの [デバイスの管理] セクションにある [IoT デバイス] ツールを使用して、デバイスを管理し、使用している認証キーを確認できます。 チュートリアルのこのセクションでは、新しいテスト デバイスを追加し、そのキーを取得し、テスト デバイスがハブに接続できることを確認します。 後で、認証キーをリセットして、デバイスが古いキーを使用しようとしたときの動作を観察します。
デバイスの登録
デバイスを IoT Hub に接続するには、あらかじめ IoT Hub に登録しておく必要があります。 このセクションでは、Azure CLI を使用してデバイス ID を作成します。
IoT ハブにデバイスが既に登録されている場合は、このセクションをスキップできます。
デバイス ID を作成するには:
CLI シェルで、az iot hub device-identity create コマンドを実行します。 このコマンドで、デバイス ID が作成されます。
"your_iot_hub_name"。 このプレースホルダーは、実際の IoT Hub に対して選んだ名前に置き換えてください。
myDevice。 この記事全体でデバイス ID にこの名前を使用することも、別のデバイス名を指定することもできます。
az iot hub device-identity create --device-id myDevice --hub-name {your_iot_hub_name}
az iot hub device-identity connection-string show コマンドを実行します。
az iot hub device-identity connection-string show --device-id myDevice --hub-name {your_iot_hub_name}
接続文字列出力は次の形式です。
HostName=<your IoT Hub name>.azure-devices.net;DeviceId=<your device id>;SharedAccessKey=<some value>
接続文字列を安全な場所に保存します。
注意
CLI アプリは開いたままにしておいてください。 これは後の手順で使用します。
テスト デバイスをシミュレートする
IoT ハブにテレメトリを送信するデバイスをシミュレートするには、前にダウンロードした Node.js のシミュレートされたデバイス アプリケーションを実行します。
開発用マシンのターミナル ウィンドウで、ダウンロードしたサンプル Node.js プロジェクトのルート フォルダーに移動します。 次に、iot-hub\Tutorials\ConnectivityTests フォルダーに移動します。
ターミナル ウィンドウで次のコマンドを実行して、必要なライブラリをインストールし、シミュレートされたデバイス アプリケーションを実行します。 デバイスを登録したときにメモしたデバイスの接続文字列を使用します。
npm install node SimulatedDevice-1.js "{your_device_connection_string}"
ターミナル ウィンドウには、ハブに接続すると成功メッセージが表示されます。
これで、IoT Hub によって生成されたデバイス キーを使用して、デバイスから正常に認証されました。
キーをリセットする
このセクションでは、デバイス キーをリセットし、シミュレートされたデバイスが接続しようとしたときのエラーを観察します。
デバイスのプライマリ デバイス キーをリセットするには、az iot hub device-identity update コマンドを実行します。
# Generate a new Base64 encoded key using the current date read key < <(date +%s | sha256sum | base64 | head -c 32) # Reset the primary device key for test device az iot hub device-identity update --device-id {your_device_id} --set authentication.symmetricKey.primaryKey=$key --hub-name {your_iot_hub_name}
開発用マシンのターミナル ウィンドウで、シミュレートされたデバイス アプリケーションをもう一度実行します。
npm install node SimulatedDevice-1.js "{your_device_connection_string}"
今回は、アプリケーションが接続しようとすると認証エラーが表示されます。
Shared Access Signature (SAS) トークンを生成する
デバイスが IoT Hub デバイス SDK のいずれかを使用している場合、SDK ライブラリ コードで、ハブの認証を受けるために使用される SAS トークンを生成します。 SAS トークンは、ハブの名前、デバイスの名前、およびデバイス キーから生成されます。
クラウド プロトコル ゲートウェイやカスタム認証スキームの一部のシナリオなど、場合によっては SAS トークンを手動で生成する必要があります。 SAS 生成コードに関する問題を解決する場合、テスト時に使用できる、問題のないことが明白な SAS トークンを生成できると便利です。
Note
SimulatedDevice-2.js のサンプルには、SDK があるバージョンとないバージョンの SAS トークンを生成する例が含まれています。
CLI を使用して az iot hub generate-sas-token コマンドを実行し、既知の適切な SAS トークンを生成します。
az iot hub generate-sas-token --device-id {your_device_id} --hub-name {your_iot_hub_name}
生成された SAS トークンの全文をコピーします。 SAS トークンは次の例のようになります。
SharedAccessSignature sr=tutorials-iot-hub.azure-devices.net%2Fdevices%2FmyDevice&sig=xxxxxx&se=111111
開発用マシンのターミナル ウィンドウで、ダウンロードしたサンプル Node.js プロジェクトのルート フォルダーに移動します。 次に、iot-hub\Tutorials\ConnectivityTests フォルダーに移動します。
ターミナル ウィンドウで次のコマンドを実行して、必要なライブラリをインストールし、シミュレートされたデバイス アプリケーションを実行します。
npm install node SimulatedDevice-2.js "{Your SAS token}"
ターミナル ウィンドウには、SAS トークンを使用してハブに接続すると成功メッセージが表示されます。
これで、CLI コマンドで生成されたテスト SAS トークンを使用して、デバイスから正常に認証されました。 SimulatedDevice-2.js ファイルには、コードで SAS トークンを生成する方法を示すサンプル コードが含まれています。
プロトコル
デバイスは、次のいずれかのプロトコルを使用して IoT Hub に接続できます。
Protocol | 送信ポート |
---|---|
MQTT | 8883 |
WebSocket 経由の MQTT | 443 |
AMQP | 5671 |
AMQP over WebSocket | 443 |
HTTPS | 443 |
送信ポートがファイアウォールによってブロックされている場合、デバイスは接続できません。
デバイスからクラウドへの接続を確認する
デバイスが接続されると、IoT ハブへのテレメトリの送信を開始できます。 このセクションでは、デバイスから送信されたテレメトリがハブに到達したことを確認する方法について説明します。
device-to-cloud メッセージを送信する
前のセクションでデバイスの接続文字列をリセットしたため、az iot hub device-identity connection-string show コマンドを使用して更新された接続文字列を取得します。
az iot hub device-identity connection-string show --device-id {your_device_id} --output table --hub-name {your_iot_hub_name}
メッセージを送信するシミュレートされたデバイスを実行するには、ダウンロードしたコードの iot-hub\Tutorials\ConnectivityTests フォルダーに移動します。
ターミナル ウィンドウで次のコマンドを実行して、必要なライブラリをインストールし、シミュレートされたデバイス アプリケーションを実行します。
npm install node SimulatedDevice-3.js "{your_device_connection_string}"
テレメトリをハブに送信すると、ターミナル ウィンドウには情報が表示されます。
受信メッセージを監視する
ポータルの [メトリック] を使用して、テレメトリ メッセージが IoT Hub に到達していることを確認できます。
Azure portal の [リソース] ドロップダウンで IoT ハブを選択します。
左側のナビゲーション メニューの [監視] セクションから [メトリック] を選択します。
メトリックとして [送信済みテレメトリ メッセージ] を選択し、時間範囲を [過去 1 時間] に設定します。 グラフには、シミュレートしたデバイスから送信されたメッセージの総数が表示されます。
シミュレートされたデバイスの起動後、メトリックが使用できるようになるまでには数分かかります。
クラウドからデバイスへの接続を確認する
このセクションでは、デバイスに対してテストのダイレクト メソッド呼び出しを実行して、クラウドからデバイスへの接続を確認する方法について説明します。 開発用マシン上でシミュレートされたデバイスを実行して、ハブからのダイレクト メソッド呼び出しをリッスンします。
ターミナル ウィンドウで、次のコマンドを使用してシミュレートされたデバイス アプリケーションを実行します。
node SimulatedDevice-3.js "{your_device_connection_string}"
別のウィンドウで、az iot hub invoke-device-method コマンドを使用して、デバイスでダイレクト メソッドを呼び出します。
az iot hub invoke-device-method --device-id {your_device_id} --method-name TestMethod --timeout 10 --method-payload '{"key":"value"}' --hub-name {your_iot_hub_name}
シミュレートされたデバイスは、ダイレクト メソッド呼び出しを受信すると、コンソールにメッセージを出力します。
シミュレートされたデバイスは、ダイレクト メソッド呼び出しを正常に受信すると、ハブに受信確認を返します。
ツインの同期を確認する
デバイスは、ツインを使用してデバイスとハブ間の状態を同期します。 このセクションでは、CLI コマンドを使用して、必要なプロパティ をデバイスに送信し、デバイスによって送信された 報告されたプロパティ を読み取ります。
このセクションで使用するシミュレートされたデバイスは、起動されるたびに報告されたプロパティをハブに送信し、受信するたびにコンソールに必要なプロパティを出力します。
ターミナル ウィンドウで、次のコマンドを使用してシミュレートされたデバイス アプリケーションを実行します。
node SimulatedDevice-3.js "{your_device_connection_string}"
別のウィンドウで、az iot hub device-twin show コマンドを実行して、ハブがデバイスから報告されたプロパティを受信したことを確認します。
az iot hub device-twin show --device-id {your_device_id} --hub-name {your_iot_hub_name}
コマンドからの出力の報告されたプロパティ セクションに devicelaststarted プロパティがあります。 このプロパティは、シミュレートされたデバイスの最終起動日時を示します。
ハブが必要なプロパティ値をデバイスに送信できることを確認するには、az iot hub device-twin update コマンドを使用します。
az iot hub device-twin update --set properties.desired='{"mydesiredproperty":"propertyvalue"}' --device-id {your_device_id} --hub-name {your_iot_hub_name}
ハブから必要なプロパティの更新を受信すると、シミュレートされたデバイスからメッセージが出力されます。
シミュレートされたデバイスは、作成時に必要なプロパティ変更を受信するだけでなく、起動時に必要なプロパティを自動的に確認します。
リソースをクリーンアップする
IoT ハブが必要でなくなった場合は、ポータルを使用して IoT ハブとリソース グループを削除します。 これを行うには、IoT ハブを含むリソース グループを選択し、[削除] をクリックします。
次のステップ
このチュートリアルでは、デバイス キーを確認し、デバイスからクラウドへの接続を確認し、クラウドからデバイスへの接続を確認し、デバイスのツイン同期を確認する方法を確認しました。 IoT Hub を監視する方法の詳細については、IoT Hub の監視方法に関する記事を参照してください。