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 IoT Operations インスタンスをデプロイした後でプレビュー コネクタを有効にするには:
Azure portal で Azure IoT Operations インスタンスに移動します。
プレビュー コネクタを有効にします。
重要
プレビュー機能を有効にしない場合は、メディアまたは ONVIF コネクタを使用しようとすると、 aio-supervisor-...
ポッド ログに次のエラー メッセージが表示されます: No connector configuration present for AssetEndpointProfile: <AssetEndpointProfileName>
。
資産エンドポイントの構成
ONVIF コネクタを構成するには、まず、ONVIF 準拠のカメラ 資産への接続を定義する資産エンドポイントを作成します。 資産エンドポイントには、ONVIF 検出エンドポイントの URL と、カメラにアクセスするために必要な資格情報が含まれます。
カメラで認証が必要な場合は、カメラのユーザー名とパスワードを格納するシークレットを Kubernetes クラスターに作成します。 メディア コネクタは、このシークレットを使用してカメラで認証します。
次の内容を含む 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
。既定の Azure IoT Operations 名前空間のクラスターにシークレットを追加するには、次のコマンドを実行します。
kubectl apply -f contoso-onvif-secrets.yaml -n azure-iot-operations
Bicep ファイルを使用して資産エンドポイントを作成するには:
以下の環境変数を設定します。
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"
次のスクリプトを実行します。
# 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 機能を表すアセットを手動で作成するには:
以下の環境変数を設定します。
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
次のスクリプトを実行します。
# 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
}
}
カメラのメディア機能にアクセスする
以前に検出されたカメラのメディア機能を表すアセットを手動で作成するには:
以下の環境変数を設定します。
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
次のスクリプトを実行します。
# 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
パブリック プレビュー中は、検出された資産の情報に基づいて資産定義を手動で追加する必要があります。 以前に検出されたカメラのメディア機能を表すアセットを手動で作成するには:
以下の環境変数を設定します。
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
次のスクリプトを実行します。
# 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 準拠カメラのビデオ ストリームへのアクセスを有効にする資産エンドポイントと資産を手動で作成するには:
パブリック プレビュー中は、まずツールを使用してカメラの RTSP ストリーム URL を検出します。
RTSP ストリーム URL を使用して、資産エンドポイントと資産を作成します。 詳細については、「 メディア コネクタの構成 (プレビュー)」を参照してください。