Självstudie: Dubbelriktad MQTT-brygga till Azure Event Grid
Viktigt!
Den här sidan innehåller instruktioner för att hantera Azure IoT Operations-komponenter med hjälp av Kubernetes-distributionsmanifest, som finns i förhandsversion. Den här funktionen har flera begränsningar och bör inte användas för produktionsarbetsbelastningar.
Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.
I den här självstudien konfigurerar du en dubbelriktad MQTT-brygga mellan en Azure IoT Operations MQTT-mäklare och Azure Event Grid. Om du vill hålla självstudien enkel använder du standardinställningarna för Azure IoT Operations MQTT-koordinatorn och Azure Event Grid-slutpunkterna, och ingen transformering tillämpas.
Förutsättningar
- Azure IoT-åtgärder. Se Distribuera Azure IoT-åtgärder.
- Dataflödesprofil. Se Konfigurera dataflödesprofil.
Ange miljövariabler
Logga in med Azure CLI:
az login
Ange miljövariabler för resten av installationen. Ersätt värden i <>
med giltiga värden eller namn som du väljer. Ett nytt Azure Event Grid-namnområde och ämnesutrymme skapas i din Azure-prenumeration baserat på de namn du anger:
# 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>
Skapa Event Grid-namnområde med MQTT-asynkron meddelandekö aktiverat
Skapa Event Grid-namnrymd med Azure CLI. Platsen bör vara samma som den som du använde för att distribuera Azure IoT Operations.
az eventgrid namespace create \
--namespace-name $EVENT_GRID_NAMESPACE \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"
eventgrid
Om tillägget inte är installerat får du en fråga som frågar om du vill installera det. Välj Y
för att installera tillägget.
Genom att topic-spaces-configuration
ange skapar det här kommandot ett namnområde med:
- MQTT-asynkron meddelandekö aktiverad
- Maximalt antal klientsessioner per autentiseringsnamn som 3.
Med alternativet för maximala klientsessioner kan Azure IoT Operations MQTT skapa flera instanser och fortfarande ansluta. Mer information finns i stöd för flera sessioner.
Skapa ett ämnesutrymme
I Event Grid-namnområdet skapar du ett ämnesutrymme med namnet tutorial
med en ämnesmall telemetry/#
.
az eventgrid namespace topic-space create \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--name tutorial \
--topic-templates "telemetry/#"
Genom att använda #
jokertecknet i ämnesmallen kan du publicera till vilket ämne som helst under ämnesutrymmet telemetry
. Exempel: telemetry/temperature
eller telemetry/humidity
.
Ge Azure IoT Operations åtkomst till Event Grid-ämnesutrymmet
Använd Azure CLI och leta reda på huvud-ID:t för Azure IoT Operations Arc-tillägget. Kommandot lagrar huvud-ID:t i en variabel för senare användning.
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
Anteckna utdatavärdet för identity.principalId
, som är ett GUID-värde med följande format:
aaaaaaaa-bbbb-cccc-1111-222222222222
Använd sedan Azure CLI för att tilldela utgivar- och prenumerantroller till Azure IoT Operations MQTT för det ämnesutrymme som du skapade.
Tilldela utgivarrollen:
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
Tilldela prenumerantrollen:
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
Dricks
Omfånget matchar id
det ämnesutrymme som du skapade med az eventgrid namespace topic-space create
i föregående steg, och du hittar det i kommandots utdata.
Värdnamn för Event Grid MQTT-koordinator
Använd Azure CLI för att hämta värdnamnet för Event Grid MQTT-koordinatorn.
az eventgrid namespace show \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--query topicSpacesConfiguration.hostname \
-o tsv
Anteckna utdatavärdet för topicSpacesConfiguration.hostname
det är ett värdnamnsvärde som ser ut så här:
example.region-1.ts.eventgrid.azure.net
Skapa en Azure Event Grid-slutpunkt för dataflöde
Skapa dataflödesslutpunkt för Azure Event Grid. Den här slutpunkten är målet för dataflödet som skickar meddelanden till Azure Event Grid. Ersätt <EVENT_GRID_HOSTNAME>
med MQTT-värdnamnet som du fick från föregående steg. Inkludera portnumret 8883
.
Dataflödes- och dataflödesslutpunkterna Azure Event Grid kan distribueras som Azure-standardresurser eftersom de har Implementeringar av Azure Resource Provider (RPs). Den här Bicep-mallfilen från Bicep File for MQTT-bridge dataflow Tutorial distribuerar nödvändiga dataflödes- och dataflödesslutpunkter.
Ladda ned filen till din lokala fil och ersätt värdena för customLocationName
, aioInstanceName
med eventGridHostName
din.
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'
}
}
}
}
Kör sedan följande kommando i terminalen. Ersätt <FILE>
med namnet på den Bicep-fil som du laddade ned.
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Här är autentiseringsmetoden inställd på att SystemAssignedManagedIdentity
använda den hanterade identiteten för Azure IoT Operations-tillägget för att autentisera med Event Grid MQTT-koordinatorn. Den här inställningen fungerar eftersom Azure IoT Operations-tillägget har de behörigheter som krävs för att publicera och prenumerera på Event Grid-ämnesutrymmet som konfigurerats via Azure RBAC-roller. Observera att inga hemligheter, till exempel användarnamn eller lösenord, behövs i konfigurationen.
Eftersom Event Grid MQTT-asynkron tls
meddelandekö kräver TLS är inställningen aktiverad. Du behöver inte ange ett betrott CA-certifikat eftersom Event Grid MQTT-koordinatorn använder en allmänt betrodd certifikatutfärdare.
Skapa dataflöden
Skapa två dataflöden med Azure IoT Operations MQTT-koordinatorslutpunkten som källa och Azure Event Grid-slutpunkten som mål, och vice versa. Du behöver inte konfigurera transformering.
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'
}
}
]
}
}
Precis som dataflödesslutpunkten kör du följande kommando i terminalen:
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Tillsammans bildar de två dataflödena en MQTT-brygga, där du:
- Använd Event Grid MQTT-asynkron meddelandekö som fjärrkoordinator
- Använd den lokala Azure IoT Operations MQTT-koordinatorn som lokal koordinator
- Använda TLS för både fjärranslutna och lokala mäklare
- Använda systemtilldelad hanterad identitet för autentisering till fjärrkoordinatorn
- Använda Kubernetes-tjänstkontot för autentisering till den lokala koordinatorn
- Använd ämneskartan för att mappa
tutorial/local
ämnet till ämnettelemetry/aio
på fjärrkoordinatorn - Använd ämneskartan för att mappa
telemetry/#
ämnet på fjärrkoordinatorn till ämnettutorial/cloud
på den lokala mäklaren
Kommentar
Som standard distribuerar Azure IoT Operations en MQTT-koordinator samt en MQTT-asynkron dataflödesslutpunkt. MQTT-asynkron dataflödesslutpunkten används för att ansluta till MQTT-asynkron meddelandekö. Standardkonfigurationen använder den inbyggda tjänstkontotoken för autentisering. Slutpunkten heter default
och är tillgänglig i samma namnområde som Azure IoT Operations. Slutpunkten används som källa för det dataflöde som skapades i den här självstudien. Mer information om standardslutpunkten för MQTT-koordinatordataflöde finns i Azure IoT Operations lokala standardslutpunkt för MQTT-koordinator.
När du publicerar till ämnet tutorial/local
på den lokala Azure IoT Operations MQTT-asynkron meddelandekö, överbryggas meddelandet till telemetry/aio
ämnet på fjärrhändelsenätets MQTT-asynkron meddelandekö. Meddelandet bryggs sedan tillbaka till tutorial/cloud
ämnet (eftersom jokerteckenavsnittet telemetry/#
samlar in det) på den lokala Azure IoT Operations MQTT-asynkron meddelandekö. På samma sätt, när du publicerar till telemetry/aio
ämnet på fjärrhändelsenätets MQTT-asynkron meddelandekö, överbryggas meddelandet till tutorial/cloud
ämnet på den lokala Azure IoT Operations MQTT-koordinatorn.
Distribuera MQTT-klient
Om du vill kontrollera att MQTT-bryggan fungerar distribuerar du en MQTT-klient till samma namnområde som Azure IoT Operations.
För närvarande gäller inte Bicep för att distribuera MQTT-klienten.
Starta en prenumerant
Använd kubectl exec
för att starta ett gränssnitt i mosquitto-klientpodden.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
I gränssnittet startar du en prenumerant på Azure IoT Operations Broker i ämnesutrymmet tutorial/#
med 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)
Låt kommandot köras och öppna ett nytt terminalfönster.
Publicera MQTT-meddelanden till molnet via bryggan
Starta ett nytt gränssnitt i mosquitto-klientpodden i ett nytt terminalfönster.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
I gränssnittet använder du mosquitto för att publicera fem meddelanden till ämnet tutorial/local
.
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)
Visa meddelandena i prenumeranten
I prenumerantgränssnittet ser du de meddelanden som du publicerade.
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
Här ser du att meddelandena publiceras till den lokala Azure IoT Operations-asynkron meddelandekö till tutorial/local
ämnet, bryggs till Event Grid MQTT-asynkron meddelandekö och sedan bryggs tillbaka till den lokala Azure IoT Operations-koordinatorn igen i ämnet tutorial/cloud
. Meddelandena levereras sedan till prenumeranten. I det här exemplet är tur och retur-tiden cirka 80 ms.
Kontrollera Event Grid-mått för att verifiera meddelandeleveransen
Du kan också kontrollera Event Grid-måtten för att kontrollera att meddelandena levereras till Event Grid MQTT-koordinatorn. I Azure Portal går du till Event Grid-namnområdet som du skapade. Under Mått>MQTT: Lyckade publicerade meddelanden. Du bör se att antalet publicerade och levererade meddelanden ökar när du publicerar meddelanden till den lokala Azure IoT Operations-asynkron meddelandekö.
Dricks
Du kan kontrollera konfigurationerna av dataflöden, QoS och meddelandevägar med CLI-tillägget az iot ops check --detail-level 2
.
Nästa steg
I den här självstudien har du lärt dig hur du konfigurerar Azure IoT-åtgärder för dubbelriktad MQTT-brygga med Azure Event Grid MQTT-koordinator. Utforska följande scenarier i nästa steg:
- Information om hur du använder en MQTT-klient för att publicera meddelanden direkt till Event Grid MQTT-asynkron meddelandekö finns i Publicera MQTT-meddelanden till Event Grid MQTT-asynkron meddelandekö. Ge klienten en utgivarbehörighetsbindning till det ämnesutrymme som du skapade och du kan publicera meddelanden till valfritt ämne under
telemetry
, somtelemetry/temperature
ellertelemetry/humidity
. Alla dessa meddelanden är överbryggda till ämnettutorial/cloud
på den lokala Azure IoT Operations-koordinatorn. - Information om hur du konfigurerar routningsregler för Event Grid MQTT-asynkronisering finns i Konfigurera routningsregler för Event Grid MQTT-koordinator. Du kan använda routningsregler för att dirigera meddelanden till olika ämnen baserat på ämnesnamnet eller för att filtrera meddelanden baserat på meddelandeinnehållet.