Condividi tramite


Configurare il connettore per ONVIF (anteprima)

In Operazioni IoT di Azure, il connettore per ONVIF (anteprima) consente di controllare una fotocamera conforme a ONVIF connessa al cluster Operazioni IoT di Azure. Questo articolo illustra come configurare e usare il connettore per ONVIF per eseguire attività come:

  • Proprietà di lettura e scrittura per controllare una fotocamera.
  • Individuazione dei flussi multimediali supportati da una fotocamera.

Prerequisiti

Istanza distribuita di Operazioni IoT di Azure. Se non si ha già un'istanza, vedere Avvio rapido: Eseguire operazioni IoT di Azure in GitHub Codespaces con K3s.

Una fotocamera conforme a ONVIF connessa al cluster operazioni IoT di Azure.

Distribuire il connettore per ONVIF

Per distribuire la versione di anteprima dei connettori, è possibile abilitarli quando si distribuisce l'istanza di Operazioni IoT di Azure o abilitarle dopo la distribuzione dell'istanza.

Per abilitare i connettori di anteprima quando si distribuisce l'istanza di Operazioni IoT di Azure:

Selezionare ONVIF Connector e Media Connector (anteprima) nella sezione Connettori della pagina Installare Azure IoT Operations > Basics :

Screenshot del portale di Azure che mostra come selezionare i connettori di anteprima.

Per abilitare i connettori di anteprima dopo aver distribuito l'istanza di Azure IoT Operations:

  1. Vai alla tua istanza di Operazioni IoT di Azure nel portale di Azure.

  2. Abilitare i connettori di anteprima:

Screenshot del portale di Azure che mostra come abilitare i connettori di anteprima.

Importante

Se non si abilitano le funzionalità di anteprima, viene visualizzato il messaggio di errore seguente nei log dei aio-supervisor-... pod quando si tenta di usare i connettori multimediali o ONVIF: No connector configuration present for AssetEndpointProfile: <AssetEndpointProfileName>.

Configurazione dell'endpoint dell'asset

Per configurare il connettore ONVIF, creare, in primo luogo, un endpoint di risorsa che definisca la connessione alla telecamera compatibile con ONVIF. L'endpoint dell'asset include l'URL dell'endpoint di individuazione ONVIF e le credenziali necessarie per accedere alla fotocamera.

Se la fotocamera richiede l'autenticazione, creare un segreto nel cluster Kubernetes che archivia il nome utente e la password della fotocamera. Il connettore multimediale usa questo segreto per eseguire l'autenticazione con la fotocamera:

  1. Creare un file YAML denominato contoso-onvif-secrets.yaml con il contenuto seguente. Sostituire i segnaposto con il nome utente e la password della fotocamera codificati in 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>"
    

    Suggerimento

    Per codificare il nome utente e la password in base64 al prompt di Bash, usare il comando seguente: echo -n "<STRING TO ENCODE>" | base64.

  2. Per aggiungere il segreto al cluster nello spazio dei nomi predefinito di Operazioni IoT di Azure, eseguire il comando seguente:

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

Per creare l'endpoint dell'asset usando un file Bicep:

  1. Impostare le seguenti variabili di ambiente:

    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. Eseguire lo script seguente:

    # 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
    

Il frammento di codice seguente mostra il file bicep usato per creare l'endpoint dell'asset:

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'
      }
    }
  }
}

L'esempio precedente configura l'endpoint dell'asset per l'autenticazione con la fotocamera con un nome utente e una password. Nel file Bicep la sezione di autenticazione dell'endpoint dell'asset creato è simile all'esempio seguente:

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

Se la fotocamera non richiede un nome utente e una password, configurare l'autenticazione anonima come illustrato nell'esempio seguente:

authentication: {
  method: 'Anonymous'
}

Creare gli asset e gli endpoint degli asset per rappresentare le funzionalità della fotocamera ONVIF

Dopo aver creato l'endpoint dell'asset, il connettore per ONVIF esegue un processo di individuazione per rilevare le funzionalità della fotocamera connessa. I risultati del processo di individuazione sono DiscoveredAsset e DiscoverAssetEndpointProfile risorse personalizzate:

  • Una risorsa personalizzata DiscoveredAsset rappresenta uno dei servizi ONVIF , ad esempio lo zoom pan-tilt-zoom (PTZ) supportato dalla fotocamera. L'output di kubectl get discoveredassets -n azure-iot-operations potrebbe essere simile all'esempio seguente:

    NAME                       AGE
    contoso-onvif-aep-device    3m
    contoso-onvif-aep-media     3m
    contoso-onvif-aep-ptz       3m
    
  • Una risorsa personalizzata DiscoveredAssetEndpointProfile rappresenta un formato di flusso video esposto dalla fotocamera. L'output di kubectl get discoveredassetendpointprofiles -n azure-iot-operations potrebbe essere simile all'esempio seguente:

    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
    

Attualmente, durante l'anteprima pubblica, è necessario creare manualmente le risorse personalizzate Asset e AssetEndpointProfile che rappresentano le funzionalità della fotocamera e dei relativi flussi video.

Accedere alle funzionalità PTZ della fotocamera

Usare le funzionalità PTZ di una fotocamera conforme a ONVIF per controllarne la posizione e l'orientamento. Per creare manualmente un asset che rappresenta le funzionalità PTZ della fotocamera individuate in precedenza:

  1. Impostare le seguenti variabili di ambiente:

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. Eseguire lo script seguente:

    # 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
    

Il frammento di codice seguente mostra il file bicep usato per creare l'asset. Il -ptz suffisso al nome dell'asset è una convenzione obbligatoria per indicare che l'asset rappresenta le funzionalità PTZ della fotocamera:

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
  }
}

Accedere alle funzionalità multimediali della fotocamera

Per creare manualmente un asset che rappresenta le funzionalità multimediali della fotocamera individuate in precedenza:

  1. Impostare le seguenti variabili di ambiente:

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. Eseguire lo script seguente:

    # 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
    

Il frammento di codice seguente mostra il file bicep usato per creare l'asset. Il -media suffisso al nome dell'asset è una convenzione necessaria per indicare che l'asset rappresenta le funzionalità multimediali della fotocamera:

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
  }
}

Ricevere eventi dalla fotocamera

La fotocamera può inviare notifiche come eventi rilevati dal movimento al cluster operazioni IoT di Azure. Il connettore per ONVIF sottoscrive il servizio eventi della fotocamera e pubblica gli eventi nel broker MQTT per le operazioni IoT di Azure.

Per trovare gli eventi che la fotocamera può inviare, usare il comando seguente per visualizzare la descrizione della risorsa personalizzata DiscoveredAsset che rappresenta la fotocamera. L'asset individuato che elenca gli eventi supportati ha un -device suffisso al nome dell'asset:

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

L'output del comando precedente include una sezione Spec: simile all'esempio seguente.

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

Durante l'anteprima pubblica, è necessario aggiungere manualmente una definizione di asset in base alle informazioni nell'asset individuato. Per creare manualmente un asset che rappresenta le funzionalità multimediali della fotocamera individuate in precedenza:

  1. Impostare le seguenti variabili di ambiente:

    SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>"
    RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>"
    AEP_NAME="contoso-onvif-aep"
    
  2. Eseguire lo script seguente:

    # 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
    

Il frammento di codice seguente mostra il file bicep usato per creare l'asset. Il -device suffisso al nome dell'asset è una convenzione obbligatoria per indicare che l'asset rappresenta le funzionalità del dispositivo della fotocamera:

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'
      }
    ]
  }
}

Il connettore per ONVIF riceve ora le notifiche degli eventi rilevati dal movimento dalla fotocamera e li pubblica nell'argomento data/camera-device nel broker MQTT:

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

Gestire e controllare la fotocamera

Per interagire con la fotocamera ONVIF, è possibile pubblicare messaggi MQTT sottoscritti dal connettore per ONVIF. Il formato del messaggio si basa sulle specifiche dell'interfaccia di rete ONVIF.

L'applicazione di esempio Azure IoT Operations Connector per ONVIF PTZ Demo illustra come usare il connettore per ONVIF per:

  • Usa la definizione della risorsa multimediale per ottenere un token di profilo dal servizio multimediale della fotocamera.
  • Utilizzare il token del profilo quando si usano le funzionalità PTZ della fotocamera per controllarne la posizione e l'orientamento.

L'applicazione di esempio usa il broker MQTT per le operazioni IoT di Azure per inviare comandi per interagire con il connettore per ONVIF. Per altre informazioni, vedere Pubblicare e sottoscrivere messaggi MQTT con il broker MQTT.

Accedere ai flussi video della fotocamera

Per creare manualmente un endpoint di asset e un asset che consentono l'accesso ai flussi video della fotocamera conforme a ONVIF:

  1. Durante l'anteprima pubblica, usare prima uno strumento per individuare gli URL del flusso RTSP della fotocamera.

  2. Usare l'URL del flusso RTSP per creare l'endpoint dell'asset e l'asset. Per altre informazioni, vedere Configurare il connettore multimediale (anteprima).