Freigeben über


Tutorial: Konfigurieren der MQTT-Bridge zwischen der Azure IoT MQ-Vorschau und Azure Event Grid

Wichtig

Die von Azure Arc aktivierte Azure IoT Operations Preview befindet sich derzeit in der VORSCHAU. Sie sollten diese Vorschausoftware nicht in Produktionsumgebungen verwenden.

Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.

In diesem Tutorial erfahren Sie, wie Sie IoT MQ für bidirektionale MQTT-Bridge mit dem Azure Event Grid MQTT-Broker PaaS konfigurieren. Sie können diese Funktion verwenden, um Ihre IoT-Daten am Edge und in der Cloud zu verarbeiten. Sie können beispielsweise IoT MQ verwenden, um Telemetriedaten am Edge-Bereich zu verarbeiten und dann die Daten zum Azure Event Grid für die weitere Verarbeitung in der Cloud zu überbrücken.

Voraussetzungen

Festlegen von Umgebungsvariablen

Anmelden mit der Azure CLI:

az login

Legen Sie Umgebungsvariablen für den Rest des Setups fest. Ersetzen Sie Werte in <> durch gültige Werte oder Namen Ihrer Wahl. Auf der Grundlage der von Ihnen angegebenen Namen werden in Ihrem Azure-Abonnement ein neuer Azure Event Grid-Namespace und ein Themenbereich erstellt:

# 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-Namespace mit aktiviertem MQTT-Broker erstellen

Erstellen eines Event Grid-Namespace mit Azure CLI. Der Speicherort sollte mit dem Speicherort übereinstimmen, den Sie zum Bereitstellen von Azure IoT Operations verwendet haben.

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

Durch Festlegen des topic-spaces-configuration erstellt dieser Befehl einen Namespace mit:

  • MQTT-Broker aktiviert
  • Maximale Clientsitzungen pro Authentifizierungsname als 3.

Mit der Option für max. Clientsitzungen kann IoT MQ mehrere Instanzen erzeugen und trotzdem eine Verbindung herstellen. Weitere Informationen finden Sie unter Unterstützung für mehrere Sitzungen.

Erstellen eines Themenbereichs

Erstellen Sie im Event Grid-Namespace einen Themenbereich tutorial mit einer Themenvorlage telemetry/#.

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

Mithilfe des Platzhalters # in der Themenvorlage können Sie in jedem Thema im telemetry Themenbereich veröffentlichen. Zum Beispiel: telemetry/temperature oder telemetry/humidity.

Gewähren des Zugangs zum Event Grid Themenbereich für die Azure IoT MQ-Vorschau

Suchen Sie mithilfe von az k8s-extension show die Prinzipal-ID für die Arc-Erweiterung von Azure IoT-MQ. Der Befehl speichert die Prinzipal-ID in einer Variablen für die spätere Verwendung.

export PRINCIPAL_ID=$(az k8s-extension show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name mq \
  --cluster-type connectedClusters \
  --query identity.principalId -o tsv)
echo $PRINCIPAL_ID

Notieren Sie sich den Ausgabewert für identity.principalId, bei dem es sich um einen GUID-Wert mit dem folgenden Format handelt:

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

Verwenden Sie dann Azure CLI, um Herausgeber- und Abonnentenrollen zu IoT MQ für den von Ihnen erstellten Themenbereich zuzuweisen.

Zuweisen der Herausgeberrolle:

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

Zuweisen der Abonnentenrolle:

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

Tipp

Der Umfang entspricht dem id des Themenbereichs, den Sie mit az eventgrid namespace topic-space create im vorherigen Schritt erstellt haben. Sie können ihn der Ausgabe des Befehls finden.

Hostname des Event Grid MQTT-Brokers

Verwenden Sie Azure CLI, um den Hostnamen des Event Grid MQTT-Brokers abzurufen.

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

Notieren Sie sich den Ausgabewert für topicSpacesConfiguration.hostname, bei dem es sich um einen Hostnamenwert handelt, der wie folgt aussieht:

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

Erstellen eines MQTT-Bridge-Connectors und Themenzuordnungsressourcen

Geben Sie in einer neuen Datei mit dem Namen bridge.yaml den MQTT-Bridge-Connector und die Themenzuordnungskonfiguration an. Ersetzen Sie den Beispielplatzhalterwert in remoteBrokerConnectionendpoint durch den Event Grid MQTT-Hostnamen aus dem vorherigen Schritt. Schließen Sie die Portnummer 8883 ein.

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeConnector
metadata:
  name: tutorial-bridge
  namespace: azure-iot-operations
spec:
  image: 
    repository: mcr.microsoft.com/azureiotoperations/mqttbridge
    tag: 0.4.0-preview
    pullPolicy: IfNotPresent
  protocol: v5
  bridgeInstances: 2
  logLevel: debug
  remoteBrokerConnection:
    endpoint: example.region-1.ts.eventgrid.azure.net:8883
    tls:
      tlsEnabled: true
    authentication:
      systemAssignedManagedIdentity:
        audience: https://eventgrid.azure.net
  localBrokerConnection:
    endpoint: aio-mq-dmqtt-frontend:8883
    tls:
      tlsEnabled: true
      trustedCaCertificateConfigMap: aio-ca-trust-bundle-test-only
    authentication:
      kubernetes: {}
---
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeTopicMap
metadata:
  name: tutorial-topic-map
  namespace: azure-iot-operations 
spec:
  mqttBridgeConnectorRef: tutorial-bridge
  routes:
    - direction: local-to-remote
      name: publish
      source: tutorial/local
      target: telemetry/iot-mq
      qos: 1
    - direction: remote-to-local
      name: subscribe
      source: telemetry/#
      target: tutorial/cloud
      qos: 1

Sie konfigurieren den MQTT-Bridge-Connector folgendermaßen:

  • Verwenden des Event Grid MQTT-Brokers als Remote-Broker
  • Verwenden des lokalen IoT MQ-Brokers als lokalen Broker
  • Verwenden von TLS für Remote-Broker und lokale Broker
  • Verwenden der systemseitig zugewiesenen verwalteten Identität für die Authentifizierung bei dem Remote-Broker
  • Verwenden des Kubernetes-Dienstkontos für die Authentifizierung für den lokalen Broker
  • Verwenden der Themenzuordnung zum Zuordnen des Themas tutorial/local zum Thema telemetry/iot-mq des Remote-Brokers
  • Verwenden Sie die Themenzuordnung, um das Thema telemetry/# auf dem Remote-Broker dem Thema tutorial/cloud auf dem lokalen Broker zuzuordnen

Wenn Sie im Thema tutorial/local zum lokalen IoT MQ-Broker veröffentlichen, wird die Nachricht mit dem Thema telemetry/iot-mq zum Remote Event Grid MQTT-Broker überbrückt. Anschließend wird die Nachricht zurück zum Thema tutorial/cloud zum lokalen IoT MQ-Broker überbrückt. Ebenso wird die Nachricht, wenn Sie das Thema telemetry/iot-mq auf dem Remote Event Grid MQTT Broker veröffentlichen, mit dem Thema tutorial/cloud zum lokalen IoT MQ Broker überbrückt.

Wenden Sie die Bereitstellungsdatei mit kubectl an.

kubectl apply -f bridge.yaml
mqttbridgeconnector.mq.iotoperations.azure.com/tutorial-bridge created
mqttbridgetopicmap.mq.iotoperations.azure.com/tutorial-topic-map created

Überprüfen der MQTT-Brückenbereitstellung

Verwenden Sie kubectl, um zu überprüfen, ob die beiden Brückeninstanzen bereit und ausgeführt werden.

kubectl get pods -n azure-iot-operations -l app=aio-mq-mqttbridge
NAME                       READY   STATUS    RESTARTS   AGE
aio-mq-tutorial-bridge-0   1/1     Running   0          45s
aio-mq-tutorial-bridge-1   1/1     Running   0          45s

Sie können jetzt auf dem lokalen Broker veröffentlichen und den Event Grid MQTT Broker abonnieren und den Nachrichtenfluss wie erwartet überprüfen.

Bereitstellen des MQTT-Clients

Um zu überprüfen, ob die MQTT-Brücke funktioniert, stellen Sie einen MQTT-Client auf dem selben Namespace wie IoT MQ bereit. Geben Sie in einer neuen Datei mit dem Namen client.yaml die Clientbereitstellung an:

apiVersion: v1
kind: Pod
metadata:
  name: mqtt-client
  namespace: azure-iot-operations
spec:
  serviceAccountName: mqtt-client
  containers:
  - image: alpine
    name: mqtt-client
    command: ["sh", "-c"]
    args: ["apk add mosquitto-clients mqttui && sleep infinity"]
    volumeMounts:
    - name: mq-sat
      mountPath: /var/run/secrets/tokens
    - name: trust-bundle
      mountPath: /var/run/certs
  volumes:
  - name: mq-sat
    projected:
      sources:
      - serviceAccountToken:
          path: mq-sat
          audience: aio-mq
          expirationSeconds: 86400
  - name: trust-bundle
    configMap:
      name: aio-ca-trust-bundle-test-only

Wenden Sie die Bereitstellungsdatei mit kubectl an.

kubectl apply -f client.yaml
pod/mqtt-client created

Starten eines Abonnenten

Verwenden Sie kubectl exec, um eine Shell im Mosquitto-Client-Pod zu starten.

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

Starten Sie innerhalb der Shell einen Abonnenten des IoT MQ Brokers im Themenbereich tutorial/# mit mqttui.

mqttui log "tutorial/#" \
-b mqtts://aio-mq-dmqtt-frontend:8883 \
-u '$sat' \
--password $(cat /var/run/secrets/tokens/mq-sat) \
--insecure

Lassen Sie den Befehl laufen und öffnen Sie ein neues Terminalfenster.

Veröffentlichen von MQTT-Nachrichten in der Cloud über die Brücke

Starten Sie in einem neuen Terminalfenster eine weitere Shell im Mosquitto-Client-Pod.

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

Verwenden Sie mosquitto in der Shell, um fünf Nachrichten im Thema tutorial/local zu veröffentlichen.

mosquitto_pub -h aio-mq-dmqtt-frontend -p 8883 \
-m "This message goes all the way to the cloud and back!" \
-t "tutorial/local" -u '$sat' -P $(cat /var/run/secrets/tokens/mq-sat) \
--cafile /var/run/certs/ca.crt \
--repeat 5 --repeat-delay 1 -d

Anzeigen der Nachrichten im Abonnenten

In der Abonnentenshell werden die von Ihnen veröffentlichten Nachrichten angezeigt.

23:17:50.802 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.086 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.803 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.804 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.805 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.895 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.807 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.881 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!

Hier sehen Sie, dass die Nachrichten im lokalen IoT MQ-Broker im tutorial/local Thema veröffentlicht werden, zu Event Grid MQTT Broker überbrückt und dann wieder zum lokalen IoT MQ Broker im Thema tutorial/cloud überbrückt. Die Nachrichten werden dann an den Abonnenten übermittelt. In diesem Beispiel beträgt die Roundtrip-Zeit etwa 80 ms.

Überprüfen von Event Grid-Metriken, um die Nachrichtenübermittlung zu überprüfen

Sie können auch die Event-Grid-Metriken überprüfen, um zu verifizieren, dass die Nachrichten an den Event Grid MQTT-Broker übermittelt werden. Navigieren Sie im Azure-Portal zum von Ihnen erstellten Event Grid-Namespace. Unter Metriken>MQTT: Erfolgreich veröffentlichte Nachrichten. Die Anzahl der veröffentlichten und übermittelten Nachrichten sollte beim Veröffentlichen von Nachrichten an den lokalen IoT MQ-Broker erhöht werden.

Screenshot of the metrics view in Azure portal to show successful MQTT messages.

Tipp

Sie können die Konfigurationen von Themenkarten, QoS und Nachrichtenrouten mit der CLI-Erweiterungaz iot ops check --detail-level 2 überprüfen.

Nächste Schritte

In diesem Tutorial haben Sie gelernt, wie man IoT MQ für bidirektionale MQTT-Bridge mit dem Azure Event Grid MQTT-Broker PaaS konfiguriert. Erkunden Sie als Nächstes die folgenden Szenarien:

  • Wenn Sie einen MQTT-Client verwenden möchten, um Nachrichten direkt im Event Grid MQTT-Broker zu veröffentlichen, lesen Sie Veröffentlichen von MQTT-Nachrichten im Event Grid MQTT-Broker. Weisen Sie dem Client eine Herausgeberberechtigungsbindung an den von Ihnen erstellten Themenbereich zu, und Sie können Nachrichten in einem beliebigen Thema unter dem telemetry veröffentlichen, wie telemetry/temperature oder telemetry/humidity. All diese Nachrichten werden mit dem Thema tutorial/cloud auf dem lokalen IoT MQ-Broker überbrückt.
  • Zum Einrichten von Routingregeln für den Event Grid MQTT-Broker, siehe Konfigurieren von Routingregeln für den Event Grid MQTT-Broker. Mithilfe von Routingregeln können Sie Nachrichten basierend auf dem Themennamen an verschiedene Themen weiterleiten oder Nachrichten basierend auf dem Nachrichteninhalt filtern.