Öğ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
- Azure IoT İşlemleri. Bkz. Azure IoT İşlemlerini Dağıtma.
- Veri akışı profili. Bkz . Veri akışı profilini yapılandırma.
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ı 8883
ekleyin.
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 , aioInstanceName
eventGridHostName
, değerlerini sizinkiyle customLocationName
değ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şlemektelemetry/#
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_sub
Azure 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.
İpucu
CLI uzantısıyla az iot ops check --detail-level 2
veri 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
telemetry
telemetry/temperature
telemetry/humidity
herhangi bir konuya ileti yayımlayabilirsiniz. Bu iletilerin tümü, yerel Azure IoT İşlemleri aracısı üzerindeki konuya bağlıdırtutorial/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.