IoT Hub ileti yönlendirme sorgusu söz dizimi
İleti yönlendirme, kullanıcıların cihaz telemetri iletileri, cihaz yaşam döngüsü olayları ve cihaz ikizi değişiklik olayları gibi farklı veri türlerini çeşitli uç noktalara yönlendirmesine olanak tanır. Ayrıca, önemli olan verileri almak üzere yönlendirmeden önce bu verilere zengin sorgular uygulayabilirsiniz. Bu makalede, IoT Hub ileti yönlendirme sorgu dili açıklanır ve bazı yaygın sorgu desenleri sağlanır.
Not
Bu makalede bahsedilen buluttan cihaza mesajlaşma, cihaz ikizleri ve cihaz yönetimi gibi bazı özellikler yalnızca standart IoT Hub katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanını seçme.
İleti yönlendirme, ileti özellikleri ve ileti gövdesinin yanı sıra cihaz ikizi etiketlerini ve cihaz ikizi özelliklerini sorgulamanıza olanak tanır. İleti gövdesi JavaScript Nesne Gösterimi (JSON) biçiminde değilse, ileti yönlendirme işlemi iletiyi yönlendirmeye devam edebilir, ancak sorgular ileti gövdesine uygulanamaz. Sorgular, doğruysa sorgunun başarılı olduğu ve tüm gelen verileri yönlendirdiği Boole ifadeleri olarak tanımlanır; aksi takdirde sorgu başarısız olur ve gelen veriler yönlendirilmiş olmaz. İfade null veya tanımsız bir değer olarak değerlendirilirse Boole yanlış değeri olarak kabul edilir ve IoT Hub yol kaynak günlüklerinde bir hata oluşturulur. Yolun kaydedilip değerlendirilmesi için sorgu söz dizimi doğru olmalıdır.
İleti özelliklerine göre ileti yönlendirme sorgusu
IoT Hub, protokoller arasında birlikte çalışabilirlik için tüm cihazlardan buluta mesajlaşma için ortak bir biçim tanımlar. IoT Hub iletinin aşağıdaki JSON gösterimini varsayar. Sistem özellikleri tüm kullanıcılar için eklenir ve iletinin içeriğini tanımlar. Kullanıcılar iletiye seçmeli olarak uygulama özellikleri ekleyebilir. Cihazdan buluta mesajlaşma IoT Hub büyük/küçük harfe duyarlı olmadığından benzersiz özellik adlarını kullanmanızı öneririz. Örneğin, aynı ada sahip birden çok özelliğiniz varsa, IoT Hub özelliklerden yalnızca birini gönderir.
{
"message": {
"systemProperties": {
"contentType": "application/json",
"contentEncoding": "UTF-8",
"iothub-message-source": "deviceMessages",
"iothub-enqueuedtime": "2017-05-08T18:55:31.8514657Z"
},
"appProperties": {
"processingPath": "{cold | warm | hot}",
"verbose": "{true, false}",
"severity": 1-5,
"testDevice": "{true | false}"
},
"body": "{\"Weather\":{\"Temperature\":50}}"
}
}
Sistem özellikleri
Sistem özellikleri, iletilerin içeriğini ve kaynağını belirlemeye yardımcı olur ve bazıları aşağıdaki tabloda açıklanmıştır.
Özellik | Tür | Açıklama |
---|---|---|
Contenttype | string | Kullanıcı iletinin içerik türünü belirtir. İleti gövdesinde sorgulamaya izin vermek için bu değer olarak application/JSON ayarlanmalıdır. |
Contentencoding | string | Kullanıcı iletinin kodlama türünü belirtir. contentType özelliği olarak ayarlandıysaapplication/JSON , izin verilen değerler UTF-8 , UTF-16 ve UTF-32 değerleridir. |
iothub-connection-device-id | string | Bu değer IoT Hub tarafından ayarlanır ve cihazın kimliğini tanımlar. Sorgulamak için kullanın $connectionDeviceId . |
iothub-connection-module-id | string | Bu değer IoT Hub tarafından ayarlanır ve kenar modülünün kimliğini tanımlar. Sorgulamak için kullanın $connectionModuleId . |
iothub-enqueuedtime | string | Bu değer IoT Hub tarafından ayarlanır ve utc cinsinden iletinin gerçek sıralanma saatini temsil eder. Sorgulamak için kullanın $enqueuedTime . |
dt-dataschema | string | Bu değer, cihazdan buluta iletilerde IoT Hub tarafından ayarlanır. Cihaz bağlantısında ayarlanan cihaz modeli kimliğini içerir. Sorgulamak için kullanın $dt-dataschema . |
dt-subject | string | Cihazdan buluta iletileri gönderen bileşenin adı. Sorgulamak için kullanın $dt-subject . |
Önceki tabloda iletide kullanılabilen sistem özelliklerinden yalnızca bazıları açıklanmaktadır. Diğer kullanılabilir sistem özellikleri hakkında daha fazla bilgi için bkz. IoT Hub iletileri oluşturma ve okuma.
Uygulama özellikleri
Uygulama özellikleri, iletiye eklenebilen kullanıcı tanımlı dizelerdir. Bu alanlar isteğe bağlıdır.
Sorgu ifadeleri
İleti sistemi özelliklerindeki bir sorgunun $
önüne simgesi eklenmelidir. Uygulama özelliklerindeki sorgulara adları ile erişilir ve ön ekinde $
sembol bulunmamalıdır. Bir uygulama özellik adı ile $
başlıyorsa, IoT Hub önce sistem özelliklerinde onu arar ve bulunamazsa uygulama özelliklerinde arar. Aşağıdaki örneklerde sistem özellikleri ve uygulama özelliklerini sorgulama gösterilmektedir.
Sistem özelliği içeriğinde sorgulamak için Kodlama:
$contentEncoding = 'UTF-8'
ProcessingPath uygulama özelliğinde sorgulamak için:
processingPath = 'hot'
Bu sorguları birleştirmek için Boole ifadelerini ve işlevlerini kullanabilirsiniz:
$contentEncoding = 'UTF-8' AND processingPath = 'hot'
Cihaz ve modül ikizleri, işler ve ileti yönlendirme için IoT Hub sorgu dilinin İfade vekoşullar bölümünde desteklenen işleçlerin ve işlevlerin tam listesi sağlanır.
İleti gövdesini temel alan ileti yönlendirme sorgusu
İleti gövdesinde sorgulamayı etkinleştirmek için ileti JSON biçiminde olmalı ve UTF-8, UTF-16 veya UTF-32 ile kodlanmalıdır. Sistem contentType
özelliği olarak application/JSON
ayarlanmalıdır. Sistem özelliği, contentEncoding
bu sistem özelliği tarafından desteklenen UTF kodlama değerlerinden birine ayarlanmalıdır. Bu sistem özellikleri belirtilmezse, IoT Hub ileti gövdesindeki sorgu ifadesini değerlendirmez.
Aşağıdaki örnekte düzgün biçimlendirilmiş ve kodlanmış bir JSON gövdesine sahip bir iletinin nasıl oluşturulacağı gösterilmektedir:
var messageBody = JSON.stringify(Object.assign({}, {
"Weather": {
"Temperature": 50,
"Time": "2017-03-09T00:00:00.000Z",
"PrevTemperatures": [
20,
30,
40
],
"IsEnabled": true,
"Location": {
"Street": "One Microsoft Way",
"City": "Redmond",
"State": "WA"
},
"HistoricalData": [
{
"Month": "Feb",
"Temperature": 40
},
{
"Month": "Jan",
"Temperature": 30
}
]
}
}));
// Encode message body using UTF-8
var messageBytes = Buffer.from(messageBody, "utf8");
var message = new Message(messageBytes);
// Set message body type and content encoding
message.contentEncoding = "utf-8";
message.contentType = "application/json";
// Add other custom application properties
message.properties.add("Status", "Active");
deviceClient.sendEvent(message, (err, res) => {
if (err) console.log('error: ' + err.toString());
if (res) console.log('status: ' + res.constructor.name);
});
Not
Bu, JavaScript'te ileti gövdesinin kodlamasının nasıl işlendiğini gösterir. C# dilinde bir örnek görmek istiyorsanız . .NET için Microsoft Azure IoT SDK'sını indirin ve sıkıştırılmış klasörü (azure-iot-sdk-csharp-main.zip) genişletin. HubRoutingSample cihaz örneğinin Program.cs dosyası, SDK'nın \iothub\device\samples\how to guides\HubRoutingSample alt klasöründe iletilerin nasıl kodlanıp IoT hub'ına gönderilip gönderilip kodlanacaklarını gösterir. Bu, İleti Yönlendirme öğreticisinde açıklandığı gibi ileti yönlendirmeyi test etmede kullanılan örnekle aynıdır. Program.cs dosyasında ayrıca kodlanmış dosyalardan birini okuyan, kodu çözen ve okuyabilmeniz için ASCII olarak geri yazan adlı ReadOneRowFromFile
bir yöntemi vardır.
Sorgu ifadeleri
İleti gövdesindeki bir sorguya ön ek $body
eklenmelidir. Sorgu ifadesinde gövde başvurusu, gövde dizisi başvurusu veya birden çok gövde başvurusu kullanabilirsiniz. Sorgu ifadeniz bir gövde başvurusunu ileti sistemi özellikleri başvurusu veya ileti uygulaması özellikleri başvurusuyla da birleştirebilir. Örneğin, aşağıdaki örneklerin tümü geçerli sorgu ifadeleridir:
$body.Weather.HistoricalData[0].Month = 'Feb'
$body.Weather.Temperature = 50 AND $body.Weather.IsEnabled
length($body.Weather.Location.State) = 2
$body.Weather.Temperature = 50 AND processingPath = 'hot'
Not
Değişen değişikliklere göre bir ikiz bildirimi yükünü filtrelemek için ileti gövdesinde sorgunuzu çalıştırın. Örneğin, üzerinde istenen bir özellik değişikliği sendFrequency
olduğunda ve değer 10'dan büyük olduğunda filtrelemek için:
$body.properties.desired.telemetryConfig.sendFrequency > 10
Özellik değişikliği içeren iletileri filtrelemek için, özelliğin değeri ne olursa olsun işlevini kullanabilirsiniz is_defined()
(değer ilkel bir tür olduğunda):
is_defined($body.properties.desired.telemetryConfig.sendFrequency)
Not
Sorguları ve işlevleri yalnızca gövde başvurusundaki özelliklerde çalıştırabilirsiniz. Gövde başvurusunun tamamında sorgu veya işlev çalıştıramazsınız. Örneğin, aşağıdaki sorgu desteklenmez ve döndürür undefined
:
$body[0] = 'Feb'
Cihaz ikizi temelinde ileti yönlendirme sorgusu
İleti yönlendirme, JSON nesneleri olan Cihaz İkizi etiketlerini ve özelliklerini sorgulamanızı sağlar. Modül ikizinde sorgulama da desteklenir. Aşağıdaki örnekte cihaz ikizi etiketleri ve özellikleriyle ilgili bir sorgu gösterilmektedir.
{
"tags": {
"deploymentLocation": {
"building": "43",
"floor": "1"
}
},
"properties": {
"desired": {
"telemetryConfig": {
"sendFrequency": "5m"
},
"$metadata" : {...},
"$version": 1
},
"reported": {
"telemetryConfig": {
"sendFrequency": "5m",
"status": "success"
},
"batteryLevel": 55,
"$metadata" : {...},
"$version": 4
}
}
}
Not
Modüller, karşılık gelen cihazlarından ikiz etiketlerini devralmaz. Cihaz modüllerinden (örneğin, IoT Edge modüllerden) kaynaklanan iletiler için ikiz sorguları, ilgili cihaz ikizini değil modül ikizini sorgular.
Sorgu ifadeleri
Cihaz ikizi veya modül ikizinde bir sorguya ön ek $twin
eklenmelidir. Sorgu ifadeniz bir ikiz etiketini veya özellik başvurusunu gövde başvurusu, ileti sistemi özellikleri başvurusu veya ileti uygulaması özellikleri başvurusuyla da birleştirebilir. Sorgu büyük/küçük harfe duyarlı olmadığından etiketlerde ve özelliklerde benzersiz adlar kullanmanızı öneririz. Bu öneri hem cihaz ikizleri hem de modül ikizleri için geçerlidir. Ayrıca , $twin
, body
veya $body
özelliğini özellik adları olarak kullanmaktan twin
kaçınmanızı öneririz. Örneğin, aşağıdaki örneklerin tümü geçerli sorgu ifadeleridir:
$twin.properties.desired.telemetryConfig.sendFrequency = '5m'
$body.Weather.Temperature = 50 AND $twin.properties.desired.telemetryConfig.sendFrequency = '5m'
$twin.tags.deploymentLocation.floor = 1
Sınırlamalar
Yönlendirme sorguları özellik adlarında, ileti gövdesi yolunda veya cihaz/modül ikiz yolunda boşluk veya aşağıdaki karakterlerden herhangi birinin kullanılmasını desteklemez: ()<>@,;:\"/?={}
.
Sonraki adımlar
- İleti yönlendirme hakkında bilgi edinin.
- İleti yönlendirme öğreticisini deneyin.