Zelfstudie: Bidirectionele MQTT-brug naar Azure Event Grid
Belangrijk
Deze pagina bevat instructies voor het beheren van Azure IoT Operations-onderdelen met behulp van Kubernetes-implementatiemanifesten, die in preview zijn. Deze functie is voorzien van verschillende beperkingen en mag niet worden gebruikt voor productieworkloads.
Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.
In deze zelfstudie stelt u een bidirectionele MQTT-brug in tussen een Azure IoT Operations MQTT-broker en Azure Event Grid. Als u de zelfstudie eenvoudig wilt houden, gebruikt u de standaardinstellingen voor de Azure IoT Operations MQTT-broker en Azure Event Grid-eindpunten en wordt er geen transformatie toegepast.
Vereisten
- Azure IoT-bewerkingen. Zie Azure IoT-bewerkingen implementeren.
- Gegevensstroomprofiel. Zie Gegevensstroomprofiel configureren.
Omgevingsvariabelen instellen
Meld u aan met Azure CLI:
az login
Stel omgevingsvariabelen in voor de rest van de installatie. Vervang waarden door <>
geldige waarden of namen van uw keuze. Er wordt een nieuwe Azure Event Grid-naamruimte en onderwerpruimte gemaakt in uw Azure-abonnement op basis van de namen die u opgeeft:
# 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-naamruimte maken waarvoor MQTT-broker is ingeschakeld
Een Event Grid-naamruimte maken met Azure CLI. De locatie moet hetzelfde zijn als de locatie die u hebt gebruikt voor het implementeren van Azure IoT-bewerkingen.
az eventgrid namespace create \
--namespace-name $EVENT_GRID_NAMESPACE \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"
Als de eventgrid
extensie niet is geïnstalleerd, wordt u gevraagd of u de extensie wilt installeren. Selecteer Y
deze optie om de extensie te installeren.
Door de topic-spaces-configuration
opdracht in te stellen, wordt met deze opdracht een naamruimte gemaakt met:
- MQTT-broker ingeschakeld
- Maximum aantal clientsessies per verificatienaam als 3.
Met de optie voor maximale clientsessies kan Azure IoT Operations MQTT meerdere exemplaren spawnen en nog steeds verbinding maken. Zie ondersteuning voor meerdere sessies voor meer informatie.
Een onderwerpruimte maken
Maak in de Event Grid-naamruimte een onderwerpruimte met de naam tutorial
met een onderwerpsjabloon telemetry/#
.
az eventgrid namespace topic-space create \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--name tutorial \
--topic-templates "telemetry/#"
Met behulp van het #
jokerteken in de onderwerpsjabloon kunt u publiceren naar elk onderwerp onder de telemetry
onderwerpruimte. Bijvoorbeeld telemetry/temperature
of telemetry/humidity
.
Azure IoT-bewerkingen toegang geven tot de Event Grid-onderwerpruimte
Zoek met behulp van Azure CLI de principal-id voor de Azure IoT Operations Arc-extensie. Met de opdracht wordt de principal-id opgeslagen in een variabele voor later gebruik.
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
Noteer de uitvoerwaarde, identity.principalId
een GUID-waarde met de volgende indeling:
aaaaaaaa-bbbb-cccc-1111-222222222222
Gebruik vervolgens Azure CLI om uitgevers- en abonneerollen toe te wijzen aan Azure IoT Operations MQTT voor de onderwerpruimte die u hebt gemaakt.
Wijs de rol van uitgever toe:
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
Wijs de rol abonnee toe:
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
Het bereik komt overeen met az eventgrid namespace topic-space create
de id
onderwerpruimte waarmee u in de vorige stap hebt gemaakt en u vindt het in de uitvoer van de opdracht.
Event Grid MQTT-brokerhostnaam
Gebruik Azure CLI om de Event Grid MQTT-brokerhostnaam op te halen.
az eventgrid namespace show \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--query topicSpacesConfiguration.hostname \
-o tsv
Noteer de uitvoerwaarde waarvoor topicSpacesConfiguration.hostname
dit een hostnaamwaarde is die er als volgt uitziet:
example.region-1.ts.eventgrid.azure.net
Een Azure Event Grid-gegevensstroomeindpunt maken
Maak een gegevensstroomeindpunt voor Azure Event Grid. Dit eindpunt is de bestemming voor de gegevensstroom die berichten naar Azure Event Grid verzendt. Vervang <EVENT_GRID_HOSTNAME>
door de MQTT-hostnaam die u hebt gekregen uit de vorige stap. Neem het poortnummer 8883
op.
De gegevensstroom- en gegevensstroomeindpunten van Azure Event Grid kunnen worden geïmplementeerd als standaard Azure-resources, omdat ze implementaties van Azure Resource Provider (RPs) hebben. Dit Bicep-sjabloonbestand van Bicep-bestand voor MQTT-bridge-gegevensstroom implementeert de benodigde gegevensstroom- en gegevensstroomeindpunten.
Download het bestand naar uw lokale locatie en zorg ervoor dat u de waarden voor customLocationName
, aioInstanceName
eventGridHostName
vervangt door die van u.
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'
}
}
}
}
Voer vervolgens de volgende opdracht uit in uw terminal. Vervang door <FILE>
de naam van het Bicep-bestand dat u hebt gedownload.
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Hier is de verificatiemethode ingesteld om SystemAssignedManagedIdentity
de beheerde identiteit van de Azure IoT Operations-extensie te gebruiken voor verificatie met de Event Grid MQTT-broker. Deze instelling werkt omdat de Azure IoT Operations-extensie over de benodigde machtigingen beschikt voor het publiceren en abonneren op de Event Grid-onderwerpruimte die is geconfigureerd via Azure RBAC-rollen. U ziet dat er geen geheimen, zoals gebruikersnaam of wachtwoord, nodig zijn in de configuratie.
Omdat voor de Event Grid MQTT-broker TLS is vereist, is de tls
instelling ingeschakeld. U hoeft geen vertrouwd CA-certificaat op te geven, omdat de Event Grid MQTT-broker gebruikmaakt van een algemeen vertrouwde certificeringsinstantie.
Gegevensstromen maken
Maak twee gegevensstromen met het Azure IoT Operations MQTT-brokereindpunt als de bron en het Azure Event Grid-eindpunt als de bestemming en vice versa. U hoeft transformatie niet te configureren.
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'
}
}
]
}
}
Voer net als het gegevensstroomeindpunt de volgende opdracht uit in uw terminal:
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Samen vormen de twee gegevensstromen een MQTT-brug, waar u:
- De Event Grid MQTT-broker gebruiken als externe broker
- De lokale Azure IoT Operations MQTT-broker gebruiken als de lokale broker
- TLS gebruiken voor externe en lokale brokers
- Door het systeem toegewezen beheerde identiteit gebruiken voor verificatie bij de externe broker
- Kubernetes-serviceaccount gebruiken voor verificatie bij de lokale broker
- Gebruik de onderwerptoewijzing om het
tutorial/local
onderwerp toe te wijzen aan hettelemetry/aio
onderwerp op de externe broker - Gebruik de onderwerptoewijzing om het
telemetry/#
onderwerp op de externe broker toe te wijzen aan hettutorial/cloud
onderwerp over de lokale broker
Notitie
Standaard implementeert Azure IoT Operations een MQTT-broker en een MQTT-brokergegevensstroomeindpunt. Het eindpunt van de MQTT-brokergegevensstroom wordt gebruikt om verbinding te maken met de MQTT-broker. De standaardconfiguratie maakt gebruik van het ingebouwde serviceaccounttoken voor verificatie. Het eindpunt heeft de naam default
en is beschikbaar in dezelfde naamruimte als Azure IoT Operations. Het eindpunt wordt gebruikt als de bron voor de gegevensstroom die in deze zelfstudie is gemaakt. Zie het standaardeindpunt van de MQTT-brokerbroker voor meer informatie over het standaardeindpunt van de MQTT-broker.
Wanneer u publiceert naar het tutorial/local
onderwerp over de lokale Azure IoT Operations MQTT-broker, wordt het bericht overbrugd naar het telemetry/aio
onderwerp in de externe Event Grid MQTT-broker. Vervolgens wordt het bericht teruggezet naar het tutorial/cloud
onderwerp (omdat het telemetry/#
jokertekenonderwerp het vastlegt) op de lokale Azure IoT Operations MQTT-broker. Wanneer u publiceert naar het telemetry/aio
onderwerp op de externe Event Grid MQTT-broker, wordt het bericht overbrugd naar het tutorial/cloud
onderwerp over de lokale Azure IoT Operations MQTT-broker.
MQTT-client implementeren
Als u wilt controleren of de MQTT-brug werkt, implementeert u een MQTT-client in dezelfde naamruimte als Azure IoT Operations.
Bicep is momenteel niet van toepassing op het implementeren van MQTT-client.
Een abonnee starten
Gebruik kubectl exec
dit om een shell te starten in de mosquitto-clientpod.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Start in de shell een abonnee op de Azure IoT Operations-broker in de tutorial/#
onderwerpruimte met 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)
Laat de opdracht actief en open een nieuw terminalvenster.
MQTT-berichten publiceren naar de cloud via de brug
Start in een nieuw terminalvenster een andere shell in de mosquitto-clientpod.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Gebruik mosquitto in de shell om vijf berichten naar het tutorial/local
onderwerp te publiceren.
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)
De berichten in de abonnee weergeven
In de abonneeshell ziet u de berichten die u hebt gepubliceerd.
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
Hier ziet u dat de berichten worden gepubliceerd naar de lokale Azure IoT Operations-broker naar het tutorial/local
onderwerp, overbrugd naar Event Grid MQTT-broker en vervolgens weer worden overbrugd naar de lokale Azure IoT Operations-broker in het tutorial/cloud
onderwerp. De berichten worden vervolgens bezorgd bij de abonnee. In dit voorbeeld is de retourtijd ongeveer 80 ms.
Metrische gegevens van Event Grid controleren om de bezorging van berichten te controleren
U kunt ook de metrische gegevens van Event Grid controleren om te controleren of de berichten worden bezorgd bij de Event Grid MQTT-broker. Ga in Azure Portal naar de Event Grid-naamruimte die u hebt gemaakt. Onder MQTT voor metrische gegevens>: gepubliceerde berichten zijn geslaagd. Als het goed is, wordt het aantal gepubliceerde en bezorgde berichten verhoogd naarmate u berichten publiceert naar de lokale Azure IoT Operations-broker.
Tip
U kunt de configuraties van gegevensstromen, QoS en berichtroutes controleren met de CLI-extensieaz iot ops check --detail-level 2
.
Volgende stappen
In deze zelfstudie hebt u geleerd hoe u Azure IoT Operations configureert voor bidirectionele MQTT-brug met Azure Event Grid MQTT-broker. Bekijk de volgende scenario's als volgende stappen:
- Als u een MQTT-client wilt gebruiken om berichten rechtstreeks naar de Event Grid MQTT-broker te publiceren, raadpleegt u MQTT-berichten publiceren naar Event Grid MQTT-broker. Geef de client een machtigingsbinding voor de onderwerpruimte die u hebt gemaakt en u kunt berichten publiceren naar elk onderwerp onder de
telemetry
, zoalstelemetry/temperature
oftelemetry/humidity
. Al deze berichten worden overbrugd naar hettutorial/cloud
onderwerp over de lokale Azure IoT Operations-broker. - Zie Routeringsregels configureren voor Event Grid MQTT-broker om routeringsregels in te stellen voor de Event Grid MQTT-broker. U kunt routeringsregels gebruiken om berichten naar verschillende onderwerpen te routeren op basis van de onderwerpnaam of om berichten te filteren op basis van de inhoud van het bericht.