다음을 통해 공유


ONVIF용 커넥터 구성(미리 보기)

Azure IoT Operations에서 ONVIF(미리 보기)용 커넥터를 사용하면 Azure IoT Operations 클러스터에 연결된 ONVIF 규격 카메라를 제어할 수 있습니다. 이 문서에서는 ONVIF용 커넥터를 구성하고 사용하여 다음과 같은 작업을 수행하는 방법을 설명합니다.

  • 카메라를 제어하기 위한 속성을 읽고 쓰기.
  • 카메라가 지원하는 미디어 스트림을 발견하기.

필수 조건

Azure IoT Operations의 배포된 인스턴스입니다. 인스턴스가 아직 없는 경우 빠른 시작을 참조하세요. K3를 사용하여 GitHub Codespaces에서 Azure IoT 작업 실행

Azure IoT Operations 클러스터에 연결된 ONVIF 규격 카메라입니다.

ONVIF용 커넥터 배포

커넥터의 미리 보기 버전을 배포하려면 Azure IoT Operations 인스턴스를 배포할 때 사용하도록 설정하거나 인스턴스를 배포한 후 사용하도록 설정할 수 있습니다.

Azure IoT Operations 인스턴스를 배포할 때 미리 보기 커넥터를 사용하도록 설정하려면 다음을 수행합니다.

Azure IoT Operations Basics 설치 페이지의 > 섹션에서 ONVIF 커넥터 및 미디어 커넥터(미리 보기)를 선택합니다.

미리 보기 커넥터를 선택하는 방법을 보여 주는 Azure Portal의 스크린샷

Azure IoT Operations 인스턴스를 배포한 후 미리 보기 커넥터를 사용하도록 설정하려면 다음을 수행합니다.

  1. Azure Portal에서 Azure IoT Operations 인스턴스로 이동합니다.

  2. 미리 보기 커넥터를 사용하도록 설정합니다.

미리 보기 커넥터를 사용하도록 설정하는 방법을 보여 주는 Azure Portal의 스크린샷.

중요합니다

미리 보기 기능을 사용하도록 설정하지 않으면 미디어 또는 ONVIF 커넥터를 사용하려고 할 때 Pod 로그에 다음 오류 메시지가 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용 커넥터는 검색 프로세스를 실행하여 연결된 카메라의 기능을 검색합니다. 검색 프로세스의 결과는 DiscoveredAssetDiscoverAssetEndpointProfile 사용자 지정 리소스입니다.

  • DiscoveredAsset 사용자 지정 리소스는 카메라가 지원하는 PTZ(팬-틸트 줌)와 같은 ONVIF 서비스 중 하나를 나타냅니다. 출력 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
    

현재 공개 미리 보기 중에 카메라 및 비디오 스트림의 기능을 나타내는 AssetAssetEndpointProfile 사용자 지정 리소스를 수동으로 만들어야 합니다.

카메라의 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 Broker에 이벤트를 게시합니다.

카메라가 보낼 수 있는 이벤트를 찾으려면 다음 명령을 사용하여 카메라를 나타내는 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 Broker를 사용하여 ONVIF용 커넥터와 상호 작용하는 명령을 보냅니다. 자세한 내용은 MQTT broker를 사용하여 MQTT 메시지 게시 및 구독을 참조하세요.

카메라의 비디오 스트림에 액세스

ONVIF 규격 카메라의 비디오 스트림에 액세스할 수 있는 자산 엔드포인트 및 자산을 수동으로 만들려면 다음을 수행합니다.

  1. 공개 미리 보기 중에는 먼저 도구를 사용하여 카메라의 RTSP 스트림 URL을 검색합니다.

  2. RTSP 스트림 URL을 사용하여 자산 엔드포인트 및 자산을 만듭니다. 자세한 내용은 미디어 커넥터 구성(미리 보기)을 참조하세요.