Condividi tramite


Esercitazione: Ponte MQTT bidirezionale per Griglia di eventi di Azure

Importante

Questa pagina include istruzioni per la gestione dei componenti di Operazioni IoT di Azure usando i manifesti di distribuzione kubernetes, disponibile in anteprima. Questa funzionalità viene fornita con diverse limitazioni e non deve essere usata per i carichi di lavoro di produzione.

Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.

In questa esercitazione viene configurato un bridge MQTT bidirezionale tra un broker MQTT per le operazioni IoT di Azure e Griglia di eventi di Azure. Per semplificare l'esercitazione, usare le impostazioni predefinite per il broker MQTT per le operazioni di Azure IoT e gli endpoint Griglia di eventi di Azure e non viene applicata alcuna trasformazione.

Prerequisiti

Impostare le variabili di ambiente

Accedere tramite l'interfaccia della riga di comando di Azure:

az login

Impostare le variabili di ambiente per il resto della configurazione. Sostituire i valori in <> con valori o nomi validi di scelta. Nella sottoscrizione di Azure vengono creati nuovi spazi dei nomi e argomenti di Griglia di eventi di Azure in base ai nomi specificati:

# For this tutorial, the steps assume the IoT Operations cluster and the Event Grid
# are in the same subscription, resource group, and location.

# Name of the resource group of Azure Event Grid and IoT Operations cluster 
export RESOURCE_GROUP=<RESOURCE_GROUP_NAME>

# Azure region of Azure Event Grid and IoT Operations cluster
export LOCATION=<LOCATION>

# Name of the Azure Event Grid namespace
export EVENT_GRID_NAMESPACE=<EVENT_GRID_NAMESPACE>

# Name of the Arc-enabled IoT Operations cluster 
export CLUSTER_NAME=<CLUSTER_NAME>

# Subscription ID of Azure Event Grid and IoT Operations cluster
export SUBSCRIPTION_ID=<SUBSCRIPTION_ID>

Creare uno spazio dei nomi di Griglia di eventi con broker MQTT abilitato

Creare uno spazio dei nomi di Griglia di eventi con l'interfaccia della riga di comando di Azure. Il percorso deve corrispondere a quello usato per distribuire le operazioni di Azure IoT.

az eventgrid namespace create \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"

Se l'estensione eventgrid non è installata, viene chiesto se si vuole installarla. Selezionare questa opzione Y per installare l'estensione.

Impostando topic-spaces-configuration, questo comando crea uno spazio dei nomi con:

  • Broker MQTT abilitato
  • Il numero massimo di sessioni client per nome di autenticazione è pari a 3.

L'opzione max client sessions consente a MQTT operazioni IoT di Azure di generare più istanze e ancora connettersi. Per altre informazioni, vedere supporto multisessione.

Creare uno spazio degli argomenti

Nello spazio dei nomi Griglia di eventi, creare uno spazio degli argomenti denominato tutorial con un modello di argomento telemetry/#.

az eventgrid namespace topic-space create \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --name tutorial \
  --topic-templates "telemetry/#"

Usando il carattere jolly # nel modello di argomento, è possibile pubblicare a qualsiasi argomento nello spazio degli argomenti telemetry. Ad esempio, telemetry/temperature o telemetry/humidity.

Concedere alle operazioni IoT di Azure l'accesso allo spazio degli argomenti di Griglia di eventi

Usando l'interfaccia della riga di comando di Azure, trovare l'ID entità per l'estensione Azure IoT Operations Arc. Il comando archivia l'ID entità in una variabile per uso successivo.

export PRINCIPAL_ID=$(az k8s-extension list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --cluster-type connectedClusters \
  --query "[?extensionType=='microsoft.iotoperations'].identity.principalId | [0]" -o tsv)
echo $PRINCIPAL_ID

Prendere nota del valore di output per identity.principalId, che consiste in un valore GUID con il formato seguente:

aaaaaaaa-bbbb-cccc-1111-222222222222

Usare quindi l'interfaccia della riga di comando di Azure per assegnare ruoli di pubblicazione e sottoscrittore a MQTT per operazioni IoT di Azure per lo spazio degli argomenti creato.

Assegnare il ruolo di autore:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Publisher" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

Assegnare il ruolo sottoscrittore:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Subscriber" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

Suggerimento

L'ambito corrisponde a id dello spazio degli argomenti creato con az eventgrid namespace topic-space create nel passaggio precedente e può essere trovato nell'output del comando.

Nome host broker MQTT di Griglia di eventi

Usare l'interfaccia della riga di comando di Azure per ottenere il nome host del broker MQTT di Griglia di eventi.

az eventgrid namespace show \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --query topicSpacesConfiguration.hostname \
  -o tsv

Prendere nota del valore di output per topicSpacesConfiguration.hostname, che consiste in un valore hostname simile al seguente:

example.region-1.ts.eventgrid.azure.net

Creare un endpoint del flusso di dati Griglia di eventi di Azure

Creare l'endpoint del flusso di dati per il Griglia di eventi di Azure. Questo endpoint è la destinazione per il flusso di dati che invia messaggi a Griglia di eventi di Azure. Sostituire <EVENT_GRID_HOSTNAME> con il nome host MQTT ottenuto dal passaggio precedente. Includere il numero 8883di porta .

I flussi di dati e gli endpoint del flusso di dati Griglia di eventi di Azure possono essere distribuiti come risorse standard di Azure poiché dispongono di implementazioni del provider di risorse di Azure. Questo file modello Bicep dal file Bicep per l'esercitazione sul flusso di dati MQTT-bridge distribuisce gli endpoint del flusso di dati e del flusso di dati necessari.

Scaricare il file nel file locale e assicurarsi di sostituire i valori per customLocationName, aioInstanceName, eventGridHostName con il proprio.

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param eventGridHostName string = '<EVENT_GRID_HOSTNAME>:8883'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}

resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' = {
  parent: aioInstance
  name: 'eventgrid'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    endpointType: 'Mqtt'
    mqttSettings: {
      host: eventGridHostName
      authentication: {
        method: 'SystemAssignedManagedIdentity'
        systemAssignedManagedIdentitySettings: {}
      }
      tls: {
        mode: 'Enabled'
      }
    }
  }
}

Eseguire quindi il comando seguente nel terminale. Sostituire <FILE> con il nome del file Bicep scaricato.

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

In questo caso, il metodo di autenticazione è impostato su SystemAssignedManagedIdentity per usare l'identità gestita dell'estensione Operazioni IoT di Azure per l'autenticazione con il broker MQTT di Griglia di eventi. Questa impostazione funziona perché l'estensione Azure IoT Operations dispone delle autorizzazioni necessarie per pubblicare e sottoscrivere lo spazio degli argomenti di Griglia di eventi configurato tramite i ruoli controllo degli accessi in base al ruolo di Azure. Si noti che nella configurazione non sono necessari segreti, ad esempio nome utente o password.

Poiché il broker MQTT di Griglia di eventi richiede TLS, l'impostazione tls è abilitata. Non è necessario fornire un certificato CA attendibile, perché il broker MQTT di Griglia di eventi usa un'autorità di certificazione ampiamente attendibile.

Creare flussi di dati

Creare due flussi di dati con l'endpoint del broker MQTT di Azure IoT Operations come origine e l'endpoint Griglia di eventi di Azure come destinazione e viceversa. Non è necessario configurare la trasformazione.

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}
resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'local-to-remote'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'default'
          serializationFormat: 'Json'
          dataSources: array('tutorial/local')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'eventgrid'
          dataDestination: 'telemetry/aio'
        }
      }
    ]
  }
} 
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'remote-to-local'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'eventgrid'
          serializationFormat: 'Json'
          dataSources: array('telemetry/#')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'default'
          dataDestination: 'tutorial/cloud'
        }
      }
    ]
  }
}

Analogamente all'endpoint del flusso di dati, eseguire il comando seguente nel terminale:

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Insieme, i due flussi di dati formano un bridge MQTT, in cui:

  • Usare il broker MQTT di Griglia di eventi come broker remoto
  • Usare il broker MQTT di Operazioni IoT di Azure locale come broker locale
  • Usare TLS sia per broker remoti che per broker locali
  • Usare l'identità gestita assegnata dal sistema per l'autenticazione al broker remoto
  • Usare l'account del servizio Kubernetes per l'autenticazione nel broker locale
  • Usare la mappa degli argomenti per eseguire il mapping dell'argomento tutorial/local all'argomento telemetry/aio sul broker remoto
  • Usare la mappa degli argomenti per eseguire il mapping dell'argomento telemetry/# sul broker remoto all'argomento tutorial/cloud sul broker locale

Nota

Per impostazione predefinita, Le operazioni di Azure IoT distribuiscono un broker MQTT e un endpoint del flusso di dati del broker MQTT. L'endpoint del flusso di dati del broker MQTT viene usato per connettersi al broker MQTT. La configurazione predefinita usa il token predefinito dell'account del servizio per l'autenticazione. L'endpoint è denominato default ed è disponibile nello stesso spazio dei nomi delle operazioni IoT di Azure. L'endpoint viene usato come origine per il flusso di dati creato in questa esercitazione. Per altre informazioni sull'endpoint predefinito del flusso di dati del broker MQTT, vedere Endpoint predefinito del broker MQTT locale per operazioni IoT di Azure.

Quando si pubblica nell'argomento tutorial/local nel broker MQTT delle operazioni di Azure IoT locale, il messaggio viene indirizzato all'argomento telemetry/aio nel broker MQTT di Griglia di eventi remoto. Il messaggio viene quindi rifornito all'argomento tutorial/cloud (perché l'argomento telemetry/# con caratteri jolly lo acquisisce) nel broker MQTT delle operazioni IoT di Azure locale. Analogamente, quando si pubblica nell'argomento telemetry/aio nel broker MQTT di Griglia di eventi remoto, il messaggio viene indirizzato all'argomento tutorial/cloud nel broker MQTT delle operazioni IoT di Azure locale.

Distribuire il client MQTT

Per verificare che il bridge MQTT funzioni, distribuire un client MQTT nello stesso spazio dei nomi delle operazioni IoT di Azure.

Attualmente, Bicep non si applica per distribuire il client MQTT.

Avvia un sottoscrittore

Usare kubectl exec per avviare una shell nel pod client mosquitto.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

All'interno della shell avviare un sottoscrittore del gestore operazioni IoT di Azure nello spazio dell'argomento tutorial/# con mosquitto_sub.

mosquitto_sub --host aio-broker --port 18883 \
  -t "tutorial/#" \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Lasciare il comando in esecuzione e aprire una nuova finestra del terminale.

Pubblicare messaggi MQTT nel cloud tramite il bridge

In una nuova finestra del terminale, avviare un'altra shell nel pod client mosquitto.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

All'interno della shell, usare mosquitto per pubblicare cinque messaggi all'argomento tutorial/local.

mosquitto_pub -h aio-broker -p 18883 \
  -m "This message goes all the way to the cloud and back!" \
  -t "tutorial/local" \
  --repeat 5 --repeat-delay 1 -d \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Visualizzare i messaggi nel sottoscrittore

Nella shell del sottoscrittore vengono visualizzati i messaggi pubblicati.

Client null sending CONNECT
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received CONNACK (0)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending SUBSCRIBE (Mid: 1, Topic: tutorial/#, QoS: 0, Options: 0x00)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received SUBACK
Subscribed (mid: 1): 0
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP

Qui vengono visualizzati i messaggi pubblicati nel broker operazioni IoT di Azure locale nell'argomento tutorial/local , collegati al broker MQTT di Griglia di eventi e quindi nuovamente collegati al broker operatore IoT di Azure locale nell'argomento tutorial/cloud . I messaggi vengono quindi recapitati al sottoscrittore. In questo esempio, il tempo di round trip è di circa 80 ms.

Controllare le metriche di Griglia di eventi per verificare il recapito dei messaggi

È anche possibile controllare le metriche di Griglia di eventi per verificare che i messaggi vengano recapitati al broker MQTT di Griglia di eventi. Nella portale di Azure passare allo spazio dei nomi di Griglia di eventi creato. In Metriche>MQTT: Messaggi pubblicati correttamente. Il numero di messaggi pubblicati e recapitati dovrebbe aumentare quando si pubblicano messaggi nel broker operativo IoT di Azure locale.

Screenshot della vista delle metriche nel portale di Azure per mostrare messaggi MQTT riusciti.

Suggerimento

È possibile controllare le configurazioni dei flussi di dati, QoS e route dei messaggi con l'estensione dell'interfaccia az iot ops check --detail-level 2della riga di comando .

Passaggi successivi

In questa esercitazione si è appreso come configurare le operazioni di Azure IoT per il bridge MQTT bidirezionale con Griglia di eventi di Azure broker MQTT. Come passaggi successivi, esplorare gli scenari seguenti:

  • Per usare un client MQTT per pubblicare messaggi direttamente nel broker MQTT di Griglia di eventi, vedere Pubblicare messaggi MQTT nel broker MQTT di Griglia di eventi. Fornire al client un binding di autorizzazioni autore allo spazio degli argomenti creato; così facendo, sarà possibile pubblicare messaggi in qualsiasi argomento in telemetry, ad esempio telemetry/temperature o telemetry/humidity. Tutti questi messaggi vengono collegati all'argomento tutorial/cloud nel broker operativo IoT di Azure locale.
  • Per configurare le regole di gestione per il broker MQTT di Griglia di eventi, vedere Configurare le regole di routing per il broker MQTT di Griglia di eventi. È possibile usare le regole di gestione per instradare messaggi ad argomenti diversi in base al nome dell'argomento o per filtrare i messaggi in base al loro contenuto.