Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 :
Per abilitare i connettori di anteprima dopo aver distribuito l'istanza di Azure IoT Operations:
Vai alla tua istanza di Operazioni IoT di Azure nel portale di Azure.
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:
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
.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:
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"
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:
Impostare le seguenti variabili di ambiente:
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
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:
Impostare le seguenti variabili di ambiente:
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
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:
Impostare le seguenti variabili di ambiente:
SUBSCRIPTION_ID="<YOUR SUBSCRIPTION ID>" RESOURCE_GROUP="<YOUR AZURE IOT OPERATIONS RESOURCE GROUP>" AEP_NAME="contoso-onvif-aep"
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:
Durante l'anteprima pubblica, usare prima uno strumento per individuare gli URL del flusso RTSP della fotocamera.
Usare l'URL del flusso RTSP per creare l'endpoint dell'asset e l'asset. Per altre informazioni, vedere Configurare il connettore multimediale (anteprima).