Skip to content

MS_AzureIoTHubTutorial

nishi_74322014 edited this page Sep 1, 2026 · 1 revision

Azure IoT Hubチュートリアル

概要

補足(Device / Service Endpoint): Azure IoT Hub
デバイス側とバックエンド側の双方に別々のエンドポイントを持つ中継役である。
デバイスは Device Endpoint に繋いでテレメトリを送り(D2C)、
バックエンドは Service Endpoint からそれを読む。
逆向き(C2D、ダイレクト メソッド)も同じ 2 つのエンドポイントを通る。
本ページはその両側にひととおり繋いでみる構成になっている。

詳細

契約

Azureの契約

AzureのPoC環境を契約する

IoT Hubの契約

Free レベルを選択できるらしい。

構築

パラメタは以下の感じで。

  • リソース・グループ:HmsRG
  • Region:westus2
  • IoT Hub 名:OsscJpDevInfra
  • DPS 名:OsscJpDevInfra
  • スケーリング レベルとユニット:F1(Free レベル)

補足(DPS とは): DPS(Device Provisioning Service)は、
デバイスを IoT Hub に自動で登録・割り当てするサービスである。
1 台ずつ接続文字列を焼き込む代わりに、
出荷時に共通の資格情報だけ持たせておき、
初回接続時に DPS が「どの IoT Hub に属すか」を決めて登録する。
台数が多い量産デバイスで効いてくる。

ポータルでの構築

  • IoT Hub

    • サービス > IoT Hub に移動

    • [IoT ハブ作成] ボタンを押下

    • 上記のパラメタを設定

    • [確認および作成] → [作成] ボタンを押下。

    • デプロイが完了したら [リソースに移動] ボタンを押下。

    • IoT Hub への接続文字列
      IoT Hub の共有アクセス ポリシーの
      iothubowner のプライマリ接続文字列から取得。

  • DPS
    ...

移行メモ(未記述): ポータルでの DPS の作成手順は
「...」のみで書かれていなかった。
シェルでの手順は次節にある。
著者による本文が加筆された場合は置き換えること。

補足(iothubowner は強すぎる): iothubowner
すべての権限を持つ共有アクセス ポリシーである。
チュートリアルでは手軽さのために使うが、実運用では
用途ごとに権限を絞ったポリシー(service / registryRead など)か、
Microsoft Entra ID による認証を使う。

シェルでの構築

  • リソース・グループ
az group create --name HmsRG --location westus2
  • エクステンションの追加
az extension add --name azure-iot
  • IoT Hub

    • IoT Hub の作成

      az iot hub create --resource-group HmsRG --name OsscJpDevInfra
    • IoT Hub への接続文字列
      を以下のコマンドから取得

      az iot hub connection-string show --hub-name OsscJpDevInfra
  • DPS(必要に応じて)

    • DPS の作成

      az iot dps create --resource-group HmsRG --name OsscJpDevInfra
    • リンクする。

      hubConnectionString=$(az iot hub connection-string show -n OsscJpDevInfra --key primary --query connectionString -o tsv)
      echo $hubConnectionString
      az iot dps linked-hub create \
        --dps-name OsscJpDevInfra --resource-group HmsRG --location westus2 \
        --connection-string $hubConnectionString
    • DPS 構成の "ID スコープ" をメモしておく。

      az iot dps show --name OsscJpDevInfra --query properties.idScope

Azure IoT Explorer

Azure IoT Explorer のインストール

Azure IoT Explorer の初期化

  • 起動して [Add connection] する。

  • 接続文字列の入力欄にIoT Hub への接続文字列を貼り付けて [Save] ボタンを押下する。

パブリック モデル リポジトリ追加

(パブリック モデル リポジトリとは?)

  • ホーム ビューで、 [IoT プラグ アンド プレイの設定] を選択。
  • [+ 追加] を選択して [パブリック リポジトリ] を選択。
  • パブリック モデル リポジトリのエントリが表示される。
  • [保存] を選択。

補足(パブリック モデル リポジトリとは): 著者の疑問に答えると、
これは IoT Plug and Play のデバイス モデル(DTDL)を公開している
共有リポジトリ
である(devicemodels.azure.com)。
デバイスが接続時に「自分はこのモデル ID です」と申告すると、
ツール側がこのリポジトリからモデル定義を取得し、
そのデバイスがどんなテレメトリ・プロパティ・コマンドを持つかを
自動的に画面に表示できる
ようになる。
後述の「IoT Plug and Play デバイス」のサンプルで使われる仕組み。

準備

デバイスの追加

ポータルからデバイスを追加

  • デバイス管理 > デバイス > デバイスの追加と進み

    • 以下の値を入力

      • デバイスの作成で以下を入力する。
      • デバイス ID:mydevice1
      • 認証の種類:対称キー、自動生成キー[✔]
      • このデバイスを IoT ハブに接続する:有効化
    • [保存] ボタンを押下し
      デバイスを追加する。

  • 追加したデバイスのページに移動し、

    • デバイスから IoT Hub への接続文字列を取得しておく。

シェルからデバイスを追加

  • 通常のデバイス

    • デバイス ID の生成

      az iot hub device-identity create -d mydevice1 -n OsscJpDevInfra
    • デバイスから IoT Hub への接続文字列

      az iot hub device-identity connection-string show --hub-name OsscJpDevInfra --device-id mydevice1 --output table
  • DPS デバイス

    • 生成
      事前に、デバイス ID : my-pnp-device1 を生成しておく。

    • 登録
      登録して enrollment-id と symmetric キーをメモしておく。

      az iot dps enrollment create \
        --attestation-type symmetrickey \
        --dps-name OsscJpDevInfra --resource-group HmsRG \
        --enrollment-id my-pnp-device1 --device-id my-pnp-device1 \
        --query '{registrationID:registrationId,primaryKey:attestation.symmetricKey.primaryKey}'
    • 削除

      az iot dps enrollment delete -n OsscJpDevInfra --eid my-pnp-device1

Azure IoT Explorer からデバイスを追加

  • ホーム ビューで、 [IoT Hub] を選択。
  • 接続が表示され接続プロパティの下の [View devices in this hub] を選択。
  • [+ 新規] を選択し、デバイス ID:mydevice1 を入力し [作成] を選択。
  • [プライマリ接続文字列] フィールドからデバイスから IoT Hub への接続文字列をコピー。

デバイスの監視

ポータルでの監視

移行メモ(未記述): 元ページは本節が見出しのみで本文が書かれていなかった。
ポータルでは、IoT Hub のリソース画面の
[監視] > [メトリック] や [デバイス管理] > [デバイス] から確認する
(テレメトリの中身をリアルタイムに見るには、次節のシェルか
Azure IoT Explorer を使う)。
著者による本文が加筆された場合は置き換えること。

シェルでの監視

Azure Cloud Shellの別セッション(≒ 別タブ)で実行

az iot hub monitor-events --output table -p all -n OsscJpDevInfra

Azure IoT Explorer での監視

追加したデバイスのテレメトリを受信

  • デバイスを選択し、
  • テレメトリを選択し、
  • [Start] を押下してテレメトリを受信

接続

デバイス

Raspberry Pi Simulator

(Raspberry Pi(DNET_RaspberryPi.md))

CLIデバイス・シミュレータ

  • デバイス監視の設定を別セッション(≒タブ)で行っておく。

  • シミュレータの生成

    az iot device simulate -d mydevice1 -n OsscJpDevInfra
    • シミュレータではデバイスから IoT Hub への接続文字列の設定は不要である模様。
    • デバイスが停止している場合、このコマンドを実行して再起動する(100%でシャットダウンする)。
  • 各種メッセージの送信
    Azure Cloud Shellの別セッション(≒ 別タブ)で実行

    • D2C メッセージを送信

      • シミュレータ生成と同時に定期的にメッセージが送信される。
      • メッセージは、監視のセッション(≒タブ)で確認可能。
    • C2D メッセージを送信
      メッセージは、シミュレータの生成のセッション(≒タブ)で確認可能。

      az iot device c2d-message send -d mydevice1 --data "Hello World" --props "key0=value0;key1=value1" -n OsscJpDevInfra
    • ダイレクト メソッドを送信
      メッセージは、シミュレータの生成のセッション(≒タブ)で確認可能。

      az iot hub invoke-device-method --mn MySampleMethod -d mydevice1 -n OsscJpDevInfra
    • プロパティの

      • 更新

        az iot hub device-twin update -d mydevice1 --desired '{"conditions":{"temperature":{"warning":98, "critical":107}}}' -n OsscJpDevInfra
      • 確認

        az iot hub device-twin show -d mydevice1 --query properties.reported -n OsscJpDevInfra
      • シミュレータの生成のセッション(≒タブ)でも確認可能。

補足(desired と reported): デバイス ツインのプロパティは
**desired(クラウドが「こうしてほしい」と書く側)**と
**reported(デバイスが「今こうです」と書き返す側)**に分かれている。
上のコマンドが更新するのは前者、確認しているのは後者であり、
デバイスが desired を受け取って反映し、reported に書き戻すまで
両者は一致しない。

SDK(C#)

クイックスタート
チュートリアル」から、
Node.js のサンプルが多いが、やっぱり C# を選択。

  • デバイス監視の設定を別セッション(≒タブ)で行っておく。

  • azure-iot-sdk-csharp/iothub

    • テレメトリ送信
      手順のとおり実行可能。

      • device/samples/solutions/PnpDeviceSamples/TemperatureController
        ・以下の環境変数を設定して

        set IOTHUB_DEVICE_SECURITY_TYPE=connectionString
        set IOTHUB_DEVICE_CONNECTION_STRING=デバイスからIoT Hubへの接続文字列
        

        ・実行

        TemperatureController
        
    • デバイス制御
      パスやコマンドライン引数が間違っている。

      • device/samples/getting started/SimulatedDeviceWithCommand

        >SimulatedDeviceWithCommand --DeviceConnectionString デバイスからIoT Hubへの接続文字列
        
      • service/samples/getting started/InvokeDeviceMethod

        >InvokeDeviceMethod --HubConnectionString "IoT Hubへの接続文字列" -d デバイス名
        
    • IoT Plug and Play デバイスソリューション
      以下のビルドの前に azureiot.sln で全体のビルドが必要。

      • device/samples/solutions/PnpDeviceSamples/Thermostat
        ・以下の環境変数を設定して

        set IOTHUB_DEVICE_SECURITY_TYPE=dps
        set IOTHUB_DEVICE_DPS_ID_SCOPE=<...>
        set IOTHUB_DEVICE_DPS_DEVICE_ID=my-pnp-device1
        set IOTHUB_DEVICE_DPS_DEVICE_KEY=<...>
        set IOTHUB_DEVICE_DPS_ENDPOINT=global.azure-devices-provisioning.net
        

        ・実行

        Thermostat.exe -r 30
        
      • service/samples/solutions/PnpServiceSamples/Thermostat
        ・以下の環境変数を設定して

        set IOTHUB_DEVICE_ID=my-pnp-device1
        set IOTHUB_CONNECTION_STRING=<...>
        

        ・実行

        Thermostat.exe
        

移行メモ(誤字): 「デバイスソリーション」→「ソリーション」を
修正した(後述の参考にも同じ誤字があるが、そちらは元の見出しの表記として残した)。

その他のサンプル

サービス

Azure Stream Analytics

Azure Stream Analyticsを経由して以下に接続する。

  • ストレージ

    • ストレージ・コンテナを IaC するなど。

    • Azure Stream Analytics ジョブの作成

      • ポータル
        ・ジョブ名:IoT2Storage
        ・[Add input] を押下してストリーム入力の追加から [IoT Hub] を選択し既定値で設定
        ・[Add output] を押下して追加から [Blob ストレージ] を選択し既定値で設定
        ・[Write query]([Edit query])を押下すると、
        ・入力・出力がエイリアスで自動設定されているので [クエリのテスト] で動作を確認。
        ・最後に作成したジョブに戻って [開始] ボタンを押下する。

      • シェル
        ...

  • Power BI
    組織アカウントが必要だった。

Azure Time Series Insights

Azure Time Series Insights

組織アカウントが必要だった。

補足(Time Series Insights は終了): Azure Time Series Insights は
2024 年 7 月に提供終了した。
時系列データの蓄積・可視化は、現在
Azure Data Explorer や **Microsoft Fabric(Real-Time Intelligence)**が
引き継いでいる。

参考

Qiita

Python、Node.js の記事

C# の記事

  • Azure IoT Hubを使ってみた
    https://qiita.com/linyixian/items/e319c5f63f9e57459ac0

  • AzureでIoT系のサービスをサラッと(?)使ってみよう
    https://qiita.com/mstakaha1113/items/1c9b8f61452147a87640

    • シナリオ0:デバイスと IoT Hub を接続。
      [quickstart-send-telemetry-iot-hub] の内容をヤレと言う内容。

    • シナリオ1:デバイスからテレメトリーデータを取得しストレージへ保存。

      • ココでは、Function → Storage と保存する。

      • 以下の内容をヤレと言う内容。
        [functions-create-your-first-function-visual-studio]
        [functions-bindings-event-hubs-output]
        [functions-add-output-binding-storage-queue-vs]

      • 感想
        ・メッセージ ルーティングで良いのでは?と言う気もした。
        ・なぜ、Event Hubs?と思ったが、裏で暗黙的に使われているからっぽい(built-in event hub)。

      • 余談
        以下は VSCode でシナリオ1をヤッた手順である様
        https://qiita.com/mstakaha1113/items/30fe58e37de0a2801307

    • シナリオ2:テレメトリーデータの異常を検知した時はメールを送信。

      • ココでは、Stream Analytics → Service Bus → Logic Apps と保存する。

      • 以下の内容をヤレと言う内容。
        [service-bus-quickstart-portal]
        [stream-analytics-quick-create-portal]
        [quickstart-create-first-logic-app-workflow]
        [service-bus-dotnet-get-started-with-queues](確認用)

    • シナリオ3:デバイスからファイルをアップロード。

      • これは単なるファイルアップロード
      • ただし、実際は Storage アップロードへの完了通知と言う点がポイント
    • シナリオ4:テレメトリーでアラートを送信し
      コレを受信したサービスはデバイスに制御メッセージを送信する。

      • ココでは、IoT Hub → Event Hub → Functions → IoT Hub と折り返す。

      • ポイント
        ・デバイスからテレメトリーで(プロパティを使用した)アラートを送信。
        ・間の経路は Event Hub を挟んでメッセージ ルーティングする。
        ・Functions(シナリオ1で既出)でアラート イベントを取得し Desired プロパティを送信
        ・Device は Desired プロパティを受信(後の Reported については触れられていない)。

    • シナリオ5:サービス側からデバイスに対して直接的に命令を送信(ダイレクト メソッド)。

      • ダイレクト メソッド(サンプルコードは azure-iot-samples-csharp にコード追加)
      • パイプラインになっておらず、Functions でダイレクト メソッドを実行するだけ。
  • Azure IoT Hubを久しぶりに触ってみたので個人的な備忘録

Stack Overflow

SIOS Tech. Lab

他ベンダ

YouTube

GitHub

Microsoft Docs

シミュレーターのドキュメント

クイックスタートのドキュメント

チュートリアルのドキュメント

操作方法ガイドのドキュメント

本 Wiki 内


Tags: クラウド, IoT, Azure

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally