次の方法で共有


ONVIF 用コネクタ (プレビュー) を構成する

Azure IoT Operations では、ONVIF 用コネクタ (プレビュー) を使用して、Azure IoT Operations クラスターに接続されている ONVIF 準拠のカメラを制御できます。 この記事では、ONVIF 用コネクタを構成して使用して、次のようなタスクを実行する方法について説明します。

  • カメラを制御するためのプロパティの読み取りと書き込み。
  • カメラがサポートするメディア ストリームを検出する。

前提条件

Azure IoT Operations のデプロイされたインスタンス。 まだインスタンスがない場合は、「 クイック スタート: K3s を使用して GitHub Codespaces で Azure IoT 操作を実行する」を参照してください。

Azure IoT Operations クラスターに接続されている ONVIF 準拠のカメラ。

ONVIF 用のコネクタをデプロイする

プレビュー バージョンのコネクタをデプロイするには、Azure IoT Operations インスタンスをデプロイするときにコネクタを有効にするか、インスタンスをデプロイした後で有効にすることができます。

Azure IoT Operations インスタンスをデプロイするときにプレビュー コネクタを有効にするには:

[Azure IoT Operations 基本のインストール] ページの >] セクションで ONVIF コネクタとメディア コネクタ (プレビュー) を選択します。

プレビュー コネクタを選択する方法を示す Azure portal のスクリーンショット。

Azure IoT Operations インスタンスをデプロイした後でプレビュー コネクタを有効にするには:

  1. Azure portal で Azure IoT Operations インスタンスに移動します。

  2. プレビュー コネクタを有効にします。

プレビュー コネクタを有効にする方法を示す Azure portal のスクリーンショット。

重要

プレビュー機能を有効にしない場合は、メディアまたは ONVIF コネクタを使用しようとすると、 aio-supervisor-... ポッド ログに次のエラー メッセージが表示されます: No connector configuration present for AssetEndpointProfile: <AssetEndpointProfileName>

資産エンドポイントの構成

ONVIF コネクタを構成するには、まず、ONVIF 準拠のカメラ 資産への接続を定義する資産エンドポイントを作成します。 資産エンドポイントには、ONVIF 検出エンドポイントの URL と、カメラにアクセスするために必要な資格情報が含まれます。

カメラで認証が必要な場合は、カメラのユーザー名とパスワードを格納するシークレットを Kubernetes クラスターに作成します。 メディア コネクタは、このシークレットを使用してカメラで認証します。

  1. 次の内容を含む contoso-onvif-secrets.yaml という名前の YAML ファイルを作成します。 プレースホルダーを、base64 でエンコードされたカメラのユーザー名とパスワードに置き換えます。

    apiVersion: v1
    kind: Secret
    metadata:
      name: contoso-onvif-secrets
    type: Opaque
    data:
      username: "<YOUR CAMERA USERNAME BASE64 ENCODED>"
      password: "<YOUR CAMERA PASSWORD BASE64 ENCODED>"
    

    ヒント

    Bash プロンプトで base64 のユーザー名とパスワードをエンコードするには、次のコマンドを使用します: echo -n "<STRING TO ENCODE>" | base64

  2. 既定の Azure IoT Operations 名前空間のクラスターにシークレットを追加するには、次のコマンドを実行します。

    kubectl apply -f contoso-onvif-secrets.yaml -n azure-iot-operations
    

Bicep ファイルを使用して資産エンドポイントを作成するには:

  1. 以下の環境変数を設定します。

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    ONVIF_ADDRESS="<YOUR CAMERA ONVIF DISCOVERY ADDRESS>"
    AEP_NAME="contoso-onvif-aep"
    SECRET_NAME="contoso-onvif-secrets"
    
  2. 次のスクリプトを実行します。

    # Download the Bicep file
    wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/onvif-connector-bicep/aep-onvif-connector.bicep -O aep-onvif-connector.bicep
    
    # Find the name of your custom ___location
    CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv)
    
    # Use the Bicep file to deploy the asset endpoint
    az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file aep-onvif-connector.bicep --parameters onvifAddress=$ONVIF_ADDRESS customLocationName=$CUSTOM_LOCATION_NAME aepName=$AEP_NAME secretName=$SECRET_NAME
    

次のスニペットは、資産エンドポイントの作成に使用した bicep ファイルを示しています。

metadata description = 'Asset endpoint profile for ONVIF connector'

@description('The ONVIF discovery endpoint.')
param onvifAddress string

@description('The name of the custom ___location you are using.')
param customLocationName string

@description('Specifies the name of the asset endpoint resource to create.')
param aepName string

@description('The name of the Kubernetes secret you are using to store the camera credentials.')
param secretName string

/*****************************************************************************/
/*                          Asset endpoint profile                           */
/*****************************************************************************/
resource assetEndpoint 'Microsoft.DeviceRegistry/assetEndpointProfiles@2024-11-01' = {
  name: aepName
  ___location: resourceGroup().___location
  extendedLocation: {
    type: 'CustomLocation'
    name: customLocationName
  }
  properties: {
    targetAddress: onvifAddress
    endpointProfileType: 'Microsoft.Onvif'
    #disable-next-line no-hardcoded-env-urls //Schema required during public preview
    additionalConfiguration: '{"@schema":"https://aiobrokers.blob.core.windows.net/aio-onvif-connector/1.0.0.json"}'
    authentication: {
      method: 'UsernamePassword'
      usernamePasswordCredentials: {
        passwordSecretName: '${secretName}/password'
        usernameSecretName: '${secretName}/username'
      }
    }
  }
}

前の例では、ユーザー名とパスワードを使用してカメラで認証するように資産エンドポイントを構成します。 Bicep ファイルでは、作成した資産エンドポイントの認証セクションは次の例のようになります。

authentication: {
  method: 'UsernamePassword'
  usernamePasswordCredentials: {
    passwordSecretName: '${secretName}/password'
    usernameSecretName: '${secretName}/username'
    }

カメラにユーザー名とパスワードが必要ない場合は、次の例に示すように匿名認証を構成します。

authentication: {
  method: 'Anonymous'
}

ONVIF カメラ機能を表す資産エンドポイントと資産を作成する

資産エンドポイントを作成すると、ONVIF 用コネクタによって検出プロセスが実行され、接続されているカメラの機能が検出されます。 検出プロセスの結果は 、DiscoveredAsset カスタム リソースと DiscoverAssetEndpointProfile カスタム リソースです。

  • DiscoveredAsset カスタム リソースは、カメラがサポートするパン傾斜ズーム (PTZ) などの ONVIF サービスの 1 つを表します。 kubectl get discoveredassets -n azure-iot-operationsからの出力は、次の例のようになります。

    NAME                       AGE
    contoso-onvif-aep-device    3m
    contoso-onvif-aep-media     3m
    contoso-onvif-aep-ptz       3m
    
  • DiscoveredAssetEndpointProfile カスタム リソースは、カメラが公開するビデオ ストリーム形式を表します。 kubectl get discoveredassetendpointprofiles -n azure-iot-operationsからの出力は、次の例のようになります。

    NAME                                AGE
    contoso-onvif-aep-mainstream-http    3m
    contoso-onvif-aep-mainstream-rtsp    3m
    contoso-onvif-aep-mainstream-tcp     3m
    contoso-onvif-aep-mainstream-udp     3m
    contoso-onvif-aep-minorstream-http   3m
    contoso-onvif-aep-minorstream-rtsp   3m
    contoso-onvif-aep-minorstream-tcp    3m
    contoso-onvif-aep-minorstream-udp    3m
    

現在、パブリック プレビュー中は、カメラとそのビデオ ストリームの機能を表す Asset および AssetEndpointProfile カスタム リソースを手動で作成する必要があります。

カメラの PTZ 機能にアクセスする

ONVIF 準拠カメラの PTZ 機能を使用して、その位置と向きを制御します。 以前に検出されたカメラの PTZ 機能を表すアセットを手動で作成するには:

  1. 以下の環境変数を設定します。

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. 次のスクリプトを実行します。

    # Download the Bicep file
    wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/onvif-connector-bicep/asset-ptz.bicep -O asset-ptz.bicep
    
    # Find the name of your custom ___location
    CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv)
    
    # Use the Bicep file to deploy the asset
    az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file asset-ptz.bicep --parameters customLocationName=$CUSTOM_LOCATION_NAME aepName=$AEP_NAME
    

資産の作成に使用した Bicep ファイルを示す次のコードスニペットをご覧ください。 資産名の -ptz サフィックスは、資産がカメラの PTZ 機能を表していることを示すために必要な規則です。

metadata description = 'ONVIF camera PTZ capabilities'
param aepName  string
param customLocationName string
param assetName     string = 'camera-ptz'
param displayName string = 'Camera PTZ service'

/*****************************************************************************/
/*                                    Asset                                  */
/*****************************************************************************/
resource asset 'Microsoft.DeviceRegistry/assets@2024-11-01' = {
  name: assetName
  ___location: resourceGroup().___location
  extendedLocation: {
    type: 'CustomLocation'
    name: customLocationName
  }
  properties: {
    displayName: displayName
    assetEndpointProfileRef: aepName
  }
}

カメラのメディア機能にアクセスする

以前に検出されたカメラのメディア機能を表すアセットを手動で作成するには:

  1. 以下の環境変数を設定します。

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. 次のスクリプトを実行します。

    # Download the Bicep file
    wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/onvif-connector-bicep/asset-onvif-media.bicep -O asset-onvif-media.bicep
    
    # Find the name of your custom ___location
    CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv)
    
    # Use the Bicep file to deploy the asset
    az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file asset-onvif-media.bicep --parameters customLocationName=$CUSTOM_LOCATION_NAME aepName=$AEP_NAME
    

資産の作成に使用した Bicep ファイルを示す次のコードスニペットをご覧ください。 資産名の -media サフィックスは、資産がカメラのメディア機能を表していることを示すために必要な規則です。

metadata description = 'ONVIF camera media capabilities'
param aepName  string
param customLocationName string
param assetName     string = 'camera-media'
param displayName string = 'Camera media service'

/*****************************************************************************/
/*                                    Asset                                  */
/*****************************************************************************/
resource asset 'Microsoft.DeviceRegistry/assets@2024-11-01' = {
  name: assetName
  ___location: resourceGroup().___location
  extendedLocation: {
    type: 'CustomLocation'
    name: customLocationName
  }
  properties: {
    displayName: displayName
    assetEndpointProfileRef: aepName
  }
}

カメラからイベントを受信する

カメラは、モーション検出イベントなどの通知を Azure IoT Operations クラスターに送信できます。 ONVIF 用コネクタは、カメラのイベント サービスをサブスクライブし、Azure IoT Operations MQTT ブローカーにイベントを発行します。

カメラが送信できるイベントを見つけるには、次のコマンドを使用して、カメラを表す DiscoveredAsset カスタム リソースの説明を表示します。 サポートされているイベントを一覧表示する検出された資産には、資産名に -device サフィックスが付いています。

kubectl describe discoveredasset your-discovered-asset-device -n azure-iot-operations

前のコマンドの出力には、次の例のような Spec: セクションが含まれています。

Spec:
  Asset Endpoint Profile Ref:  your-asset-endpoint-profile-aep
  Datasets:
  Default Datasets Configuration:
  Default Events Configuration:
  Default Topic:
    Path:
    Retain:           Never
  Discovery Id:       a00b978b9d971450fa6378900b164736170bd2d790a2061da94a2238adee0d4f
  Documentation Uri:
  Events:
    Event Configuration:
    Event Notifier:       tns1:RuleEngine/CellMotionDetector/Motion
    Last Updated On:      2025-04-23T15:48:21.585502872+00:00
    Name:                 tns1:RuleEngine/CellMotionDetector/Motion
    Topic:
      Path:
      Retain:             Never
    Event Configuration:
    Event Notifier:       tns1:RuleEngine/TamperDetector/Tamper
    Last Updated On:      2025-04-23T15:48:21.585506712+00:00
    Name:                 tns1:RuleEngine/TamperDetector/Tamper
    Topic:
      Path:
      Retain:             Never

パブリック プレビュー中は、検出された資産の情報に基づいて資産定義を手動で追加する必要があります。 以前に検出されたカメラのメディア機能を表すアセットを手動で作成するには:

  1. 以下の環境変数を設定します。

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. 次のスクリプトを実行します。

    # Download the Bicep file
    wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/onvif-connector-bicep/asset-onvif-device.bicep -O asset-onvif-device.bicep
    
    # Find the name of your custom ___location
    CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv)
    
    # Use the Bicep file to deploy the asset
    az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file asset-onvif-device.bicep --parameters customLocationName=$CUSTOM_LOCATION_NAME aepName=$AEP_NAME
    

資産の作成に使用した Bicep ファイルを示す次のコードスニペットをご覧ください。 資産名の -device サフィックスは、資産がカメラのデバイス機能を表していることを示すために必要な規則です。

metadata description = 'ONVIF camera device events'
param aepName  string
param customLocationName string
param assetName     string = 'camera-device'
param displayName string = 'Camera device motion detected'

/*****************************************************************************/
/*                                    Asset                                  */
/*****************************************************************************/
resource asset 'Microsoft.DeviceRegistry/assets@2024-11-01' = {
  name: assetName
  ___location: resourceGroup().___location
  extendedLocation: {
    type: 'CustomLocation'
    name: customLocationName
  }
  properties: {
    displayName: displayName
    assetEndpointProfileRef: aepName
    enabled: true
    events: [
      {
        eventNotifier: 'tns1:RuleEngine/CellMotionDetector/Motion'
        name: 'motionDetected'
      }
    ]
  }
}

ONVIF 用コネクタは、カメラからモーション検出イベントの通知を受け取り、MQTT ブローカーの data/camera-device トピックに発行するようになりました。

{
  "name": "motionDetected",
  "eventNotifier": "tns1:RuleEngine/CellMotionDetector/Motion",
  "source": {
    "VideoSourceConfigurationToken": "vsconf",
    "VideoAnalyticsConfigurationToken": "VideoAnalyticsToken",
    "Rule": "MyMotionDetectorRule"
  },
  "data": {
    "IsMotion": "true"
  }
}

カメラを管理して制御する

ONVIF カメラを操作するために、ONVIF 用コネクタがサブスクライブする MQTT メッセージを発行できます。 メッセージ形式は、 ONVIF ネットワーク インターフェイスの仕様に基づいています。

ONVIF PTZ デモ 用 Azure IoT Operations コネクタのサンプル アプリケーションでは、ONVIF 用コネクタを使用して次の操作を行う方法を示します。

  • メディア 資産定義を使用して、カメラのメディア サービスからプロファイル トークンを取得します。
  • カメラの PTZ 機能を使用して位置と向きを制御する場合は、プロファイル トークンを使用します。

サンプル アプリケーションでは、Azure IoT Operations MQTT ブローカーを使用して、ONVIF のコネクタと対話するコマンドを送信します。 詳細については、 MQTT ブローカーを使用した MQTT メッセージのパブリッシュとサブスクライブを参照してください。

カメラのビデオ ストリームにアクセスする

ONVIF 準拠カメラのビデオ ストリームへのアクセスを有効にする資産エンドポイントと資産を手動で作成するには:

  1. パブリック プレビュー中は、まずツールを使用してカメラの RTSP ストリーム URL を検出します。

  2. RTSP ストリーム URL を使用して、資産エンドポイントと資産を作成します。 詳細については、「 メディア コネクタの構成 (プレビュー)」を参照してください。