Aracılığıyla paylaş


Öğretici: Azure Event Grid'e çift yönlü MQTT köprüsü

Önemli

Bu sayfa, önizleme aşamasında olan Kubernetes dağıtım bildirimlerini kullanarak Azure IoT İşlemleri bileşenlerini yönetme yönergelerini içerir. Bu özellik çeşitli sınırlamalarla sağlanır ve üretim iş yükleri için kullanılmamalıdır.

Beta veya önizleme aşamasında olan ya da başka bir şekilde henüz genel kullanıma sunulmamış olan Azure özelliklerinde geçerli olan yasal koşullar için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Bu öğreticide, Azure IoT operations MQTT aracısı ile Azure Event Grid arasında çift yönlü bir MQTT köprüsü ayarlarsınız. Öğreticiyi basit tutmak için Azure IoT İşlemleri MQTT aracısı ve Azure Event Grid uç noktaları için varsayılan ayarları kullanın ve dönüştürme uygulanmaz.

Önkoşullar

Ortam değişkenlerini belirleme

Azure CLI ile oturum açın:

az login

Kurulumun geri kalanı için ortam değişkenlerini ayarlayın. içindeki <> değerleri, seçtiğiniz geçerli değerlerle veya adlarla değiştirin. Azure aboneliğinizde sağladığınız adlara göre yeni bir Azure Event Grid ad alanı ve konu alanı oluşturulur:

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

MQTT aracısı etkinken Event Grid ad alanı oluşturma

Azure CLI ile Event Grid ad alanı oluşturun. Konum, Azure IoT İşlemlerini dağıtmak için kullandığınız konumla aynı olmalıdır.

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

eventgrid Uzantı yüklü değilse, yüklemek isteyip istemediğinizi soran bir istem alırsınız. Uzantıyı yüklemek için öğesini seçin Y .

öğesini ayarlayarak topic-spaces-configuration, bu komut şununla bir ad alanı oluşturur:

  • MQTT aracısı etkin
  • Kimlik doğrulama adı başına en fazla istemci oturumu sayısı 3 olarak.

En fazla istemci oturumu seçeneği, Azure IoT İşlemleri MQTT'nin birden çok örnek oluşturmasına ve bağlanmaya devam etmesine olanak tanır. Daha fazla bilgi edinmek için bkz . çoklu oturum desteği.

Konu alanı oluşturma

Event Grid ad alanında, konu şablonuyla telemetry/#adlı tutorial bir konu alanı oluşturun.

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

Konu şablonundaki # joker karakteri kullanarak, konu alanının altındaki telemetry herhangi bir konuya yayımlayabilirsiniz. Örneğin, telemetry/temperature veya telemetry/humidity.

Azure IoT İşlemleri'ne Event Grid konu alanı erişimi verme

Azure CLI kullanarak Azure IoT Operations Arc uzantısının asıl kimliğini bulun. komut, asıl kimliği daha sonra kullanmak üzere bir değişkende depolar.

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

aşağıdaki biçime sahip bir GUID değeri olan için identity.principalIdçıkış değerini not alın:

aaaaaaaa-bbbb-cccc-1111-222222222222

Ardından, oluşturduğunuz konu alanı için Azure IoT İşlemleri MQTT'sine yayımcı ve abone rolleri atamak için Azure CLI'yi kullanın.

Yayımcı rolünü atayın:

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

Abone rolünü atayın:

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

İpucu

Kapsam, önceki adımda oluşturduğunuz konu alanının alanıyla az eventgrid namespace topic-space create eşleşir id ve bunu komutun çıkışında bulabilirsiniz.

Event Grid MQTT aracı ana bilgisayar adı

Event Grid MQTT aracı ana bilgisayar adını almak için Azure CLI'yi kullanın.

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

Şuna benzeyen bir konak adı değeri olan çıkış değerini topicSpacesConfiguration.hostname not edin:

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

Azure Event Grid veri akışı uç noktası oluşturma

Azure Event Grid için veri akışı uç noktası oluşturun. Bu uç nokta, Azure Event Grid'e ileti gönderen veri akışının hedefidir. değerini önceki adımda aldığınız MQTT ana bilgisayar adıyla değiştirin <EVENT_GRID_HOSTNAME> . Bağlantı noktası numarasını 8883ekleyin.

Azure Event Grid veri akışı ve veri akışı uç noktaları, Azure Kaynak Sağlayıcısı (RP) uygulamalarına sahip olduğundan standart Azure kaynakları olarak dağıtılabilir. MQTT-bridge veri akışı öğreticisi için Bicep Dosyası'ndan alınan bu Bicep şablon dosyası, gerekli veri akışı ve veri akışı uç noktalarını dağıtır.

Dosyayı yerel bilgisayarınıza indirin ve , aioInstanceNameeventGridHostName , değerlerini sizinkiyle customLocationNamedeğiştirdiğinizden emin olun.

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

Ardından terminalinizde aşağıdaki komutu yürütür. değerini indirdiğiniz Bicep dosyasının adıyla değiştirin <FILE> .

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

Burada kimlik doğrulama yöntemi, Event Grid MQTT aracısı ile kimlik doğrulaması yapmak için Azure IoT İşlemleri uzantısının yönetilen kimliğini kullanacak şekilde ayarlanır SystemAssignedManagedIdentity . Azure IoT İşlemleri uzantısı, Azure RBAC rolleri aracılığıyla yapılandırılmış Event Grid konu alanını yayımlamak ve bunlara abone olmak için gerekli izinlere sahip olduğundan bu ayar çalışır. Yapılandırmada kullanıcı adı veya parola gibi gizli dizilere gerek olmadığına dikkat edin.

Event Grid MQTT aracısı TLS gerektirdiğinden tls , ayar etkinleştirilir. Event Grid MQTT aracısı yaygın olarak güvenilen bir sertifika yetkilisi kullandığından güvenilir bir CA sertifikası sağlamanız gerekmez.

Veri akışları oluşturma

Kaynak olarak Azure IoT İşlemleri MQTT aracı uç noktası ve hedef olarak Azure Event Grid uç noktası ile iki veri akışı oluşturun ve tam tersi de geçerlidir. Dönüşümü yapılandırmanız gerekmez.

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

Veri akışı uç noktası gibi terminalinizde aşağıdaki komutu yürütür:

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

İki veri akışı birlikte bir MQTT köprüsü oluşturur ve burada:

  • Event Grid MQTT aracısını uzak aracı olarak kullanma
  • Yerel Azure IoT İşlemleri MQTT aracısını yerel aracı olarak kullanma
  • Hem uzak hem de yerel aracılar için TLS kullanma
  • Uzak aracıya kimlik doğrulaması için sistem tarafından atanan yönetilen kimliği kullanma
  • Yerel aracıya kimlik doğrulaması için Kubernetes hizmet hesabını kullanma
  • Konuyu uzak aracıdaki konu başlığıyla tutorial/local telemetry/aio eşlemek için konu eşlemesini kullanın
  • Uzak aracıdaki konuyu yerel aracıdaki konu başlığıyla tutorial/cloud eşlemek telemetry/# için konu haritası kullanın

Not

Varsayılan olarak, Azure IoT İşlemleri bir MQTT aracısı ve bir MQTT aracısı veri akışı uç noktası dağıtır. MQTT aracısı veri akışı uç noktası, MQTT aracısına bağlanmak için kullanılır. Varsayılan yapılandırma, kimlik doğrulaması için yerleşik hizmet hesabı belirtecini kullanır. Uç nokta adlandırılır default ve Azure IoT İşlemleri ile aynı ad alanında kullanılabilir. Uç nokta, bu öğreticide oluşturulan veri akışının kaynağı olarak kullanılır. Varsayılan MQTT aracısı veri akışı uç noktası hakkında daha fazla bilgi edinmek için bkz . Azure IoT İşlemleri yerel MQTT aracısı varsayılan uç noktası.

Yerel Azure IoT İşlemleri MQTT aracısının konusuna tutorial/local yayımladığınızda, ileti uzak Event Grid MQTT aracısı üzerindeki konuya bağlanır telemetry/aio . Ardından ileti, yerel Azure IoT İşlemleri MQTT aracısı üzerindeki konuya telemetry/# (joker konu tarafından yakalandığından) geri tutorial/cloud bağlanır. Benzer şekilde, uzak Event Grid MQTT aracısının konusuna telemetry/aio yayımladığınızda, ileti yerel Azure IoT İşlemleri MQTT aracısı üzerindeki konuya bağlanır tutorial/cloud .

MQTT istemcisi dağıtma

MQTT köprüsünün çalıştığını doğrulamak için Azure IoT İşlemleri ile aynı ad alanına bir MQTT istemcisi dağıtın.

Şu anda Bicep, MQTT istemcisini dağıtmak için geçerli değildir.

Abone başlatma

Mosquitto istemci podunda bir kabuk başlatmak için kullanın kubectl exec .

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

Kabuğun içinde ile konu alanında mosquitto_subAzure IoT İşlemleri aracısı abonesi tutorial/# başlatın.

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)

Komutu çalışır durumda bırakın ve yeni bir terminal penceresi açın.

MQTT iletilerini köprü aracılığıyla buluta yayımlama

Yeni bir terminal penceresinde mosquitto istemci podunda başka bir kabuk başlatın.

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

Kabuğun içinde, konuya beş ileti tutorial/local yayımlamak için mosquitto kullanın.

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)

Abonedeki iletileri görüntüleme

Abone kabuğunda yayımladığınız iletileri görürsünüz.

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

Burada, iletilerin konu başlığına yerel Azure IoT İşlemleri aracısına tutorial/local yayımlandığını, Event Grid MQTT aracısı ile köprülendirildiğini ve ardından konu üzerinde yeniden yerel Azure IoT İşlemleri aracısı ile köprülendirildiğini tutorial/cloud görürsünüz. İletiler daha sonra aboneye teslim edilir. Bu örnekte gidiş dönüş süresi yaklaşık 80 ms'dir.

İleti teslimi doğrulamak için Event Grid ölçümlerini denetleme

Ayrıca, iletilerin Event Grid MQTT aracısına teslim edildiklerinden emin olmak için Event Grid ölçümlerini de de kontrol edebilirsiniz. Azure portalında, oluşturduğunuz Event Grid ad alanına gidin. Ölçümler MQTT:Başarılı Yayımlanan İletiler> altında. İletileri yerel Azure IoT İşlemleri aracısına yayımladığınızda yayımlanan ve teslim edilen ileti sayısının arttığını görmeniz gerekir.

Başarılı MQTT iletilerini göstermek için Azure portalındaki ölçümler görünümünün ekran görüntüsü.

İpucu

CLI uzantısıyla az iot ops check --detail-level 2veri akışlarının, QoS'nin ve ileti yollarının yapılandırmalarını de kontrol edebilirsiniz.

Sonraki adımlar

Bu öğreticide, Azure Event Grid MQTT aracısı ile çift yönlü MQTT köprüsü için Azure IoT İşlemlerini yapılandırmayı öğrendiniz. Sonraki adımlar olarak aşağıdaki senaryoları inceleyin:

  • İletileri doğrudan Event Grid MQTT aracısına yayımlamak üzere bir MQTT istemcisi kullanmak için bkz . Event Grid MQTT aracısına MQTT iletileri yayımlama. İstemciye, oluşturduğunuz konu alanına yayımcı izni bağlaması verin ve veya altındaki telemetrytelemetry/temperature telemetry/humidityherhangi bir konuya ileti yayımlayabilirsiniz. Bu iletilerin tümü, yerel Azure IoT İşlemleri aracısı üzerindeki konuya bağlıdır tutorial/cloud .
  • Event Grid MQTT aracısı için yönlendirme kurallarını ayarlamak için bkz . Event Grid MQTT aracısı için yönlendirme kurallarını yapılandırma. İletileri konu adına göre farklı konulara yönlendirmek veya iletileri ileti içeriğine göre filtrelemek için yönlendirme kurallarını kullanabilirsiniz.