Dijital ikizleri yönetme
Ortamınızdaki varlıklar dijital ikizler tarafından temsil edilir. Dijital ikizlerinizi yönetmek için oluşturma, değiştirme ve kaldırma işlemleri gerekebilir.
Bu makale dijital ikizleri yönetmeye odaklanır; ilişkiler ve ikiz grafı ile bir bütün olarak çalışmak için bkz. İkiz grafını ve ilişkileri yönetme.
İpucu
Tüm SDK işlevleri zaman uyumlu ve zaman uyumsuz sürümlerde gelir.
Önkoşullar
Bu makalede Azure Digital Twins ile çalışmak için bir Azure Digital Twins örneğine ve bunu kullanmak için gerekli izinlere sahip olmanız gerekir. Zaten ayarlanmış bir Azure Digital Twins örneğiniz varsa bu örneği kullanabilir ve sonraki bölüme atlayabilirsiniz. Aksi takdirde, Örnek ve kimlik doğrulaması ayarlama başlığındaki yönergeleri izleyin. Yönergeler, her adımı başarıyla tamamladığınızdan emin olmanıza yardımcı olacak bilgiler içerir.
Örneğinizi ayarladıktan sonra, örneğin ana bilgisayar adını not edin. Konak adını Azure portalında bulabilirsiniz.
Geliştirici arabirimleri
Bu makalede .NET (C#) SDK'sını kullanarak farklı yönetim işlemlerinin nasıl tamamlandığı vurgulanmaktadır. Bu yönetim çağrılarını Azure Digital Twins API'leri ve SDK'larında açıklanan diğer dil SDK'larını kullanarak da oluşturabilirsiniz.
Bu işlemleri tamamlamak için kullanılabilecek diğer geliştirici arabirimleri şunlardır:
Görselleştirme
Azure Digital Twins Gezgini , Azure Digital Twins grafınızdaki verileri keşfetmeye yönelik görsel bir araçtır. Modellerinizi, ikizlerinizi ve ilişkilerinizi görüntülemek, sorgulamak ve düzenlemek için gezgini kullanabilirsiniz.
Azure Digital Twins Gezgini aracı hakkında bilgi edinmek için bkz . Azure Digital Twins Gezgini. Özelliklerini kullanma hakkında ayrıntılı adımlar için bkz . Azure Digital Twins Gezgini'ni kullanma.
Görselleştirme şöyle görünür:
Dijital ikiz oluşturma
İkiz oluşturmak için hizmet istemcisinde yöntemini şu şekilde kullanırsınız CreateOrReplaceDigitalTwinAsync()
:
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
Dijital ikiz oluşturmak için şunları sağlamanız gerekir:
- Dijital ikize atamak istediğiniz kimlik değeri (ikiz oluşturulduğunda bu kimliği tanımlarsınız)
- Kullanmak istediğiniz model
- İkiz verilerinin istenen şekilde başlatılması,...
- Özellikler (başlatma isteğe bağlı): İsterseniz dijital ikizin özellikleri için başlangıç değerlerini ayarlayabilirsiniz. Özellikler isteğe bağlı olarak değerlendirilir ve daha sonra ayarlanabilir, ancak ayarlanana kadar ikizin bir parçası olarak gösterilmeyeceklerini unutmayın.
- Bileşenler (bir ikizde varsa başlatma gerekir): İkiziniz herhangi bir bileşen içeriyorsa, bunlar ikiz oluşturulduğunda başlatılmalıdır. Bunlar boş nesneler olabilir, ancak bileşenlerin kendilerinin var olması gerekir.
Model ve ilk özellik değerleri, ilgili verileri içeren bir JSON dizesi olan parametresi aracılığıyla initData
sağlanır. Bu nesneyi yapılandırma hakkında daha fazla bilgi için sonraki bölüme geçin.
İpucu
İkizi oluşturduktan veya güncelleştirdikten sonra değişikliklerin sorgulara yansıtılması için 10 saniyeye kadar gecikme süresi olabilir.
GetDigitalTwin
API (bu makalenin devamında açıklanmıştır) bu gecikmeyi yaşamaz, bu nedenle anlık yanıt gerekiyorsa, yeni oluşturulan ikizlerinizi görmek için sorgulamak yerine API çağrısını kullanın.
Modeli ve özellikleri başlatma
İkiz oluşturulduğu sırada ikizin özelliklerini başlatabilirsiniz.
İkiz oluşturma API'si, ikiz özelliklerinin geçerli bir JSON açıklamasına seri hale getirilmiş bir nesneyi kabul eder. İkiz için JSON biçiminin açıklaması için bkz . Dijital ikizler ve ikiz grafiği .
İlk olarak, ikizini ve özellik verilerini temsil eden bir veri nesnesi oluşturabilirsiniz. Parametre nesnesini el ile veya sağlanan bir yardımcı sınıfı kullanarak oluşturabilirsiniz. Aşağıda her birinin bir örneği verilmiştir.
El ile oluşturulan verileri kullanarak ikiz oluşturma
Herhangi bir özel yardımcı sınıf kullanılmadan, bir ikizin özelliklerini Dictionary<string, object>
içinde temsil edebilirsiniz; burada string
özelliğin adı ve object
özelliği ve değerini temsil eden bir nesnedir.
// Define a custom model type for the twin to be created
internal class CustomDigitalTwin
{
[JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinId)]
public string Id { get; set; }
[JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinETag)]
public string ETag { get; set; }
[JsonPropertyName("temperature")]
public double Temperature { get; set; }
[JsonPropertyName("humidity")]
public double Humidity{ get; set; }
}
// Initialize properties and create the twin
public class TwinOperationsCreateTwin
{
public async Task CreateTwinAsync(DigitalTwinsClient client)
{
// Initialize the twin properties
var myTwin = new CustomDigitalTwin
{
Temperature = 25.0,
Humidity = 50.0,
};
// Create the twin
const string twinId = "<twin-ID>";
Response<CustomDigitalTwin> response = await client.CreateOrReplaceDigitalTwinAsync(twinId, myTwin);
Console.WriteLine($"Temperature value: {response.Value.Temperature}");
}
}
Yardımcı sınıfıyla ikiz oluşturma
yardımcı sınıfı BasicDigitalTwin
, özellik alanlarını doğrudan bir "ikiz" nesnesinde depolamanıza olanak tanır. Daha sonra ikiz nesnesine CustomProperties
doğrudan olarak eklenebilen bir Dictionary<string, object>
kullanarak özelliklerin listesini oluşturmak isteyebilirsiniz.
string twinId = "myTwinID";
var initData = new BasicDigitalTwin
{
Id = twinId,
Metadata = { ModelId = "dtmi:example:Room;1" },
// Initialize properties
Contents =
{
{ "Temperature", 25.0 },
{ "Humidity", 50.0 },
},
};
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
Not
BasicDigitalTwin
nesneleri bir Id
alanla birlikte gelir. Bu alanı boş bırakabilirsiniz, ancak bir kimlik değeri eklerseniz, çağrıya geçirilen kimlik parametresiyle eşleşmesi CreateOrReplaceDigitalTwinAsync()
gerekir. Örneğin:
twin.Id = "myRoomId";
İşleri İçeri Aktar API'siyle toplu olarak ikiz oluşturma
tek bir API çağrısında aynı anda çok sayıda ikiz oluşturmak için İşleri İçeri Aktar API'sini kullanabilirsiniz. Bu yöntem, ikizler ve toplu işler için Azure Digital Twins örneğinizde Azure Blob Depolama ve yazma izinlerinin kullanılmasını gerektirir.
İpucu
İşleri İçeri Aktarma API'si, bir grafiğin tüm bölümlerini aynı anda oluşturmak için modellerin ve ilişkilerin aynı çağrıda içeri aktarılmasına da olanak tanır. Bu işlem hakkında daha fazla bilgi için bkz . İçeri Aktarma İşleri API'siyle modelleri, ikizleri ve ilişkileri toplu olarak karşıya yükleme.
İkizleri toplu olarak içeri aktarmak için, ikizlerinizi (ve toplu içeri aktarma işine dahil edilen diğer kaynakları) NDJSON dosyası olarak yapılandırmanız gerekir. bölümü Twins
, bölümünden Models
sonra (ve bölümünden Relationships
önce) gelir. Dosyada tanımlanan ikizler, bu dosyada tanımlanan veya örnekte zaten mevcut olan modellere başvurabilir ve isteğe bağlı olarak ikizin özelliklerinin başlatılmasını içerebilir.
İçeri Aktarma İşleri API'sine giriş bölümünde örnek bir içeri aktarma dosyası ve bu dosyaları oluşturmak için örnek bir proje görüntüleyebilirsiniz.
Ardından, dosyanın Azure Blob Depolama'daki bir ekleme blobuna yüklenmesi gerekir. Azure depolama kapsayıcısı oluşturma yönergeleri için bkz . Kapsayıcı oluşturma. Ardından, tercih ettiğiniz karşıya yükleme yöntemini kullanarak dosyayı karşıya yükleyin (bazı seçenekler AzCopy komutu, Azure CLI veya Azure portalıdır).
NDJSON dosyası kapsayıcıya yüklendikten sonra url'sini blob kapsayıcısına alın. Bu değeri daha sonra toplu içeri aktarma API çağrısının gövdesinde kullanacaksınız.
Azure portalında blob dosyasının URL değerini gösteren ekran görüntüsü aşağıdadır:
Ardından, dosya bir İçeri Aktarma İşleri API çağrısında kullanılabilir. Giriş dosyasının blob depolama URL'sini ve hizmet tarafından oluşturulan çıktı günlüğünün nerede depolanmasını istediğinizi belirtmek için yeni bir blob depolama URL'si sağlarsınız.
Dijital ikiz için veri alma
Aşağıdaki gibi bir yöntemi çağırarak herhangi bir dijital ikizin ayrıntılarına GetDigitalTwin()
erişebilirsiniz:
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
Bu çağrı, ikiz verilerini gibi kesin olarak belirlenmiş bir nesne türü olarak BasicDigitalTwin
döndürür.
BasicDigitalTwin
, sdk ile birlikte gelen ve çekirdek ikiz meta verilerini ve özelliklerini hazırlanan biçimde döndüren bir serileştirme yardımcı sınıfıdır. veya Newtonsoft.Json
gibi System.Text.Json
tercih ettiğiniz JSON kitaplığını kullanarak ikiz verilerini istediğiniz zaman seri durumdan çıkarabilirsiniz. Ancak, bir ikize temel erişim için yardımcı sınıflar bunu daha kullanışlı hale getirebilirsiniz.
Not
BasicDigitalTwin
öznitelikleri kullanır System.Text.Json
. DigitalTwinsClient ile kullanmak BasicDigitalTwin
için istemciyi varsayılan oluşturucuyla başlatmanız veya seri hale getirici seçeneğini özelleştirmek istiyorsanız JsonObjectSerializer'ı kullanmanız gerekir.
BasicDigitalTwin
Yardımcı sınıfı, bir Dictionary<string, object>
aracılığıyla ikizde tanımlanan özelliklere de erişmenizi sağlar. İkizin özelliklerini listelemek için şunları kullanabilirsiniz:
BasicDigitalTwin twin;
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
foreach (string prop in twin.Contents.Keys)
{
if (twin.Contents.TryGetValue(prop, out object value))
Console.WriteLine($"Property '{prop}': {value}");
}
Yöntemiyle GetDigitalTwin()
bir ikiz aldığınızda yalnızca en az bir kez ayarlanmış özellikler döndürülür.
İpucu
displayName
bir ikiz için, model meta verilerinin bir parçasıdır, bu nedenle ikiz örneği için veri alırken gösterilmez. Bu değeri görmek için modelden alabilirsiniz.
Tek bir API çağrısı kullanarak birden çok ikiz almak için İkiz grafını sorgulama'daki Sorgu API'si örneklerine bakın.
Ay'ı tanımlayan aşağıdaki modeli (Digital Twins Tanım Dili (DTDL) ile yazılmış) göz önünde bulundurun:
{
"@id": "dtmi:example:Moon;1",
"@type": "Interface",
"@context": "dtmi:dtdl:context;3",
"contents": [
{
"@type": "Property",
"name": "radius",
"schema": "double",
"writable": true
},
{
"@type": "Property",
"name": "mass",
"schema": "double",
"writable": true
}
]
}
Ay türündeki bir ikizde çağrının object result = await client.GetDigitalTwinAsync("my-moon");
sonucu şu şekilde görünebilir:
{
"$dtId": "myMoon-001",
"$etag": "W/\"e59ce8f5-03c0-4356-aea9-249ecbdc07f9\"",
"radius": 1737.1,
"mass": 0.0734,
"$metadata": {
"$model": "dtmi:example:Moon;1",
"radius": {
"lastUpdateTime": "2022-12-06T20:00:32.8209188Z"
},
"mass": {
"lastUpdateTime": "2022-12-04T12:04:43.3859361Z"
}
}
}
Dijital ikizin tanımlı özellikleri, dijital ikizde üst düzey özellikler olarak döndürülür. DTDL tanımının parçası olmayan meta veriler veya sistem bilgileri bir $
ön ek ile döndürülür. Meta veri özellikleri aşağıdaki değerleri içerir:
-
$dtId
: Bu Azure Digital Twins örneğindeki dijital ikizin kimliği -
$etag
: Web sunucusu tarafından atanan standart bir HTTP alanı. Bu, ikiz her güncelleştirildiğinde yeni bir değere güncelleştirilir ve bu da ikizin verilerinin önceki bir denetimden bu yana sunucuda güncelleştirilip güncelleştirilmediğini belirlemek için yararlı olabilir. Yalnızca varlığın etag'i sağlanan etag ile eşleşiyorsa tamamlanan güncelleştirmeleri ve silmeleri gerçekleştirmek için kullanabilirsinizIf-Match
. Bu işlemler hakkında daha fazla bilgi için DigitalTwins Update ve DigitalTwins Delete belgelerine bakın. -
$metadata
: Aşağıdakileri içerebilen bir dizi meta veri özelliği:-
$model
, dijital ikizin modelinin DTMI'sı. -
lastUpdateTime
ikiz özellikleri için. Bu, Azure Digital Twins'in özellik güncelleştirme iletisini işlediği tarihi ve saati gösteren bir zaman damgasıdır -
sourceTime
ikiz özellikleri için. Bu, özellik güncelleştirmesinin gerçek dünyada gözlemlendiği zaman damgasını temsil eden isteğe bağlı, yazılabilir bir özelliktir.
-
Dijital ikiz JSON biçiminde bir dijital ikizde bulunan alanlar hakkında daha fazla bilgi edinebilirsiniz. Azure Digital Twins API'leri ve SDK'ları gibi BasicDigitalTwin
serileştirme yardımcı sınıfları hakkında daha fazla bilgi edinebilirsiniz.
Tüm dijital ikizleri görüntüle
Örneğinizdeki tüm dijital ikizleri görüntülemek için bir sorgu kullanın. Sorgu API'leri veya CLI komutları ile bir sorgu çalıştırabilirsiniz.
Örnekteki tüm dijital ikizlerin listesini döndüren temel sorgunun gövdesi aşağıdadır:
SELECT * FROM DIGITALTWINS
Dijital ikiz güncelleştirme
Dijital ikizin özelliklerini güncelleştirmek için, değiştirmek istediğiniz bilgileri JSON Patch biçiminde yazın. ve dahil olmak üzere replace
add
remove
kullanılabilecek JSON Düzeltme Eki işlemlerinin tam listesi için bkz. JSON Düzeltme Eki İşlemleri.
Güncelleştirme bilgilerini içeren JSON Patch belgesini ürettikten sonra, belgeyi yöntemine UpdateDigitalTwin()
geçirin:
await client.UpdateDigitalTwinAsync(twinId, updateTwinData);
Tek bir düzeltme eki çağrısı, tek bir ikizde istediğiniz kadar özelliği güncelleştirebilir (tümü bile). Birden çok ikiz arasında özellikleri güncelleştirmeniz gerekiyorsa, her ikiz için ayrı bir güncelleştirme çağrısına ihtiyacınız vardır.
İpucu
İkizi oluşturduktan veya güncelleştirdikten sonra değişikliklerin sorgulara yansıtılması için 10 saniyeye kadar gecikme süresi olabilir.
GetDigitalTwin
API (bu makalenin önceki bölümlerinde açıklanan) bu gecikmeyle karşılaşmaz, bu nedenle anlık yanıta ihtiyacınız varsa yeni güncelleştirilen ikizlerinizi görmek için sorgulama yerine API çağrısını kullanın.
JSON Patch kodu örneği aşağıda verilmiştır. Bu belge, uygulandığı dijital ikizin kütle ve yarıçap özellik değerlerinin yerini alır. Bu örnekte, mevcut bir özelliğin değerinin yerini alan JSON Patch replace
işlemi gösterilir.
[
{
"op": "replace",
"path": "/mass",
"value": 0.0799
},
{
"op": "replace",
"path": "/radius",
"value": 0.800
}
]
.NET SDK'sını kullanarak bir kod projesinden ikiz güncelleştirirken, Azure .NET SDK'sının JsonPatchDocument'ını kullanarak JSON düzeltme ekleri oluşturabilirsiniz. JSON Düzeltme Eki belgesi oluşturma ve proje kodunda kullanma UpdateDigitalTwin()
örneği aşağıda verilmiştır.
var updateTwinData = new JsonPatchDocument();
updateTwinData.AppendAdd("/Temperature", 25.0);
updateTwinData.AppendAdd("/myComponent/Property", "Hello");
// Un-set a property
updateTwinData.AppendRemove("/Humidity");
await client.UpdateDigitalTwinAsync("myTwin", updateTwinData).ConfigureAwait(false);
İpucu
Alanı bu bölümde açıklanan işlemle güncelleştirerek $metadata.<property-name>.sourceTime
dijital ikizlerinizde kaynak zaman damgalarını koruyabilirsiniz. Bu alan ve dijital ikizler üzerine yazılabilen diğer alanlar hakkında daha fazla bilgi için bkz . Dijital ikiz JSON biçimi.
Dijital ikiz bileşenlerindeki alt özellikleri güncelleştirme
Bir modelin bileşenler içerebileceğini ve bu sayede diğer modellerden oluşturulabileceğini hatırlayın.
Dijital ikizin bileşenlerindeki özelliklere yama uygulamak için JSON Düzeltme Eki'nde yol söz dizimini kullanabilirsiniz:
[
{
"op": "replace",
"path": "/mycomponentname/mass",
"value": 0.0799
}
]
Nesne türü özelliklerindeki alt özellikleri güncelleştirme
Modeller bir nesne türünde özellikler içerebilir. Bu nesnelerin kendi özellikleri olabilir ve nesne türü özelliğine ait bu alt özelliklerden birini güncelleştirmek isteyebilirsiniz. Bu işlem, bileşenlerdeki alt özellikleri güncelleştirme işlemine benzer, ancak bazı ek adımlar gerektirebilir.
nesne türü özelliğine sahip bir model düşünün: ObjectProperty
.
ObjectProperty
adlı StringSubProperty
bir dize özelliğine sahiptir.
Bu model kullanılarak bir ikiz oluşturulduğunda, o zaman örneği ObjectProperty
oluşturmak gerekmez. İkiz oluşturma sırasında nesne özelliği örneği oluşturulmazsa, erişmek ObjectProperty
için varsayılan yol oluşturulmaz ve bir düzeltme eki işlemi için bu yol oluşturulmaz StringSubProperty
. Özelliklerini güncelleştirebilmek için ObjectProperty
önce yolu kendinize eklemeniz gerekir.
Bu, aşağıdaki gibi bir JSON Patch add
işlemiyle yapılabilir:
[
{
"op": "add",
"path": "/ObjectProperty",
"value": {"StringSubProperty":"<string-value>"}
}
]
Not
Birden fazla özelliği varsa ObjectProperty
, yalnızca birini güncelleştiriyor olsanız bile bunların tümünü value
bu işlemin alanına eklemeniz gerekir:
... "value": {"StringSubProperty":"<string-value>", "Property2":"<property2-value>", ...}
Bu bir kez yapıldıktan sonra bir yolu StringSubProperty
vardır ve bundan sonra doğrudan tipik replace
bir işlemle güncelleştirilebilir:
[
{
"op": "replace",
"path": "/ObjectProperty/StringSubProperty",
"value": "<string-value>"
}
]
İkiz oluşturulduğunda örneği oluşturulan durumlarda ObjectProperty
ilk adım gerekli olmasa da, nesne özelliğinin ilk kez oluşturulup oluşturulmadığını her zaman kesin olarak bilmediğiniz için, bir alt özelliği ilk kez güncelleştirdiğinizde bunu kullanmanız önerilir.
Dijital ikizin modelini güncelleştirme
İşlev, UpdateDigitalTwin()
dijital ikizleri farklı bir modele geçirmek için de kullanılabilir.
Örneğin, dijital ikizin meta veri $model
alanının yerini alan aşağıdaki JSON Patch belgesini göz önünde bulundurun:
[
{
"op": "replace",
"path": "/$metadata/$model",
"value": "dtmi:example:foo;1"
}
]
Bu işlem yalnızca düzeltme eki tarafından değiştirilen dijital ikiz yeni modele uygunsa başarılı olur.
Aşağıdaki örneği inceleyin:
- foo_old modeline sahip bir dijital ikiz düşünün. foo_old gerekli bir özellik kütlesi tanımlar.
- Yeni model foo_new bir özellik kütlesi tanımlar ve yeni bir gerekli özellik sıcaklığı ekler.
- Yamadan sonra dijital ikizin hem kütle hem de sıcaklık özelliği olmalıdır.
Bu durum için düzeltme ekinin hem modeli hem de ikizin sıcaklık özelliğini şu şekilde güncelleştirmesi gerekir:
[
{
"op": "replace",
"path": "/$metadata/$model",
"value": "dtmi:example:foo_new;1"
},
{
"op": "add",
"path": "/temperature",
"value": 60
}
]
Özelliğin sourceTime değerini güncelleştirme
İsteğe bağlı olarak, gerçek dünyada özellik güncelleştirmelerinin sourceTime
ne zaman gözlemlendiğine ilişkin zaman damgalarını kaydetmek için ikizi özelliklerindeki alanını kullanmaya karar vekleyebilirsiniz. Azure Digital Twins her ikiz özelliği için meta verilerde yerel olarak destekler sourceTime
. Değerin sourceTime
ISO 8601 tarih ve saat biçimine uygun olması gerekir. Bu alan ve dijital ikizler hakkındaki diğer alanlar hakkında daha fazla bilgi için bkz . Dijital ikiz JSON biçimi.
Bu alanı desteklemek için en düşük kararlı REST API sürümü 2022-05-31 sürümüdür. Azure Digital Twins SDK'larını kullanarak bu alanla çalışmak için, bu alanın dahil olduğundan emin olmak için SDK'nın en son sürümünü kullanmanızı öneririz.
Bir özelliğin hem değerini sourceTime
hem de alanını güncelleştiren bir JSON Patch belgesi örneği aşağıda verilmiştir Temperature
:
[
{
"op": "replace",
"path": "/Temperature",
"value": "22.3"
},
{
"op": "replace",
"path": "/$metadata/Temperature/sourceTime",
"value": "2021-11-30T18:47:53.7648958Z"
}
]
Bir bileşenin sourceTime
parçası olan bir özellikte alanı güncelleştirmek için, yolun başlangıcına bileşeni ekleyin. Yukarıdaki örnekte yol değerini /$metadata/Temperature/sourceTime
myComponent/$metadata/Temperature/sourceTime
olarak değiştirerek bunu yapabilirsiniz.
Not
Bir özellikte sourceTime
hem hem de değerini güncelleştirir ve daha sonra yalnızca özelliğin değerini güncelleştirirseniz, ilk güncelleştirmeden sourceTime
gelen zaman damgası kalır.
Çakışan güncelleştirme çağrılarını işleme
Azure Digital Twins, gelen tüm isteklerin ardı ardına işlenmesini sağlar. Başka bir deyişle, birden çok işlev aynı özelliği aynı anda bir ikizde güncelleştirmeye çalışsa bile, çakışmayı işlemek için açık kilitleme kodu yazmanıza gerek yoktur.
Bu davranış her ikiz için geçerlidir.
Örneğin, bu üç çağrının aynı anda geldiği bir senaryo düşünün:
- İkiz1 üzerinde A yazma özelliği
- İkiz1'de B yazma özelliği
- İkizde A özelliği yazma2
Twin1'i değiştiren iki çağrı birbiri ardına yürütülür ve her değişiklik için değişiklik iletileri oluşturulur. Twin2'yi değiştirme çağrısı, geldiğinde çakışma olmadan eşzamanlı olarak yürütülebilir.
Dijital ikiz silme
yöntemini kullanarak DeleteDigitalTwin()
ikizleri silebilirsiniz. Ancak, bir ikizin yalnızca başka ilişkisi olmadığında silebilirsiniz. Bu nedenle, önce ikizin gelen ve giden ilişkilerini silin.
burada ikizleri ve ilişkilerini silmeye yönelik bir kod örneği verilmiştir. SDK DeleteDigitalTwin
çağrısı, daha geniş örnek bağlamda nereye düştüğünü netleştirmek için vurgulanır.
private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
{
await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
try
{
await client.DeleteDigitalTwinAsync(twinId);
Console.WriteLine("Twin deleted successfully");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error:{ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);
await foreach (BasicRelationship rel in rels)
{
await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);
await foreach (IncomingRelationship incomingRel in incomingRels)
{
await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
}
}
Tüm dijital ikizleri silme
Tüm ikizlerin aynı anda nasıl silineceğiyle ilgili bir örnek için, Örnek istemci uygulamasıyla temel bilgileri keşfetme bölümünde kullanılan örnek uygulamayı indirin.
CommandLoop.cs dosyası bunu bir CommandDeleteAllTwins()
işlevde yapar.
Not
Bir örnekteki tüm modelleri, ikizleri ve ilişkileri aynı anda silmek istiyorsanız, İşleri Sil API'sini kullanın.
Çalıştırılabilir dijital ikiz kod örneği
Aşağıdaki çalıştırılabilir kod örneğini kullanarak bir ikiz oluşturabilir, ayrıntılarını güncelleştirebilir ve ikizini silebilirsiniz.
Örnek proje dosyalarını ayarlama
Kod parçacığı, Room.json örnek bir model tanımı kullanır. Model dosyasını kodunuzda kullanabilmek için indirmek için bu bağlantıyı kullanarak doğrudan GitHub'daki dosyaya gidin. Ardından, ekranda herhangi bir yere sağ tıklayın, tarayıcınızın sağ tıklama menüsünde Farklı kaydet'i seçin ve dosyayı Room.json olarak kaydetmek için Farklı Kaydet penceresini kullanın.
Ardından Visual Studio'da veya seçtiğiniz düzenleyicide yeni bir konsol uygulaması projesi oluşturun.
Ardından, çalıştırılabilir örneğin aşağıdaki kodunu projenize kopyalayın:
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System.IO;
namespace DigitalTwins_Samples
{
class TwinOperationsSample
{
public static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
// Create the Azure Digital Twins client for API calls
string adtInstanceUrl = "https://<your-instance-hostname>";
var credentials = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credentials);
Console.WriteLine($"Service client created – ready to go");
// Upload models
Console.WriteLine($"Upload a model");
string dtdl = File.ReadAllText("<path-to>/Room.json");
var models = new List<string> { dtdl };
// Upload the model to the service
await client.CreateModelsAsync(models);
// Create new digital twin
// <CreateTwin_withHelper>
string twinId = "myTwinID";
var initData = new BasicDigitalTwin
{
Id = twinId,
Metadata = { ModelId = "dtmi:example:Room;1" },
// Initialize properties
Contents =
{
{ "Temperature", 25.0 },
{ "Humidity", 50.0 },
},
};
// <CreateTwinCall>
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
// </CreateTwinCall>
// </CreateTwin_withHelper>
Console.WriteLine("Twin created successfully");
//Print twin
Console.WriteLine("--- Printing twin details:");
await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
Console.WriteLine("--------");
//Update twin data
var updateTwinData = new JsonPatchDocument();
updateTwinData.AppendAdd("/Temperature", 30.0);
// <UpdateTwinCall>
await client.UpdateDigitalTwinAsync(twinId, updateTwinData);
// </UpdateTwinCall>
Console.WriteLine("Twin properties updated");
Console.WriteLine();
//Print twin again
Console.WriteLine("--- Printing twin details (after update):");
await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
Console.WriteLine("--------");
Console.WriteLine();
//Delete twin
await CustomMethod_DeleteTwinAsync(client, twinId);
}
private static async Task<BasicDigitalTwin> CustomMethod_FetchAndPrintTwinAsync(string twinId, DigitalTwinsClient client)
{
// <GetTwin>
BasicDigitalTwin twin;
// <GetTwinCall>
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
// </GetTwinCall>
Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
foreach (string prop in twin.Contents.Keys)
{
if (twin.Contents.TryGetValue(prop, out object value))
Console.WriteLine($"Property '{prop}': {value}");
}
// </GetTwin>
return twin;
}
// <DeleteTwin>
private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
{
await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
try
{
await client.DeleteDigitalTwinAsync(twinId);
Console.WriteLine("Twin deleted successfully");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error:{ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);
await foreach (BasicRelationship rel in rels)
{
await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);
await foreach (IncomingRelationship incomingRel in incomingRels)
{
await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
}
}
// </DeleteTwin>
}
}
Not
Şu anda sarmalayıcı sınıfını DefaultAzureCredential
etkileyen ve kimlik doğrulaması sırasında hataya neden olabilecek bilinen bir sorun vardır. Bu sorunla karşılaşırsanız, çözmek için aşağıdaki isteğe bağlı parametreyle örnek DefaultAzureCredential
oluşturmayı deneyebilirsiniz: new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true });
Bu sorun hakkında daha fazla bilgi için bkz . Azure Digital Twins bilinen sorunlar.
Projeyi yapılandırma
Ardından, proje kodunuzu yapılandırmak için aşağıdaki adımları tamamlayın:
Daha önce indirdiğiniz Room.json dosyasını projenize ekleyin ve programınıza nerede bulacağınızı bildirmek için koddaki yer tutucuyu değiştirin
<path-to>
.Yer tutucuyu
<your-instance-hostname>
Azure Digital Twins örneğinizin ana bilgisayar adıyla değiştirin.Projenize Azure Digital Twins ile çalışmak için gereken iki bağımlılık ekleyin. Birincisi .NET için Azure Digital Twins SDK'sının paketi, ikincisi ise Azure'da kimlik doğrulamasına yardımcı olacak araçlar sağlar.
dotnet add package Azure.DigitalTwins.Core dotnet add package Azure.Identity
Örneği doğrudan çalıştırmak istiyorsanız yerel kimlik bilgilerini de ayarlamanız gerekir. Sonraki bölümde bunun üzerinden geçilir.
Yerel Azure kimlik bilgilerini ayarlama
Bu örnek, yerel makinenizde çalıştırdığınızda Azure Digital Twins örneğiyle kullanıcıların kimliğini doğrulamak için DefaultAzureCredential (kitaplığın bir parçasıAzure.Identity
) kullanır. bir istemci uygulamasının Azure Digital Twins ile kimlik doğrulaması yapmanın farklı yolları hakkında daha fazla bilgi için bkz . Uygulama kimlik doğrulama kodu yazma.
ileDefaultAzureCredential
, örnek yerel ortamınızda yerel Azure CLI'da veya Visual Studio ya da Visual Studio Code'da Azure oturumu açma gibi kimlik bilgilerini arar. Bu nedenle, örneğin kimlik bilgilerini ayarlamak için bu mekanizmalardan biriyle Azure'da yerel olarak oturum açmanız gerekir.
Kod örneklerini çalıştırmak için Visual Studio veya Visual Studio Code kullanıyorsanız, Azure Digital Twins örneğine erişmek için kullanmak istediğiniz Azure kimlik bilgileriyle bu düzenleyicide oturum açtığınızdan emin olun. Yerel CLI penceresi kullanıyorsanız Azure hesabınızda oturum açmak için komutunu çalıştırın az login
. Bundan sonra, kod örneğinizi çalıştırdığınızda otomatik olarak kimliğiniz doğrulanmalıdır.
Örneği çalıştırma
Kurulum tamamlandıktan sonra örnek kod projesini çalıştırabilirsiniz.
Yukarıdaki programın konsol çıkışı aşağıdadır:
Sonraki adımlar
Dijital ikizleriniz arasında ilişki oluşturmayı ve yönetmeyi öğrenin: