Delen via


Zelfstudie: Bidirectionele MQTT-brug naar Azure Event Grid

Belangrijk

Deze pagina bevat instructies voor het beheren van Azure IoT Operations-onderdelen met behulp van Kubernetes-implementatiemanifesten, die in preview zijn. Deze functie is voorzien van verschillende beperkingen en mag niet worden gebruikt voor productieworkloads.

Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

In deze zelfstudie stelt u een bidirectionele MQTT-brug in tussen een Azure IoT Operations MQTT-broker en Azure Event Grid. Als u de zelfstudie eenvoudig wilt houden, gebruikt u de standaardinstellingen voor de Azure IoT Operations MQTT-broker en Azure Event Grid-eindpunten en wordt er geen transformatie toegepast.

Vereisten

Omgevingsvariabelen instellen

Meld u aan met Azure CLI:

az login

Stel omgevingsvariabelen in voor de rest van de installatie. Vervang waarden door <> geldige waarden of namen van uw keuze. Er wordt een nieuwe Azure Event Grid-naamruimte en onderwerpruimte gemaakt in uw Azure-abonnement op basis van de namen die u opgeeft:

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

Event Grid-naamruimte maken waarvoor MQTT-broker is ingeschakeld

Een Event Grid-naamruimte maken met Azure CLI. De locatie moet hetzelfde zijn als de locatie die u hebt gebruikt voor het implementeren van Azure IoT-bewerkingen.

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

Als de eventgrid extensie niet is geïnstalleerd, wordt u gevraagd of u de extensie wilt installeren. Selecteer Y deze optie om de extensie te installeren.

Door de topic-spaces-configurationopdracht in te stellen, wordt met deze opdracht een naamruimte gemaakt met:

  • MQTT-broker ingeschakeld
  • Maximum aantal clientsessies per verificatienaam als 3.

Met de optie voor maximale clientsessies kan Azure IoT Operations MQTT meerdere exemplaren spawnen en nog steeds verbinding maken. Zie ondersteuning voor meerdere sessies voor meer informatie.

Een onderwerpruimte maken

Maak in de Event Grid-naamruimte een onderwerpruimte met de naam tutorial met een onderwerpsjabloon telemetry/#.

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

Met behulp van het # jokerteken in de onderwerpsjabloon kunt u publiceren naar elk onderwerp onder de telemetry onderwerpruimte. Bijvoorbeeld telemetry/temperature of telemetry/humidity.

Azure IoT-bewerkingen toegang geven tot de Event Grid-onderwerpruimte

Zoek met behulp van Azure CLI de principal-id voor de Azure IoT Operations Arc-extensie. Met de opdracht wordt de principal-id opgeslagen in een variabele voor later gebruik.

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

Noteer de uitvoerwaarde, identity.principalIdeen GUID-waarde met de volgende indeling:

aaaaaaaa-bbbb-cccc-1111-222222222222

Gebruik vervolgens Azure CLI om uitgevers- en abonneerollen toe te wijzen aan Azure IoT Operations MQTT voor de onderwerpruimte die u hebt gemaakt.

Wijs de rol van uitgever toe:

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

Wijs de rol abonnee toe:

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

Tip

Het bereik komt overeen met az eventgrid namespace topic-space create de id onderwerpruimte waarmee u in de vorige stap hebt gemaakt en u vindt het in de uitvoer van de opdracht.

Event Grid MQTT-brokerhostnaam

Gebruik Azure CLI om de Event Grid MQTT-brokerhostnaam op te halen.

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

Noteer de uitvoerwaarde waarvoor topicSpacesConfiguration.hostname dit een hostnaamwaarde is die er als volgt uitziet:

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

Een Azure Event Grid-gegevensstroomeindpunt maken

Maak een gegevensstroomeindpunt voor Azure Event Grid. Dit eindpunt is de bestemming voor de gegevensstroom die berichten naar Azure Event Grid verzendt. Vervang <EVENT_GRID_HOSTNAME> door de MQTT-hostnaam die u hebt gekregen uit de vorige stap. Neem het poortnummer 8883op.

De gegevensstroom- en gegevensstroomeindpunten van Azure Event Grid kunnen worden geïmplementeerd als standaard Azure-resources, omdat ze implementaties van Azure Resource Provider (RPs) hebben. Dit Bicep-sjabloonbestand van Bicep-bestand voor MQTT-bridge-gegevensstroom implementeert de benodigde gegevensstroom- en gegevensstroomeindpunten.

Download het bestand naar uw lokale locatie en zorg ervoor dat u de waarden voor customLocationName, aioInstanceNameeventGridHostName vervangt door die van u.

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

Voer vervolgens de volgende opdracht uit in uw terminal. Vervang door <FILE> de naam van het Bicep-bestand dat u hebt gedownload.

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

Hier is de verificatiemethode ingesteld om SystemAssignedManagedIdentity de beheerde identiteit van de Azure IoT Operations-extensie te gebruiken voor verificatie met de Event Grid MQTT-broker. Deze instelling werkt omdat de Azure IoT Operations-extensie over de benodigde machtigingen beschikt voor het publiceren en abonneren op de Event Grid-onderwerpruimte die is geconfigureerd via Azure RBAC-rollen. U ziet dat er geen geheimen, zoals gebruikersnaam of wachtwoord, nodig zijn in de configuratie.

Omdat voor de Event Grid MQTT-broker TLS is vereist, is de tls instelling ingeschakeld. U hoeft geen vertrouwd CA-certificaat op te geven, omdat de Event Grid MQTT-broker gebruikmaakt van een algemeen vertrouwde certificeringsinstantie.

Gegevensstromen maken

Maak twee gegevensstromen met het Azure IoT Operations MQTT-brokereindpunt als de bron en het Azure Event Grid-eindpunt als de bestemming en vice versa. U hoeft transformatie niet te configureren.

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

Voer net als het gegevensstroomeindpunt de volgende opdracht uit in uw terminal:

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

Samen vormen de twee gegevensstromen een MQTT-brug, waar u:

  • De Event Grid MQTT-broker gebruiken als externe broker
  • De lokale Azure IoT Operations MQTT-broker gebruiken als de lokale broker
  • TLS gebruiken voor externe en lokale brokers
  • Door het systeem toegewezen beheerde identiteit gebruiken voor verificatie bij de externe broker
  • Kubernetes-serviceaccount gebruiken voor verificatie bij de lokale broker
  • Gebruik de onderwerptoewijzing om het tutorial/local onderwerp toe te wijzen aan het telemetry/aio onderwerp op de externe broker
  • Gebruik de onderwerptoewijzing om het telemetry/# onderwerp op de externe broker toe te wijzen aan het tutorial/cloud onderwerp over de lokale broker

Notitie

Standaard implementeert Azure IoT Operations een MQTT-broker en een MQTT-brokergegevensstroomeindpunt. Het eindpunt van de MQTT-brokergegevensstroom wordt gebruikt om verbinding te maken met de MQTT-broker. De standaardconfiguratie maakt gebruik van het ingebouwde serviceaccounttoken voor verificatie. Het eindpunt heeft de naam default en is beschikbaar in dezelfde naamruimte als Azure IoT Operations. Het eindpunt wordt gebruikt als de bron voor de gegevensstroom die in deze zelfstudie is gemaakt. Zie het standaardeindpunt van de MQTT-brokerbroker voor meer informatie over het standaardeindpunt van de MQTT-broker.

Wanneer u publiceert naar het tutorial/local onderwerp over de lokale Azure IoT Operations MQTT-broker, wordt het bericht overbrugd naar het telemetry/aio onderwerp in de externe Event Grid MQTT-broker. Vervolgens wordt het bericht teruggezet naar het tutorial/cloud onderwerp (omdat het telemetry/# jokertekenonderwerp het vastlegt) op de lokale Azure IoT Operations MQTT-broker. Wanneer u publiceert naar het telemetry/aio onderwerp op de externe Event Grid MQTT-broker, wordt het bericht overbrugd naar het tutorial/cloud onderwerp over de lokale Azure IoT Operations MQTT-broker.

MQTT-client implementeren

Als u wilt controleren of de MQTT-brug werkt, implementeert u een MQTT-client in dezelfde naamruimte als Azure IoT Operations.

Bicep is momenteel niet van toepassing op het implementeren van MQTT-client.

Een abonnee starten

Gebruik kubectl exec dit om een shell te starten in de mosquitto-clientpod.

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

Start in de shell een abonnee op de Azure IoT Operations-broker in de tutorial/# onderwerpruimte met 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)

Laat de opdracht actief en open een nieuw terminalvenster.

MQTT-berichten publiceren naar de cloud via de brug

Start in een nieuw terminalvenster een andere shell in de mosquitto-clientpod.

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

Gebruik mosquitto in de shell om vijf berichten naar het tutorial/local onderwerp te publiceren.

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)

De berichten in de abonnee weergeven

In de abonneeshell ziet u de berichten die u hebt gepubliceerd.

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

Hier ziet u dat de berichten worden gepubliceerd naar de lokale Azure IoT Operations-broker naar het tutorial/local onderwerp, overbrugd naar Event Grid MQTT-broker en vervolgens weer worden overbrugd naar de lokale Azure IoT Operations-broker in het tutorial/cloud onderwerp. De berichten worden vervolgens bezorgd bij de abonnee. In dit voorbeeld is de retourtijd ongeveer 80 ms.

Metrische gegevens van Event Grid controleren om de bezorging van berichten te controleren

U kunt ook de metrische gegevens van Event Grid controleren om te controleren of de berichten worden bezorgd bij de Event Grid MQTT-broker. Ga in Azure Portal naar de Event Grid-naamruimte die u hebt gemaakt. Onder MQTT voor metrische gegevens>: gepubliceerde berichten zijn geslaagd. Als het goed is, wordt het aantal gepubliceerde en bezorgde berichten verhoogd naarmate u berichten publiceert naar de lokale Azure IoT Operations-broker.

Schermopname van de weergave metrische gegevens in Azure Portal om geslaagde MQTT-berichten weer te geven.

Tip

U kunt de configuraties van gegevensstromen, QoS en berichtroutes controleren met de CLI-extensieaz iot ops check --detail-level 2.

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u Azure IoT Operations configureert voor bidirectionele MQTT-brug met Azure Event Grid MQTT-broker. Bekijk de volgende scenario's als volgende stappen: