Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
- Azure IoT-åtgärder. Se Distribuera Azure IoT-åtgärder.
- Dataflödesprofil. Se Konfigurera dataflödesprofil.
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 sensor/#.
az eventgrid namespace topic-space create \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --name tutorial \
  --topic-templates "sensor/#"
Genom att använda # jokertecknet i ämnesmallen kan du publicera till vilket ämne som helst under ämnesutrymmet sensor . Exempel: sensor/temperature eller sensor/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-dataflödesslutpunkt
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 Standard Azure-resurser eftersom de har Implementeringar av Azure Resource Provider (RPs). Den här Bicep-filen i Bicep File for MQTT-bridge data flow Tutorial distribuerar de nödvändiga dataflödena och dataflödesslutpunkterna.
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: 'sensor/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('sensor/#')
        }
      }
      {
        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 ämnetsensor/aiopå fjärrkoordinatorn
- Använd ämneskartan för att mappa sensor/#ämnet på fjärrkoordinatorn till ämnettutorial/cloudpå den lokala mäklaren
Kommentar
Som standard distribuerar Azure IoT Operations en MQTT-koordinator samt en MQTT-asynkron dataflödesslutpunkt. MQTT-koordinatorns dataflödesslutpunkt 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 dataflödet 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 sensor/aio ämnet på fjärrhändelsenätets MQTT-asynkron meddelandekö. Meddelandet bryggs sedan tillbaka till tutorial/cloud ämnet (eftersom jokerteckenavsnittet sensor/# samlar in det) på den lokala Azure IoT Operations MQTT-asynkron meddelandekö. På samma sätt, när du publicerar till sensor/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ö.
              
               
              
              
            
Dricks
Du kan kontrollera konfigurationerna av dataflöden, QoS och meddelandevägar med CLI-tilläggetaz 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 sensor, somsensor/temperatureellersensor/humidity. Alla dessa meddelanden är överbryggda till ämnettutorial/cloudpå 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.