Share via


Tutorial: Configurar a ponte MQTT entre o Azure IoT MQ Preview e a Grade de Eventos do Azure

Importante

Azure IoT Operations Preview – habilitado pelo Azure Arc está atualmente em visualização. Não deve utilizar este software de pré-visualização em ambientes de produção.

Veja Termos de Utilização Complementares da Pré-visualizações do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão na versão beta, na pré-visualização ou que ainda não foram lançadas para disponibilidade geral.

Neste tutorial, você aprenderá a configurar o IoT MQ para ponte MQTT bidirecional com o PaaS do agente MQTT da Grade de Eventos do Azure. Você pode usar esse recurso para processar seus dados de IoT na borda e na nuvem. Por exemplo, você pode usar o IoT MQ para processar dados de telemetria na borda e, em seguida, fazer a ponte entre os dados e a Grade de Eventos do Azure para processamento adicional na nuvem.

Pré-requisitos

Definir variáveis de ambiente

Entre com a CLI do Azure:

az login

Defina variáveis de ambiente para o restante da configuração. Substitua valores por <> valores válidos ou nomes de sua escolha. Um novo namespace da Grade de Eventos do Azure e espaço de tópico são criados em sua assinatura do Azure com base nos nomes fornecidos:

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

Criar namespace de grade de eventos com o agente MQTT habilitado

Crie o namespace Grade de Eventos com a CLI do Azure. O local deve ser o mesmo que você usou para implantar as Operações do Azure IoT.

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

Ao definir o topic-spaces-configuration, este comando cria um namespace com:

  • Broker MQTT habilitado
  • Máximo de sessões de cliente por nome de autenticação como 3.

A opção max client sessions permite que o IoT MQ gere várias instâncias e ainda se conecte. Para saber mais, consulte Suporte a várias sessões.

Criar um espaço de tópico

No namespace Grade de Eventos, crie um espaço de tópico nomeado tutorial com um modelo de tópico telemetry/#.

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

Usando o curinga # no modelo de tópico, você pode publicar em qualquer tópico no espaço do telemetry tópico. Por exemplo, telemetry/temperature ou telemetry/humidity.

Dê acesso ao Azure IoT MQ Preview ao espaço de tópico da Grade de Eventos

Usando az k8s-extension showo , localize a ID principal para a extensão Azure IoT MQ Arc. O comando armazena o ID principal em uma variável para uso posterior.

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

Anote o valor de saída para identity.principalId, que é um valor GUID com o seguinte formato:

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

Em seguida, use a CLI do Azure para atribuir funções de editor e assinante ao IoT MQ para o espaço de tópico que você criou.

Atribua a função de editor:

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

Atribua a função de assinante:

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

Gorjeta

O escopo corresponde ao id espaço de tópico criado na az eventgrid namespace topic-space create etapa anterior e você pode encontrá-lo na saída do comando.

Grade de eventos Nome do host do broker MQTT

Use a CLI do Azure para obter o nome de host do broker MQTT da Grade de Eventos.

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

Anote o valor de saída para topicSpacesConfiguration.hostname que é um valor de nome de host que se parece com:

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

Criar um conector de ponte MQTT e recursos de mapa de tópicos

Em um novo arquivo chamado bridge.yaml, especifique o conector de ponte MQTT e a configuração do mapa de tópicos. Substitua o valor de espaço reservado de exemplo em remoteBrokerConnectionendpoint pelo nome de host MQTT da grade de eventos da etapa anterior. Inclua o número da porta 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

Você configura o conector de ponte MQTT para:

  • Use o agente MQTT da grade de eventos como o broker remoto
  • Use o agente MQ IoT local como o broker local
  • Usar TLS para corretores remotos e locais
  • Usar identidade gerenciada atribuída ao sistema para autenticação no agente remoto
  • Usar a conta de serviço do Kubernetes para autenticação no broker local
  • Use o mapa de tópicos para mapear o tutorial/local tópico para o telemetry/iot-mq tópico no broker remoto
  • Use o mapa de tópicos para mapear o telemetry/# tópico no broker remoto para o tutorial/cloud tópico no broker local

Quando você publica no tutorial/local tópico no broker MQ IoT local, a mensagem é conectada telemetry/iot-mq ao tópico no broker MQTT da Grade de Eventos remota. Em seguida, a mensagem é conectada de volta ao tutorial/cloud tópico no agente MQ IoT local. Da mesma forma, quando você publica no telemetry/iot-mq tópico no agente MQTT remoto da Grade de Eventos, a mensagem é conectada tutorial/cloud ao tópico no agente MQ IoT local.

Aplique o arquivo de implantação com kubectl.

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

Verificar a implantação da ponte MQTT

Use kubectl para verificar se as duas instâncias de ponte estão prontas e em execução.

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

Agora você pode publicar no broker local e se inscrever no Event Grid MQTT Broker e verificar o fluxo de mensagens conforme o esperado.

Implantar o cliente MQTT

Para verificar se a ponte MQTT está funcionando, implante um cliente MQTT no mesmo namespace que o IoT MQ. Em um novo arquivo chamado client.yaml, especifique a implantação do cliente:

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

Aplique o arquivo de implantação com kubectl.

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

Iniciar um subscritor

Use kubectl exec para iniciar um shell no pod do cliente mosquitto.

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

Dentro do shell, inicie um assinante do agente MQ IoT no espaço de tutorial/# tópico com mqttui.

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

Deixe o comando em execução e abra uma nova janela do terminal.

Publique mensagens MQTT na nuvem através da ponte

Em uma nova janela de terminal, inicie outro shell no pod do cliente mosquitto.

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

Dentro do shell, use mosquitto para publicar cinco mensagens para o tutorial/local tópico.

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

Ver as mensagens no subscritor

No shell do assinante, você vê as mensagens publicadas.

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!

Aqui, você vê que as mensagens são publicadas no agente MQ IoT local para o tutorial/local tópico, conectadas ao agente MQTT da Grade de Eventos e, em seguida, conectadas de volta ao agente MQ IoT local novamente no tutorial/cloud tópico. As mensagens são então entregues ao assinante. Neste exemplo, o tempo de ida e volta é de cerca de 80 ms.

Verifique as métricas da Grade de Eventos para verificar a entrega de mensagens

Você também pode verificar as métricas da Grade de Eventos para verificar se as mensagens são entregues ao broker MQTT da Grade de Eventos. No portal do Azure, navegue até o namespace Grade de Eventos que você criou. Em Métricas>MQTT: Mensagens publicadas com sucesso. Você verá o número de mensagens publicadas e entregues aumentar à medida que publica mensagens no agente MQ IoT local.

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

Gorjeta

Você pode verificar as configurações de mapas de tópicos, QoS e rotas de mensagens com a extensãoaz iot ops check --detail-level 2 CLI.

Próximos passos

Neste tutorial, você aprendeu como configurar o IoT MQ para ponte MQTT bidirecional com o agente MQTT da Grade de Eventos do Azure. Como próximas etapas, explore os seguintes cenários:

  • Para usar um cliente MQTT para publicar mensagens diretamente no broker MQTT da Grade de Eventos, consulte Publicar mensagens MQTT no broker MQTT da Grade de Eventos. Dê ao cliente uma associação de permissão de editor para o espaço de tópico que você criou, e você pode publicar mensagens em qualquer tópico sob , telemetrycomo telemetry/temperature ou telemetry/humidity. Todas essas mensagens são conectadas ao tutorial/cloud tópico no agente MQ IoT local.
  • Para configurar regras de roteamento para o agente MQTT da Grade de Eventos, consulte Configurar regras de roteamento para o agente MQTT da Grade de Eventos. Você pode usar regras de roteamento para rotear mensagens para tópicos diferentes com base no nome do tópico ou para filtrar mensagens com base no conteúdo da mensagem.