Dela via


Självstudie: Dubbelriktad MQTT-brygga till Azure Event Grid

Viktigt!

Den här sidan innehåller instruktioner för att hantera Azure IoT Operations-komponenter med hjälp av Kubernetes-distributionsmanifest, som finns i förhandsversion. Den här funktionen har flera begränsningar och bör inte användas för produktionsarbetsbelastningar.

Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.

I den här självstudien konfigurerar du en dubbelriktad MQTT-brygga mellan en Azure IoT Operations MQTT-mäklare och Azure Event Grid. Om du vill hålla självstudien enkel använder du standardinställningarna för Azure IoT Operations MQTT-koordinatorn och Azure Event Grid-slutpunkterna, och ingen transformering tillämpas.

Förutsättningar

Ange miljövariabler

Logga in med Azure CLI:

az login

Ange miljövariabler för resten av installationen. Ersätt värden i <> med giltiga värden eller namn som du väljer. Ett nytt Azure Event Grid-namnområde och ämnesutrymme skapas i din Azure-prenumeration baserat på de namn du anger:

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

Skapa Event Grid-namnområde med MQTT-asynkron meddelandekö aktiverat

Skapa Event Grid-namnrymd med Azure CLI. Platsen bör vara samma som den som du använde för att distribuera Azure IoT Operations.

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

eventgrid Om tillägget inte är installerat får du en fråga som frågar om du vill installera det. Välj Y för att installera tillägget.

Genom att topic-spaces-configurationange skapar det här kommandot ett namnområde med:

  • MQTT-asynkron meddelandekö aktiverad
  • Maximalt antal klientsessioner per autentiseringsnamn som 3.

Med alternativet för maximala klientsessioner kan Azure IoT Operations MQTT skapa flera instanser och fortfarande ansluta. Mer information finns i stöd för flera sessioner.

Skapa ett ämnesutrymme

I Event Grid-namnområdet skapar du ett ämnesutrymme med namnet tutorial med en ämnesmall telemetry/#.

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

Genom att använda # jokertecknet i ämnesmallen kan du publicera till vilket ämne som helst under ämnesutrymmet telemetry . Exempel: telemetry/temperature eller telemetry/humidity.

Ge Azure IoT Operations åtkomst till Event Grid-ämnesutrymmet

Använd Azure CLI och leta reda på huvud-ID:t för Azure IoT Operations Arc-tillägget. Kommandot lagrar huvud-ID:t i en variabel för senare användning.

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

Anteckna utdatavärdet för identity.principalId, som är ett GUID-värde med följande format:

aaaaaaaa-bbbb-cccc-1111-222222222222

Använd sedan Azure CLI för att tilldela utgivar- och prenumerantroller till Azure IoT Operations MQTT för det ämnesutrymme som du skapade.

Tilldela utgivarrollen:

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

Tilldela prenumerantrollen:

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

Dricks

Omfånget matchar id det ämnesutrymme som du skapade med az eventgrid namespace topic-space create i föregående steg, och du hittar det i kommandots utdata.

Värdnamn för Event Grid MQTT-koordinator

Använd Azure CLI för att hämta värdnamnet för Event Grid MQTT-koordinatorn.

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

Anteckna utdatavärdet för topicSpacesConfiguration.hostname det är ett värdnamnsvärde som ser ut så här:

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

Skapa en Azure Event Grid-slutpunkt för dataflöde

Skapa dataflödesslutpunkt för Azure Event Grid. Den här slutpunkten är målet för dataflödet som skickar meddelanden till Azure Event Grid. Ersätt <EVENT_GRID_HOSTNAME> med MQTT-värdnamnet som du fick från föregående steg. Inkludera portnumret 8883.

Dataflödes- och dataflödesslutpunkterna Azure Event Grid kan distribueras som Azure-standardresurser eftersom de har Implementeringar av Azure Resource Provider (RPs). Den här Bicep-mallfilen från Bicep File for MQTT-bridge dataflow Tutorial distribuerar nödvändiga dataflödes- och dataflödesslutpunkter.

Ladda ned filen till din lokala fil och ersätt värdena för customLocationName, aioInstanceNamemed eventGridHostName din.

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

Kör sedan följande kommando i terminalen. Ersätt <FILE> med namnet på den Bicep-fil som du laddade ned.

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

Här är autentiseringsmetoden inställd på att SystemAssignedManagedIdentity använda den hanterade identiteten för Azure IoT Operations-tillägget för att autentisera med Event Grid MQTT-koordinatorn. Den här inställningen fungerar eftersom Azure IoT Operations-tillägget har de behörigheter som krävs för att publicera och prenumerera på Event Grid-ämnesutrymmet som konfigurerats via Azure RBAC-roller. Observera att inga hemligheter, till exempel användarnamn eller lösenord, behövs i konfigurationen.

Eftersom Event Grid MQTT-asynkron tls meddelandekö kräver TLS är inställningen aktiverad. Du behöver inte ange ett betrott CA-certifikat eftersom Event Grid MQTT-koordinatorn använder en allmänt betrodd certifikatutfärdare.

Skapa dataflöden

Skapa två dataflöden med Azure IoT Operations MQTT-koordinatorslutpunkten som källa och Azure Event Grid-slutpunkten som mål, och vice versa. Du behöver inte konfigurera transformering.

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

Precis som dataflödesslutpunkten kör du följande kommando i terminalen:

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

Tillsammans bildar de två dataflödena en MQTT-brygga, där du:

  • Använd Event Grid MQTT-asynkron meddelandekö som fjärrkoordinator
  • Använd den lokala Azure IoT Operations MQTT-koordinatorn som lokal koordinator
  • Använda TLS för både fjärranslutna och lokala mäklare
  • Använda systemtilldelad hanterad identitet för autentisering till fjärrkoordinatorn
  • Använda Kubernetes-tjänstkontot för autentisering till den lokala koordinatorn
  • Använd ämneskartan för att mappa tutorial/local ämnet till ämnet telemetry/aio på fjärrkoordinatorn
  • Använd ämneskartan för att mappa telemetry/# ämnet på fjärrkoordinatorn till ämnet tutorial/cloud på den lokala mäklaren

Kommentar

Som standard distribuerar Azure IoT Operations en MQTT-koordinator samt en MQTT-asynkron dataflödesslutpunkt. MQTT-asynkron dataflödesslutpunkten används för att ansluta till MQTT-asynkron meddelandekö. Standardkonfigurationen använder den inbyggda tjänstkontotoken för autentisering. Slutpunkten heter default och är tillgänglig i samma namnområde som Azure IoT Operations. Slutpunkten används som källa för det dataflöde som skapades i den här självstudien. Mer information om standardslutpunkten för MQTT-koordinatordataflöde finns i Azure IoT Operations lokala standardslutpunkt för MQTT-koordinator.

När du publicerar till ämnet tutorial/local på den lokala Azure IoT Operations MQTT-asynkron meddelandekö, överbryggas meddelandet till telemetry/aio ämnet på fjärrhändelsenätets MQTT-asynkron meddelandekö. Meddelandet bryggs sedan tillbaka till tutorial/cloud ämnet (eftersom jokerteckenavsnittet telemetry/# samlar in det) på den lokala Azure IoT Operations MQTT-asynkron meddelandekö. På samma sätt, när du publicerar till telemetry/aio ämnet på fjärrhändelsenätets MQTT-asynkron meddelandekö, överbryggas meddelandet till tutorial/cloud ämnet på den lokala Azure IoT Operations MQTT-koordinatorn.

Distribuera MQTT-klient

Om du vill kontrollera att MQTT-bryggan fungerar distribuerar du en MQTT-klient till samma namnområde som Azure IoT Operations.

För närvarande gäller inte Bicep för att distribuera MQTT-klienten.

Starta en prenumerant

Använd kubectl exec för att starta ett gränssnitt i mosquitto-klientpodden.

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

I gränssnittet startar du en prenumerant på Azure IoT Operations Broker i ämnesutrymmet tutorial/# med 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)

Låt kommandot köras och öppna ett nytt terminalfönster.

Publicera MQTT-meddelanden till molnet via bryggan

Starta ett nytt gränssnitt i mosquitto-klientpodden i ett nytt terminalfönster.

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

I gränssnittet använder du mosquitto för att publicera fem meddelanden till ämnet 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)

Visa meddelandena i prenumeranten

I prenumerantgränssnittet ser du de meddelanden som du publicerade.

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

Här ser du att meddelandena publiceras till den lokala Azure IoT Operations-asynkron meddelandekö till tutorial/local ämnet, bryggs till Event Grid MQTT-asynkron meddelandekö och sedan bryggs tillbaka till den lokala Azure IoT Operations-koordinatorn igen i ämnet tutorial/cloud . Meddelandena levereras sedan till prenumeranten. I det här exemplet är tur och retur-tiden cirka 80 ms.

Kontrollera Event Grid-mått för att verifiera meddelandeleveransen

Du kan också kontrollera Event Grid-måtten för att kontrollera att meddelandena levereras till Event Grid MQTT-koordinatorn. I Azure Portal går du till Event Grid-namnområdet som du skapade. Under Mått>MQTT: Lyckade publicerade meddelanden. Du bör se att antalet publicerade och levererade meddelanden ökar när du publicerar meddelanden till den lokala Azure IoT Operations-asynkron meddelandekö.

Skärmbild av måttvyn i Azure Portal för att visa lyckade MQTT-meddelanden.

Dricks

Du kan kontrollera konfigurationerna av dataflöden, QoS och meddelandevägar med CLI-tillägget az iot ops check --detail-level 2.

Nästa steg

I den här självstudien har du lärt dig hur du konfigurerar Azure IoT-åtgärder för dubbelriktad MQTT-brygga med Azure Event Grid MQTT-koordinator. Utforska följande scenarier i nästa steg:

  • Information om hur du använder en MQTT-klient för att publicera meddelanden direkt till Event Grid MQTT-asynkron meddelandekö finns i Publicera MQTT-meddelanden till Event Grid MQTT-asynkron meddelandekö. Ge klienten en utgivarbehörighetsbindning till det ämnesutrymme som du skapade och du kan publicera meddelanden till valfritt ämne under telemetry, som telemetry/temperature eller telemetry/humidity. Alla dessa meddelanden är överbryggda till ämnet tutorial/cloud på den lokala Azure IoT Operations-koordinatorn.
  • Information om hur du konfigurerar routningsregler för Event Grid MQTT-asynkronisering finns i Konfigurera routningsregler för Event Grid MQTT-koordinator. Du kan använda routningsregler för att dirigera meddelanden till olika ämnen baserat på ämnesnamnet eller för att filtrera meddelanden baserat på meddelandeinnehållet.