クラウド・プラットフォーム

Azure IoT Hub

MicrosoftのIoT基盤サービス。

概要

Azure IoT Hubは、MicrosoftがAzureクラウド上で提供するフルマネージドなIoT接続・管理サービスです。数百万台規模のデバイスとクラウドの間で安全かつ信頼性の高い双方向通信を実現し、デバイスデータの収集・処理・分析から、デバイスへのコマンド送信・ファームウェア更新まで、IoTシステムに必要な基盤機能を包括的に提供します。

Azure IoT Hubの主要コンポーネントは以下の通りです。

  • デバイスエンドポイント: デバイスとの接続を担うMQTT/AMQP/HTTPエンドポイント
  • サービスエンドポイント: バックエンドアプリケーションからデバイスを操作するためのAPI群
  • デバイスツイン: デバイスの状態をJSON形式でクラウドに保持する(AWSのDevice Shadowに相当)
  • ダイレクトメソッド: デバイスに対してリアルタイムにRPCを実行する仕組み
  • デバイスストリーム: デバイスとの双方向ストリーミング通信
  • IoT Hub メッセージルーティング: 受信メッセージを条件に応じて各Azureサービスへ転送
  • Azure IoT Device Provisioning Service(DPS): 大量デバイスのゼロタッチ自動登録

Microsoft Azureの豊富なAI・分析サービス(Azure Machine Learning、Azure Stream Analytics、Power BIなど)と深くネイティブ統合されている点が大きな特徴です。

歴史・背景

MicrosoftがIoT分野に本格参入したのは2014年頃で、当初は「Azure Event Hubs」をIoTデータ収集に転用する形が多く見られました。2015年にAzure IoT Hub(プレビュー版)が発表され、同年一般提供が開始されました。

2017年にはエッジコンピューティング向けの「Azure IoT Edge」が発表され、Kubernetesコンテナ技術をエッジデバイス上で動かす革新的なアーキテクチャが注目を集めました。2018年には「Azure IoT Central」という、IoT Hubを内包したSaaS型のプラットフォームも登場しました。

2020年代に入り、「Azure Digital Twins」「Azure Defender for IoT(旧CyberX)」など、デジタルツインとセキュリティに特化した上位サービスが追加され、産業IoT(IIoT)分野での存在感が高まっています。また、OPC-UAプロトコルへの対応強化により、製造業の生産設備との連携が容易になりました。

技術仕様

対応プロトコル

プロトコルポート特記事項
MQTT 3.1.18883 (TLS), 1883デバイス向け標準
MQTT over WebSocket443プロキシ/ファイアウォール環境
AMQP 1.05671 (TLS)バッチ処理・複数デバイス多重化
AMQP over WebSocket443プロキシ環境
HTTPS443軽量デバイス、単発送信

サービスティアと制限

ティア用途1日あたりのメッセージ数価格(東日本リージョン)
Free開発・テスト8,000無料(1ハブのみ)
Basic B1小規模本番400,000約2,700円/月
Standard S1中規模本番400,000約3,300円/月
Standard S2大規模本番6,000,000約33,000円/月
Standard S3超大規模300,000,000約165,000円/月

BasicとStandardの大きな違いは、Standardのみがクラウドからデバイスへのメッセージ送信(C2D)、デバイスツイン、ダイレクトメソッドなど双方向通信機能を持つ点です。

デバイスツインの構造

{
  "deviceId": "myDevice-001",
  "etag": "AAAAAAAAAAc=",
  "status": "enabled",
  "properties": {
    "desired": {
      "telemetryInterval": 30,
      "targetTemperature": 22.0,
      "$metadata": {...},
      "$version": 5
    },
    "reported": {
      "telemetryInterval": 30,
      "currentTemperature": 21.8,
      "firmwareVersion": "1.3.2",
      "$metadata": {...},
      "$version": 12
    }
  },
  "tags": {
    "location": "tokyo-factory",
    "floor": "3F",
    "line": "A"
  }
}

動作原理

メッセージルーティング

Azure IoT Hubのメッセージルーティング機能は、受信メッセージの内容やプロパティに基づいて、複数のエンドポイントへメッセージを振り分けます。

デバイス → IoT Hub → ルーティングルール評価

            ┌────────────┼────────────┐
            ↓            ↓            ↓
       Event Hub    Service Bus   Blob Storage
     (ストリーム処理)  (コマンド処理)  (アーカイブ)

    Stream Analytics
     (リアルタイム分析)

         Power BI
        (可視化)

ルーティング条件の例(SQLライクなクエリ):

-- 緊急アラートは専用エンドポイントへ
SELECT * FROM messages WHERE messageType = 'alert' AND severity = 'critical'

-- 製造ラインAのデータのみフィルタリング
SELECT * FROM messages WHERE productionLine = 'A' AND $body.temperature > 25

ダイレクトメソッドの動作

ダイレクトメソッドは、クラウドからデバイスへのリアルタイムRPCです。デバイスがオンラインの場合のみ動作し、タイムアウトを設定できます。

# バックエンド側: ダイレクトメソッド呼び出し
from azure.iot.hub import IoTHubRegistryManager
import json

registry_manager = IoTHubRegistryManager.from_connection_string(CONNECTION_STRING)

# デバイスの"reboot"メソッドを呼び出す
response = registry_manager.invoke_device_method(
    device_id="myDevice-001",
    direct_method_request={
        "methodName": "reboot",
        "payload": {"delay": 5},
        "responseTimeoutInSeconds": 30,
        "connectTimeoutInSeconds": 10
    }
)
print(f"Status: {response.status}, Payload: {response.payload}")
// デバイス側: ダイレクトメソッドハンドラ
static int device_method_callback(const char* method_name, const unsigned char* payload,
                                   size_t size, unsigned char** response, size_t* response_size,
                                   void* userContextCallback) {
    if (strcmp(method_name, "reboot") == 0) {
        // ペイロードからdelayを取得して再起動処理
        printf("Reboot requested\n");
        const char* RESPONSE_STRING = "{\"result\":\"Rebooting\"}";
        *response_size = strlen(RESPONSE_STRING);
        *response = (unsigned char*)malloc(*response_size);
        memcpy(*response, RESPONSE_STRING, *response_size);
        return 200; // HTTPステータスコードに相当
    }
    return 404;
}

用途・ユースケース

産業IoT(IIoT)製造業向け

Azure IoT Hubは製造業での採用が特に多く、OPC-UAプロトコルを使った工場設備との連携、Azure Digital Twinsによる工場全体のデジタルツイン構築に強みを持ちます。

スマートビルディング

ビル管理システム(BMS)とAzure IoT Hubを接続し、空調・照明・エレベーター・セキュリティシステムを統合管理。Azure Time Series Insightsで長期的なエネルギー消費トレンドを分析します。

医療機器モニタリング

病院内の医療機器をAzure IoT Hubで一元管理。HIPAA準拠のセキュリティ設定と、Azure Sentinelによるセキュリティ監視を組み合わせた実装が可能です。

コネクテッドカー

車両からのOBD-IIデータをAzure IoT Hubで受信し、Azure Stream Analyticsでリアルタイム分析。Power BIでフリートの状態を可視化します。

実装・開発のポイント

デバイスSDKを使った接続

Azure IoT Device SDKはC、Python、Java、C#、Node.jsなど多言語対応しています。組み込み向けにはC SDKが適しています。

#include "iothub.h"
#include "iothub_device_client_ll.h"
#include "iothub_client_options.h"
#include "iothubtransportmqtt.h"

IOTHUB_DEVICE_CLIENT_LL_HANDLE device_ll_handle;

// 接続文字列で初期化(開発時)
// 本番環境ではDPS(Device Provisioning Service)を使用
device_ll_handle = IoTHubDeviceClient_LL_CreateFromConnectionString(
    CONNECTION_STRING, MQTT_Protocol);

// テレメトリ送信コールバック設定
IoTHubDeviceClient_LL_SetMessageCallback(device_ll_handle, receive_msg_callback, NULL);

// メッセージ送信
IOTHUB_MESSAGE_HANDLE msg_handle = IoTHubMessage_CreateFromString(
    "{\"temperature\":25.3,\"humidity\":60}");
IoTHubDeviceClient_LL_SendEventAsync(device_ll_handle, msg_handle, send_confirm_callback, NULL);

// イベントループ
while (running) {
    IoTHubDeviceClient_LL_DoWork(device_ll_handle);
    ThreadAPI_Sleep(100);
}

Device Provisioning Service(DPS)による自動登録

工場出荷時にDPS証明書を組み込むことで、電源投入時に自動的に正しいIoT Hubへ登録されます。

# DPSを使ったプロビジョニング(Python SDK)
from azure.iot.device.aio import ProvisioningDeviceClient
import asyncio

async def provision_device():
    provisioning_client = ProvisioningDeviceClient.create_from_symmetric_key(
        provisioning_host="global.azure-devices-provisioning.net",
        registration_id="myDevice-serial-12345",
        id_scope="0ne00XXXXXX",  # DPSのIDスコープ
        symmetric_key="base64encodedkey=="
    )
    registration_result = await provisioning_client.register()
    if registration_result.status == "assigned":
        print(f"IoT Hub: {registration_result.registration_state.assigned_hub}")
        print(f"Device ID: {registration_result.registration_state.device_id}")
    return registration_result

asyncio.run(provision_device())

Azure IoT Edgeの活用

# deployment.manifest.json(エッジデバイスへのデプロイ設定)
{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "modules": {
          "temperatureFilter": {
            "type": "docker",
            "settings": {
              "image": "myregistry.azurecr.io/temperature-filter:1.0",
              "createOptions": {}
            },
            "env": {
              "temperatureThreshold": {"value": "25"}
            }
          }
        }
      }
    }
  }
}

他技術との比較

項目Azure IoT HubAWS IoT CoreGoogle Cloud IoT自前構築(Mosquitto+Kafka)
エンタープライズ統合非常に強い強い中程度要カスタム開発
OPC-UA対応ネイティブ対応要ゲートウェイ要ゲートウェイ要ゲートウェイ
デジタルツインAzure Digital TwinsAWS IoT TwinMaker限定的なし
AIサービス連携Azure ML・Cognitive ServicesSageMakerVertex AIなし
エッジ実行環境IoT Edge(Kubernetes)Greengrass(Lambda)Edge TPU(ML特化)なし
Windowsデバイス対応特に強い対応対応対応
オフライン対応デバイスツインDevice Shadowデバイスシャドウなし(要実装)

Azure IoT HubはIoTプラットフォームの代表実装の一つであり、デバイスシャドウに相当するデバイスツイン機能を提供します。エッジコンピューティングとの連携にはAzure IoT Edgeを、フリート管理には組み込みのDevice Management機能を活用します。

関連用語

参考リンク