Samouczek: konfigurowanie mostka MQTT między usługą Azure IoT MQ (wersja zapoznawcza) i usługą Azure Event Grid

Ważne

Usługa Azure IoT Operations Preview — włączona przez usługę Azure Arc jest obecnie dostępna w wersji zapoznawczej. Nie należy używać tego oprogramowania w wersji zapoznawczej w środowiskach produkcyjnych.

Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.

Z tego samouczka dowiesz się, jak skonfigurować usługę IoT MQQ na potrzeby dwukierunkowego mostka MQTT za pomocą brokera MQTT usługi Azure Event Grid PaaS. Za pomocą tej funkcji można przetwarzać dane IoT na urządzeniach brzegowych i w chmurze. Na przykład można użyć usługi IoT MQ do przetwarzania danych telemetrycznych na brzegu, a następnie połączyć dane z usługą Azure Event Grid w celu dalszego przetwarzania w chmurze.

Wymagania wstępne

Ustawianie zmiennych środowiskowych

Zaloguj się przy użyciu interfejsu wiersza polecenia platformy Azure:

az login

Ustaw zmienne środowiskowe dla pozostałej części konfiguracji. Zastąp wartości <> prawidłowymi wartościami lub wybranymi nazwami. Nowa przestrzeń nazw usługi Azure Event Grid i przestrzeń tematów są tworzone w ramach subskrypcji platformy Azure na podstawie nazw, które podajesz:

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

Tworzenie przestrzeni nazw usługi Event Grid z włączonym brokerem MQTT

Tworzenie przestrzeni nazw usługi Event Grid za pomocą interfejsu wiersza polecenia platformy Azure. Lokalizacja powinna być taka sama jak lokalizacja użyta do wdrożenia operacji usługi Azure IoT.

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

Ustawiając polecenie topic-spaces-configuration, to polecenie tworzy przestrzeń nazw z następującymi elementami:

  • Broker MQTT włączony
  • Maksymalna liczba sesji klienta na nazwę uwierzytelniania jako 3.

Opcja maksymalna sesji klienta umożliwia usłudze IoT MQ duplikowania wielu wystąpień i nadal nawiązywać połączenia. Aby dowiedzieć się więcej, zobacz Obsługa wielu sesji.

Tworzenie obszaru tematu

W przestrzeni nazw usługi Event Grid utwórz przestrzeń tematu o nazwie tutorial z szablonem tematu telemetry/#.

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

Używając symbolu wieloznakowego # w szablonie tematu, możesz opublikować go w dowolnym temacie w obszarze tematu telemetry . Na przykład: telemetry/temperature lub telemetry/humidity.

Przyznawanie usłudze Azure IoT MQ (wersja zapoznawcza) dostępu do obszaru tematu usługi Event Grid

Za pomocą polecenia az k8s-extension showznajdź identyfikator podmiotu zabezpieczeń dla rozszerzenia usługi Azure IoT MQ Arc. Polecenie przechowuje identyfikator podmiotu zabezpieczeń w zmiennej do późniejszego użycia.

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

Zanotuj wartość wyjściową elementu identity.principalId, która jest wartością identyfikatora GUID w następującym formacie:

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

Następnie użyj interfejsu wiersza polecenia platformy Azure, aby przypisać role wydawcy i subskrybenta do usługi IoT MQ dla utworzonego obszaru tematu.

Przypisz rolę wydawcy:

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

Przypisz rolę subskrybenta:

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

Napiwek

Zakres pasuje do id obszaru tematu utworzonego az eventgrid namespace topic-space create w poprzednim kroku i można go znaleźć w danych wyjściowych polecenia .

Nazwa hosta brokera MQTT usługi Event Grid

Użyj interfejsu wiersza polecenia platformy Azure, aby uzyskać nazwę hosta brokera MQTT usługi Event Grid.

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

Zanotuj wartość wyjściową, topicSpacesConfiguration.hostname która jest wartością nazwy hosta, która wygląda następująco:

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

Tworzenie łącznika mostka MQTT i zasobów mapy tematu

W nowym pliku o nazwie bridge.yamlokreśl łącznik mostka MQTT i konfigurację mapy tematu. Zastąp przykładowa wartość symbolu zastępczego w remoteBroker Połączenie ionendpoint nazwą hosta MQTT usługi Event Grid z poprzedniego kroku. Dołącz numer portu 8883.

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

Łącznik mostka MQTT należy skonfigurować w taki sposób, aby:

  • Używanie brokera MQTT usługi Event Grid jako brokera zdalnego
  • Użyj lokalnego brokera IoT MQ jako brokera lokalnego
  • Używanie protokołu TLS dla brokerów zdalnych i lokalnych
  • Używanie tożsamości zarządzanej przypisanej przez system do uwierzytelniania w zdalnym brokerze
  • Użyj konta usługi Kubernetes do uwierzytelniania w lokalnym brokerze
  • Mapa tematu służy do mapowania tematu tutorial/localtelemetry/iot-mq na temat w zdalnym brokerze
  • Mapa tematu służy do mapowania tematu telemetry/# na brokera zdalnego do tematu tutorial/cloud w lokalnym brokerze

Podczas publikowania w tutorial/local temacie na lokalnym brokerze IoT MQ komunikat jest łączony do tematu telemetry/iot-mq w zdalnym brokerze MQTT usługi Event Grid. Następnie komunikat jest łączony z powrotem do tematu tutorial/cloud lokalnego brokera IoT MQ. Podobnie podczas publikowania w telemetry/iot-mq temacie na zdalnym brokerze MQTT usługi Event Grid komunikat jest łączony z tematem tutorial/cloud w lokalnym brokerze IoT MQQ.

Zastosuj plik wdrożenia za pomocą narzędzia kubectl.

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

Weryfikowanie wdrożenia mostka MQTT

Użyj narzędzia kubectl, aby sprawdzić, czy dwa wystąpienia mostka są gotowe i uruchomione.

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

Teraz możesz opublikować na lokalnym brokerze i zasubskrybować brokera MQTT usługi Event Grid i zweryfikować przepływ komunikatów zgodnie z oczekiwaniami.

Wdrażanie klienta MQTT

Aby sprawdzić, czy mostek MQTT działa, wdróż klienta MQTT w tej samej przestrzeni nazw co IoT MQQ. W nowym pliku o nazwie client.yamlokreśl wdrożenie klienta:

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

Zastosuj plik wdrożenia za pomocą narzędzia kubectl.

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

Uruchamianie subskrybenta

Użyj kubectl exec polecenia , aby uruchomić powłokę w zasobniku klienta mosquitto.

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

W powłoce uruchom subskrybenta brokera IoT MQ w obszarze tematu tutorial/# za pomocą mqttui.

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

Pozostaw uruchomione polecenie i otwórz nowe okno terminalu.

Publikowanie komunikatów MQTT w chmurze za pośrednictwem mostka

W nowym oknie terminalu uruchom kolejną powłokę w zasobniku klienta mosquitto.

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

Wewnątrz powłoki użyj mosquitto, aby opublikować pięć komunikatów w temacie tutorial/local .

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

Wyświetlanie komunikatów w subskrybentze

W powłoce subskrybenta zostaną wyświetlone opublikowane komunikaty.

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!

W tym miejscu zobaczysz, że komunikaty są publikowane w lokalnym brokerze IoT MQ do tutorial/local tematu, pomostowane do brokera MQTT usługi Event Grid, a następnie ponownie łączone z lokalnym brokerem IoT MQ w tutorial/cloud temacie. Komunikaty są następnie dostarczane do subskrybenta. W tym przykładzie czas rundy wynosi około 80 ms.

Sprawdzanie metryk usługi Event Grid w celu zweryfikowania dostarczania komunikatów

Możesz również sprawdzić metryki usługi Event Grid, aby sprawdzić, czy komunikaty są dostarczane do brokera MQTT usługi Event Grid. W witrynie Azure Portal przejdź do utworzonej przestrzeni nazw usługi Event Grid. W obszarze Metrics MQTT: Successful Published Messages (Metryki>MQTT: pomyślne opublikowane komunikaty). Podczas publikowania komunikatów w lokalnym brokerze IoT MQ powinna być widoczna liczba opublikowanych i dostarczonych komunikatów.

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

Napiwek

Konfiguracje map tematów, QoS i tras komunikatów można sprawdzić za pomocą rozszerzeniaaz iot ops check --detail-level 2 interfejsu wiersza polecenia.

Następne kroki

W tym samouczku przedstawiono sposób konfigurowania usługi IoT MQ na potrzeby dwukierunkowego mostka MQTT za pomocą brokera MQTT usługi Azure Event Grid. W następnych krokach zapoznaj się z następującymi scenariuszami:

  • Aby użyć klienta MQTT do publikowania komunikatów bezpośrednio w brokerze MQTT usługi Event Grid, zobacz Publikowanie komunikatów MQTT w brokerze MQTT usługi Event Grid. Nadaj klientowi powiązanie uprawnień wydawcy z utworzonym obszarem tematu i możesz opublikować komunikaty w dowolnym temacie w obszarze , na telemetry/temperature przykład telemetrylub telemetry/humidity. Wszystkie te komunikaty są łączone z tematem tutorial/cloud lokalnym brokera IoT MQ.
  • Aby skonfigurować reguły routingu dla brokera MQTT usługi Event Grid, zobacz Konfigurowanie reguł routingu dla brokera MQTT usługi Event Grid. Reguły routingu umożliwiają kierowanie komunikatów do różnych tematów na podstawie nazwy tematu lub filtrowanie komunikatów na podstawie zawartości wiadomości.