Sdílet prostřednictvím


Kurz: Obousměrný most MQTT do Azure Event Gridu

Důležité

Tato stránka obsahuje pokyny ke správě komponent operací Azure IoT pomocí manifestů nasazení Kubernetes, které jsou ve verzi Preview. Tato funkce je poskytována s několika omezeními a neměla by se používat pro produkční úlohy.

Právní podmínky, které platí pro funkce Azure, které jsou ve verzi beta, verzi Preview nebo které zatím nejsou veřejně dostupné, najdete v Dodatečných podmínkách použití pro Microsoft Azure verze Preview.

V tomto kurzu nastavíte obousměrný most MQTT mezi zprostředkovatelem Azure IoT Operations MQTT a Azure Event Gridem. Pokud chcete tento kurz zachovat jednoduchý, použijte výchozí nastavení pro zprostředkovatele Azure IoT Operations MQTT a koncové body Azure Event Gridu a nepoužije se žádná transformace.

Požadavky

Nastavení proměnných prostředí

Přihlaste se pomocí Azure CLI:

az login

Nastavte proměnné prostředí pro zbytek nastavení. Nahraďte hodnoty <> platnými hodnotami nebo názvy podle vašeho výběru. Ve vašem předplatném Azure se vytvoří nový obor názvů a téma služby Azure Event Grid na základě vámi zadaných názvů:

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

Vytvoření oboru názvů Event Gridu s povoleným zprostředkovatelem MQTT

Vytvoření oboru názvů Event Gridu pomocí Azure CLI Umístění by mělo být stejné jako umístění, které jste použili k nasazení operací Azure IoT.

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

eventgrid Pokud rozšíření není nainstalované, zobrazí se výzva s dotazem, jestli ho chcete nainstalovat. Vyberte Y instalaci rozšíření.

Nastavením tohoto topic-spaces-configurationpříkazu vytvoří obor názvů s:

  • Povolený zprostředkovatel MQTT
  • Maximální počet klientských relací na název ověřování je 3.

Možnost maximálního počtu relací klientů umožňuje službě Azure IoT Operations MQTT vytvořit více instancí a stále se připojit. Další informace najdete v tématu podpora více relací.

Vytvoření prostoru tématu

V oboru názvů Event Grid vytvořte prostor tématu pojmenovaný tutorial šablonou tématu telemetry/#.

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

Pomocí zástupné # znaky v šabloně tématu můžete publikovat do libovolného telemetry tématu v prostoru tématu. Například telemetry/temperature nebo telemetry/humidity.

Udělení přístupu k prostoru témat Event Gridu operacím Azure IoT

Pomocí Azure CLI vyhledejte ID objektu zabezpečení pro rozšíření Azure IoT Operations Arc. Příkaz uloží ID objektu zabezpečení do proměnné pro pozdější použití.

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

Poznamenejte si výstupní hodnotu , identity.principalIdcož je hodnota GUID s následujícím formátem:

aaaaaaaa-bbbb-cccc-1111-222222222222

Pak pomocí Azure CLI přiřaďte role vydavatele a odběratele k Azure IoT Operations MQTT pro prostor témat, který jste vytvořili.

Přiřaďte roli vydavatele:

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

Přiřaďte roli odběratele:

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

Tip

Obor odpovídá id prostoru tématu, který jste vytvořili az eventgrid namespace topic-space create v předchozím kroku, a ve výstupu příkazu ho najdete.

Název hostitele zprostředkovatele Event Grid MQTT

Pomocí Azure CLI získejte název hostitele zprostředkovatele Event Grid MQTT.

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

Poznamenejte si výstupní hodnotu, topicSpacesConfiguration.hostname která je hodnotou názvu hostitele, která vypadá takto:

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

Vytvoření koncového bodu toku dat Azure Event Gridu

Vytvořte koncový bod toku dat pro Azure Event Grid. Tento koncový bod je cílem toku dat, který odesílá zprávy do služby Azure Event Grid. Nahraďte <EVENT_GRID_HOSTNAME> názvem hostitele MQTT, který jste získali z předchozího kroku. Uveďte číslo 8883portu .

Koncové body toku dat a toku dat je možné nasadit ve službě Azure Event Grid jako standardní prostředky Azure, protože mají implementace azure Resource Provider (RPs). Tento soubor šablony Bicep ze souboru Bicep pro MQTT-bridge dataflow Tutorial nasadí nezbytné toky dat a koncové body toku dat.

Stáhněte si soubor do místního prostředí a nezapomeňte nahradit hodnoty pro customLocationName, aioInstanceNameeventGridHostName svým.

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

Pak v terminálu spusťte následující příkaz. Nahraďte <FILE> názvem souboru Bicep, který jste stáhli.

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

V této části je metoda ověřování nastavená tak, aby SystemAssignedManagedIdentity používala spravovanou identitu rozšíření Azure IoT Operations k ověření pomocí zprostředkovatele Event Grid MQTT. Toto nastavení funguje, protože rozšíření Azure IoT Operations má potřebná oprávnění k publikování a přihlášení k odběru prostoru tématu Event Gridu nakonfigurovaného prostřednictvím rolí Azure RBAC. Všimněte si, že v konfiguraci nejsou potřeba žádné tajné kódy, jako je uživatelské jméno nebo heslo.

Vzhledem k tomu, že zprostředkovatel Event Grid MQTT vyžaduje protokol TLS, tls je toto nastavení povolené. Není potřeba zadávat důvěryhodný certifikát certifikační autority, protože zprostředkovatel Event Grid MQTT používá široce důvěryhodnou certifikační autoritu.

Vytváření toků dat

Vytvořte dva toky dat s koncovým bodem zprostředkovatele Azure IoT Operations MQTT jako zdrojem a koncovým bodem Azure Event Gridu jako cílem a naopak. Není potřeba konfigurovat transformaci.

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

Podobně jako koncový bod toku dat spusťte v terminálu následující příkaz:

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

Oba toky dat společně tvoří most MQTT, kde:

  • Použití zprostředkovatele Event Grid MQTT jako vzdáleného zprostředkovatele
  • Použití místního zprostředkovatele Azure IoT Operations MQTT jako místního zprostředkovatele
  • Použití protokolu TLS pro vzdálené i místní zprostředkovatele
  • Použití spravované identity přiřazené systémem pro ověřování pro vzdáleného zprostředkovatele
  • Použití účtu služby Kubernetes pro ověřování u místního zprostředkovatele
  • Mapování tématu na tutorial/local téma na vzdáleném zprostředkovateli pomocí mapy témat telemetry/aio
  • Mapování tématu na vzdáleném zprostředkovateli pomocí telemetry/#tutorial/cloud mapy tématu na místním zprostředkovateli

Poznámka:

Operace Azure IoT ve výchozím nastavení nasadí zprostředkovatele MQTT i koncový bod toku dat Zprostředkovatele MQTT. Koncový bod toku dat zprostředkovatele MQTT slouží k připojení ke zprostředkovateli MQTT. Výchozí konfigurace používá k ověřování integrovaný token účtu služby. Koncový bod je pojmenovaný default a je k dispozici ve stejném oboru názvů jako Operace Azure IoT. Koncový bod se používá jako zdroj pro tok dat vytvořený v tomto kurzu. Další informace o výchozím koncovém bodu toku dat zprostředkovatele MQTT najdete v tématu Azure IoT Operations local MQTT Broker Default Endpoint.

Když publikujete do tutorial/local tématu na místním zprostředkovateli Azure IoT Operations MQTT, zpráva se přemísní na telemetry/aio téma na vzdáleném zprostředkovateli Event Grid MQTT. Zpráva se pak přemístí zpět do tutorial/cloud tématu (protože telemetry/# toto téma se zástupnými znamény zachytává) v místním zprostředkovateli MQTT operations Azure IoTT. Podobně když publikujete do telemetry/aio tématu na vzdáleném zprostředkovateli Event Grid MQTT, zpráva se přemísní na tutorial/cloud téma místního zprostředkovatele Azure IoT Operations MQTT.

Nasazení klienta MQTT

Pokud chcete ověřit, že most MQTT funguje, nasaďte klienta MQTT do stejného oboru názvů jako operace Azure IoT.

V současné době se Bicep nevztahuje na nasazení klienta MQTT.

Zahájit předplatitele

Slouží kubectl exec ke spuštění prostředí v podu klienta mosquitto.

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

V prostředí spusťte odběratele zprostředkovatele operací Azure IoT v tutorial/# prostoru témat pomocí 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)

Nechte příkaz spuštěný a otevřete nové okno terminálu.

Publikování zpráv MQTT do cloudu prostřednictvím mostu

V novém okně terminálu spusťte v podu klienta mosquitto další prostředí.

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

Uvnitř prostředí použijte mosquitto k publikování pěti zpráv do tutorial/local tématu.

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)

Zobrazení zpráv odběratele

V prostředí pro předplatitele se zobrazí zprávy, které jste publikovali.

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

Tady uvidíte, že se zprávy publikují do místního zprostředkovatele operací Azure IoT do tutorial/local tématu, přemístit na zprostředkovatele Event Grid MQTT a pak se znovu přemístit na místního zprostředkovatele operací Azure IoT v tomto tutorial/cloud tématu. Zprávy se pak doručí odběrateli. V tomto příkladu je doba odezvy přibližně 80 ms.

Kontrola metrik Event Gridu a ověření doručení zpráv

Můžete také zkontrolovat metriky Event Gridu a ověřit, že se zprávy doručují do zprostředkovatele Event Grid MQTT. Na webu Azure Portal přejděte do oboru názvů Event Gridu, který jste vytvořili. V části Metriky>MQTT: Úspěšné publikované zprávy Při publikování zpráv do místního zprostředkovatele operací Azure IoT by se měl zobrazit počet publikovaných a doručovaných zpráv.

Snímek obrazovky se zobrazením metrik na webu Azure Portal pro zobrazení úspěšných zpráv MQTT

Další kroky

V tomto kurzu jste zjistili, jak nakonfigurovat operace Azure IoT pro obousměrný most MQTT pomocí zprostředkovatele Azure Event Grid MQTT. Při dalších krocích prozkoumejte následující scénáře:

  • Pokud chcete použít klienta MQTT k publikování zpráv přímo do zprostředkovatele Event Grid MQTT, přečtěte si téma Publikování zpráv MQTT do zprostředkovatele Event Grid MQTT. Dejte klientovi vazbu oprávnění vydavatele k prostoru tématu, který jste vytvořili, a můžete publikovat zprávy do libovolného tématu pod položkou telemetry, like telemetry/temperature nebo telemetry/humidity. Všechny tyto zprávy jsou přemíscené na tutorial/cloud téma místního zprostředkovatele operací Azure IoT.
  • Pokud chcete nastavit pravidla směrování pro zprostředkovatele Event Grid MQTT, přečtěte si téma Konfigurace pravidel směrování pro zprostředkovatele Event Grid MQTT. Pravidla směrování můžete použít ke směrování zpráv do různých témat na základě názvu tématu nebo k filtrování zpráv na základě obsahu zprávy.