IoT Tak Çalıştır hizmeti geliştirici kılavuzu

IoT Tak Çalıştır, özelliklerini Azure IoT uygulamalarına tanıtan IoT cihazları derlemenizi sağlar. IoT Tak Çalıştır cihazlar, müşteri tarafından etkinleştirilmiş uygulamalara bağlandığında el ile IoT Tak Çalıştır gerektirmez.

IoT Tak Çalıştır, model kimliğini duyuran cihazları IoT hub'ınız ile birlikte kullanmanızı sağlar. Örneğin, bir cihazın özelliklerine ve komutlarına doğrudan erişebilirsiniz.

IoT IoT Tak Çalıştır hub'ınıza bağlı bir IoT cihazı kullanmak için:

Hizmet SDK'ları

Cihazlar ve modüllerle etkileşim kurmak için çözümünüzde Azure IoT Hizmeti SDK'larını kullanın. Örneğin, ikiz özelliklerini okumak, güncelleştirmek ve komutları çağırmak için hizmet SDK'lerini kullanabilirsiniz. Desteklenen diller C#, Java, Node.js ve Python'dır.

Hizmet SDK'leri, masaüstü veya web uygulaması gibi bir çözümden cihaz bilgilerine erişmeye olanak sağlar. Hizmet SDK'leri, model kimliğini almak için kullanabileceğiniz iki ad alanı ve nesne modeli içerir:

  • Iot Hub hizmet istemcisi. Bu hizmet, model kimliğini cihaz ikizi özelliği olarak gösterir.

  • Digital Twins istemci. Yeni Digital Twins API'si bileşenler, Digital Twins ve komutlar gibi farklı Tanım Dili (DTDL) model yapılarını kullanır. Dijital İkiz API'leri, çözüm oluşturucuların yeni çözümler oluşturma IoT Tak Çalıştır kolaylaştırır.

Aşağıdaki kaynaklar da kullanılabilir:

IoT Hub hizmeti istemci örnekleri

Bu bölümde, IoT Hub istemcisini ve RegistryManager ve ServiceClient sınıflarını kullanan C# örnekleri yer almaktadır. Cihaz ikizlerini kullanarak cihaz durumuyla etkileşim kurmak için RegistryManager sınıfını kullanırsanız. Kayıt defterinizin cihaz kayıtlarını sorgulamak için RegistryManager sınıfını da IoT Hub. Cihaz komutlarını çağıran ServiceClient sınıfını kullanırsınız. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar. Kod parçacıklarında değişkeni, deviceTwinId IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Cihaz ikizi ve model kimliğini al

IoT hub'ınıza bağlanan IoT Tak Çalıştır cihaz ikizi ve model kimliğini almak için:

RegistryManager registryManager = RegistryManager.CreateFromConnectionString(parameters.HubConnectionString);

Twin twin = await registryManager.GetTwinAsync(deviceTwinId);
Console.WriteLine($"Device twin: \n{JsonConvert.SerializeObject(twin, Formatting.Indented)}");
Console.WriteLine($"Model ID: {twin.ModelId}.");

Cihaz ikizlerini güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. Örnekte, güncelleştirmeden önce ikizin nasıl alınarak elde ETag etmek zorunda olduğunu gösterir. özelliği, cihazın varsayılan bileşeninde tanımlanır:

Twin twin = await registryManager.GetTwinAsync(deviceTwinId);

int desiredTargetTemperature = 60;

// Update the twin
var twinPatch = new Twin();
twinPatch.Properties.Desired["targetTemperature"] = desiredTargetTemperature;

Console.WriteLine($"Update the targetTemperature property to {desiredTargetTemperature}.");

await registryManager.UpdateTwinAsync(deviceTwinId, twinPatch, twin.ETag);

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. Örnekte, güncelleştirmeden önce ikizin nasıl alınarak elde ETag etmek zorunda olduğunu gösterir. özelliği Thermostat1 bileşeninde tanımlanır:

Twin twin = await registryManager.GetTwinAsync(deviceTwinId);

int desiredTargetTemperature = 60;

var twinPatch = CreatePropertyPatch("targetTemperature", desiredTargetTemperature, "thermostat1");

await registryManager.UpdateTwinAsync(deviceTwinId, twinPatch, twin.ETag);

// ...

private static Twin CreatePropertyPatch(string propertyName, object propertyValue, string componentName)
{
    var twinPatch = new Twin();
    twinPatch.Properties.Desired[componentName] = new
    {
        __t = "c"
    };
    twinPatch.Properties.Desired[componentName][propertyName] = JsonConvert.SerializeObject(propertyValue);
    return twinPatch;
}

Bir bileşende özellik için, özellik düzeltme eki aşağıdaki örnekteki gibi olur:

{
"sampleComponentName":
  {
    "__t": "c",
    "samplePropertyName": 20
  }
}

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

ServiceClient serviceClient = ServiceClient.CreateFromConnectionString(parameters.HubConnectionString);

var commandInvocation = new CloudToDeviceMethod("getMaxMinReport") { ResponseTimeout = TimeSpan.FromSeconds(30) };

// Set command payload
DateTimeOffset since = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(2));
string componentCommandPayload = JsonConvert.SerializeObject(since);
commandInvocation.SetPayloadJson(componentCommandPayload);

try
{
  CloudToDeviceMethodResult result = await serviceClient.InvokeDeviceMethodAsync(deviceTwinId, commandInvocation);

  Console.WriteLine($"Command getMaxMinReport was invoked." +
      $"\nDevice returned status: {result.Status}. \nReport: {result.GetPayloadAsJson()}");
}
catch (DeviceNotFoundException)
{
    Console.WriteLine($"Unable to execute command getMaxMinReport on {deviceTwinId}.";
}

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. Komutu Thermostat1 bileşeninde tanımlanır:

// Create command name to invoke for component. The command is formatted as <component name>*<command name>
string commandToInvoke = "thermostat1*getMaxMinReport";
var commandInvocation = new CloudToDeviceMethod(commandToInvoke) { ResponseTimeout = TimeSpan.FromSeconds(30) };

// Set command payload
DateTimeOffset since = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(2));
string componentCommandPayload = JsonConvert.SerializeObject(since);
commandInvocation.SetPayloadJson(componentCommandPayload);

try
{
    CloudToDeviceMethodResult result = await serviceClient.InvokeDeviceMethodAsync(deviceTwinId, commandInvocation);
    Console.WriteLine($"Command getMaxMinReport was invoked on component thermostat1." +
        $"\nDevice returned status: {result.Status}. \nReport: {result.GetPayloadAsJson()}");
}
catch (DeviceNotFoundException)
{
    Console.WriteLine("Unable to execute command getMaxMinReport on component thermostat1.");
}

IoT Hub ikizi örnekleri

DigitalTwinClient sınıfını kullanarak dijital ikizleri kullanarak cihaz durumuyla etkileşim kurabilirsiniz. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar.

Bu bölümde, Digital Twins API'sini kullanan C# örnekleri verilmiştir. Aşağıdaki kod parçacıkları termostat ve sıcaklık denetleyicisi cihazlarının dijital ikizlerini temsil etmek için aşağıdaki sınıfları kullanır:

using Microsoft.Azure.Devices.Serialization;
using Newtonsoft.Json;
using System;

namespace Microsoft.Azure.Devices.Samples
{
  internal class ThermostatTwin : BasicDigitalTwin
  {
    [JsonProperty("$metadata")]
    public new ThermostatMetadata Metadata { get; set; }

    [JsonProperty("maxTempSinceLastReboot")]
    public double? MaxTempSinceLastReboot { get; set; }

    [JsonProperty("targetTemperature")]
    public double? TargetTemperature { get; set; }
  }

  internal class ThermostatMetadata : DigitalTwinMetadata
  {
    [JsonProperty("maxTempSinceLastReboot")]
    public ReportedPropertyMetadata MaxTempSinceLastReboot { get; set; }

    [JsonProperty("targetTemperature")]
    public WritableProperty TargetTemperature { get; set; }
  }

  internal class ReportedPropertyMetadata
  {
    [JsonProperty("lastUpdateTime")]
    public DateTimeOffset LastUpdateTime { get; set; }
  }

  internal class TemperatureControllerTwin : BasicDigitalTwin
  {
    [JsonProperty("$metadata")]
    public new TemperatureControllerMetadata Metadata { get; set; }

    [JsonProperty("serialNumber")]
    public string SerialNumber { get; set; }

    [JsonProperty("thermostat1")]
    public ThermostatTwin Thermostat1 { get; set; }

    [JsonProperty("thermostat2")]
    public ThermostatTwin Thermostat2 { get; set; }
  }

  internal class TemperatureControllerMetadata : DigitalTwinMetadata
  {
    [JsonProperty("serialNumber")]
    public ReportedPropertyMetadata SerialNumber { get; set; }

    [JsonProperty("thermostat1")]
    public WritableProperty Thermostat1 { get; set; }

    [JsonProperty("thermostat2")]
    public WritableProperty Thermostat2 { get; set; }
  }
}

değişkeni, digitalTwinId IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Dijital ikiz ve model kimliğini al

IoT hub'ınıza bağlanan IoT Tak Çalıştır cihazın dijital ikizini ve model kimliğini almak için:

DigitalTwinClient digitalTwinClient = DigitalTwinClient.CreateFromConnectionString(parameters.HubConnectionString);
HttpOperationResponse<ThermostatTwin, DigitalTwinGetHeaders> getDigitalTwinResponse = await digitalTwinClient
    .GetDigitalTwinAsync<ThermostatTwin>(digitalTwinId);
ThermostatTwin thermostatTwin = getDigitalTwinResponse.Body;
Console.WriteLine($"Model ID: {thermostatTwin.Metadata.ModelId}.");
Console.WriteLine($"Digital Twin: \n{JsonConvert.SerializeObject(thermostatTwin, Formatting.Indented)}");

Dijital ikizi güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. özelliği, cihazın varsayılan bileşeninde tanımlanır:

var updateOperation = new UpdateOperationsUtility();

int desiredTargetTemperature = 60;

// Get the current value of the targetTemperature property
HttpOperationResponse<ThermostatTwin, DigitalTwinGetHeaders> getDigitalTwinResponse = await digitalTwinClient
    .GetDigitalTwinAsync<ThermostatTwin>(digitalTwinId);
double? currentTargetTemperature = getDigitalTwinResponse.Body.TargetTemperature;

// Has the targetTemperature property previously been set?
if (currentTargetTemperature != null)
{
  // Update the existing property
  // Prepend the property path with a '/'
  updateOperation.AppendReplacePropertyOp($"/targetTemperature",   desiredTargetTemperature);
}
else
{
  // Add a new property
  // Prepend the property path with a '/'
  updateOperation.AppendAddPropertyOp($"/targetTemperature", desiredTargetTemperature);
}

// Update the targetTemperature property on the digital twin
HttpOperationHeaderResponse<DigitalTwinUpdateHeaders> updateDigitalTwinResponse = await digitalTwinClient
    .UpdateDigitalTwinAsync(digitalTwinId, updateOperation.Serialize());

Console.WriteLine($"Update {digitalTwinId} digital twin response: {updateDigitalTwinResponse.Response.StatusCode}.");

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. özelliği Thermostat1 bileşeninde tanımlanır:

int desiredTargetTemperature = 60;

var updateOperation = new UpdateOperationsUtility();

// Look at when the property was updated and what was it set to.
HttpOperationResponse<TemperatureControllerTwin, DigitalTwinGetHeaders> getDigitalTwinResponse = await digitalTwinClient
  .GetDigitalTwinAsync<TemperatureControllerTwin>(digitalTwinId);

ThermostatTwin thermostat1 = getDigitalTwinResponse.Body.Thermostat1;

if (thermostat1 != null)
{
  // Thermostat1 is present in the TemperatureController twin. You can add/replace the component-level property "targetTemperature"
  double? currentComponentTargetTemperature = getDigitalTwinResponse.Body.Thermostat1.TargetTemperature;
  if (currentComponentTargetTemperature != null)
  {
      DateTimeOffset targetTemperatureDesiredLastUpdateTime = getDigitalTwinResponse.Body.Thermostat1.Metadata.TargetTemperature.LastUpdateTime;

      // The property path to be replaced should be prepended with a '/'
      updateOperation.AppendReplacePropertyOp("/thermostat1/targetTemperature", desiredTargetTemperature);
  }
  else
  {
      // The property path to be added should be prepended with a '/'
      updateOperation.AppendAddPropertyOp("/thermostat1/targetTemperature", desiredTargetTemperature);
  }
}
else
{
    // Thermostat1 is not present in the TemperatureController twin. Add the component.
    var componentProperty = new Dictionary<string, object> { { "targetTemperature", desiredTargetTemperature }, { "$metadata", new object() } };

    // The property path to be replaced should be prepended with a '/'
    updateOperation.AppendAddComponentOp("/thermostat1", componentProperty);
}

HttpOperationHeaderResponse<DigitalTwinUpdateHeaders> updateDigitalTwinResponse = await digitalTwinClient
    .UpdateDigitalTwinAsync(digitalTwinId, updateOperation.Serialize());

Console.WriteLine($"Update {digitalTwinId} digital twin response: {updateDigitalTwinResponse.Response.StatusCode}.");

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

DateTimeOffset since = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(2));

try
{
  HttpOperationResponse<DigitalTwinCommandResponse, DigitalTwinInvokeCommandHeaders> invokeCommandResponse = await digitalTwinClient
    .InvokeCommandAsync(digitalTwinId, "getMaxMinReport", JsonConvert.SerializeObject(since));

  Console.WriteLine($"Command getMaxMinReport was invoked. \nDevice returned status: {invokeCommandResponse.Body.Status}." +
    $"\nReport: {invokeCommandResponse.Body.Payload}");
}
catch (HttpOperationException e)
{
  if (e.Response.StatusCode == HttpStatusCode.NotFound)
  {
    Console.WriteLine($"Unable to execute command getMaxMinReport on {digitalTwinId}.");
  }
}

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. Komutu Thermostat1 bileşeninde tanımlanır:

DateTimeOffset since = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(2));

try
{
    HttpOperationResponse<DigitalTwinCommandResponse, DigitalTwinInvokeCommandHeaders> invokeCommandResponse = await digitalTwinClient
        .InvokeComponentCommandAsync(digitalTwinId, "thermostat1", "getMaxMinReport", JsonConvert.SerializeObject(since));

    Console.WriteLine("Command getMaxMinReport was invoked on component thermostat1." +
        $"\nDevice returned status: {invokeCommandResponse.Body.Status}. \nReport: {invokeCommandResponse.Body.Payload}");
}
catch (HttpOperationException e)
{
    if (e.Response.StatusCode == HttpStatusCode.NotFound)
    {
        Console.WriteLine("Unable to execute command getMaxMinReport on component thermostat1.");
    }
}

Cihaz telemetrisini okuma

IoT Tak Çalıştır, DTDL modelinde tanımlanan telemetri verileri veri IoT Hub. Varsayılan olarak IoT Hub telemetri, telemetriyi Event Hubs uç noktasına yönlendirir. Daha fazla bilgi edinmek için bkz. IoT Hub uç noktalara cihazdan buluta ileti göndermek için ileti yönlendirmeyi kullanma.

Aşağıdaki kod parçacığında, varsayılan uç noktadan telemetri Event Hubs gösterir. Bu kod parçacığındaki kod, IoT Hub bir cihazdan IoT hub'a telemetrigönderme hızlı başlangıçtan alınarak arka uç uygulamasıyla okunur:

await using EventHubConsumerClient consumer = new EventHubConsumerClient(EventHubConsumerClient.DefaultConsumerGroupName, connectionString, EventHubName);

Console.WriteLine("Listening for messages on all partitions");

try
{
    await foreach (PartitionEvent partitionEvent in consumer.ReadEventsAsync(cancellationToken))
    {
        Console.WriteLine("Message received on partition {0}:", partitionEvent.Partition.PartitionId);

        string data = Encoding.UTF8.GetString(partitionEvent.Data.Body.ToArray());
        Console.WriteLine("\t{0}:", data);

        Console.WriteLine("Application properties (set by device):");
        foreach (var prop in partitionEvent.Data.Properties)
        {
            Console.WriteLine("\t{0}: {1}", prop.Key, prop.Value);
        }

        Console.WriteLine("System properties (set by IoT Hub):");
        foreach (var prop in partitionEvent.Data.SystemProperties)
        {
            Console.WriteLine("\t{0}: {1}", prop.Key, prop.Value);
        }
    }
}
catch (TaskCanceledException)
{
    // This is expected when the token is signaled; it should not be considered an
    // error in this scenario.
}

Önceki kodun aşağıdaki çıktısı, yalnızca varsayılan bileşene sahip olan bileşen olmayan Thermostat IoT Tak Çalıştır cihaz tarafından gönderilen sıcaklık telemetrisini gösterir. Sistem dt-dataschema özelliği model kimliğini gösterir:

Message received on partition 1:
        { "temperature": 25.5 }:
Application properties (set by device):
System properties (set by IoT Hub):
        iothub-connection-device-id: my-pnp-device
        iothub-connection-auth-method: {"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}
        iothub-connection-auth-generation-id: 637375045610235418
        iothub-enqueuedtime: 05/10/2020 14:30:58
        iothub-message-source: Telemetry
        dt-dataschema: dtmi:com:example:Thermostat;1
        content-type: application/json
        content-encoding: utf-8

Önceki kodun aşağıdaki çıktısı, çok bileşenli TemperatureController tarafından gönderilen sıcaklık telemetrisini IoT Tak Çalıştır gösterir. Sistem dt-subject özelliği, telemetri gönderilen bileşenin adını gösterir. Bu örnekte iki bileşen thermostat1 thermostat2 DTDL modelinde tanımlanan ve bileşenleridir. Sistem dt-dataschema özelliği model kimliğini gösterir:

Message received on partition 1:
        {"temperature":11.1}:
Application properties (set by device):
System properties (set by IoT Hub):
        dt-subject: thermostat1
        iothub-connection-device-id: my-pnp-device
        iothub-connection-auth-method: {"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}
        iothub-connection-auth-generation-id: 637375045610235418
        iothub-enqueuedtime: 05/10/2020 14:23:36
        iothub-message-source: Telemetry
        dt-dataschema: dtmi:com:example:TemperatureController;1
        content-type: application/json
        content-encoding: utf-8
Message received on partition 1:
        {"temperature":41.2}:
Application properties (set by device):
System properties (set by IoT Hub):
        dt-subject: thermostat2
        iothub-connection-device-id: my-pnp-device
        iothub-connection-auth-method: {"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}
        iothub-connection-auth-generation-id: 637375045610235418
        iothub-enqueuedtime: 05/10/2020 14:23:36
        iothub-message-source: Telemetry
        dt-dataschema: dtmi:com:example:TemperatureController;1
        content-type: application/json
        content-encoding: utf-8

Cihaz ikizi değişiklik bildirimlerini okuma

Desteklenen uç IoT Hub cihaz ikizi değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırabilirsiniz. Daha fazla bilgi için bkz. IoT Hub olmayan olaylar için farklı uç noktalara cihazdan buluta ileti göndermek için > yönlendirmeyi kullanma.

Önceki C# kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve değişiklik bildirimi türü hakkında bilgi opType sağlar:

Message received on partition 1:
        {"version":3,"properties":{"reported":{"maxTempSinceLastReboot":9.6,"$metadata":{"$lastUpdated":"2020-10-06T10:17:41.7408552Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-06T10:17:41.7408552Z"}},"$version":2}}}:
Application properties (set by device):
        hubName: my-pnp-hub
        deviceId: my-pnp-device
        operationTimestamp: 2020-10-06T10:17:41.7408552+00:00
        iothub-message-schema: twinChangeNotification
        opType: updateTwin
System properties (set by IoT Hub):
        iothub-connection-device-id: my-pnp-device
        iothub-enqueuedtime: 06/10/2020 10:17:41
        iothub-message-source: twinChangeEvents
        user-id: System.ArraySegment`1[System.Byte]
        correlation-id: 61394e8ba7d
        content-type: application/json
        content-encoding: utf-8

Önceki C# kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve değişiklik bildirimi türü hakkında bilgi opType sağlar:

Message received on partition 1:
        {"version":5,"properties":{"reported":{"thermostat1":{"__t":"c","maxTempSinceLastReboot":9.6},"$metadata":{"$lastUpdated":"2020-10-06T10:27:59.515972Z","thermostat1":{"$lastUpdated":"2020-10-06T10:27:59.515972Z","__t":{"$lastUpdated":"2020-10-06T10:27:59.515972Z"},"maxTempSinceLastReboot":{"$lastUpdated":"2020-10-06T10:27:59.515972Z"}}},"$version":4}}}:
Application properties (set by device):
        hubName: my-pnp-hub
        deviceId: my-pnp-device
        operationTimestamp: 2020-10-06T10:27:59.5159720+00:00
        iothub-message-schema: twinChangeNotification
        opType: updateTwin
System properties (set by IoT Hub):
        iothub-connection-device-id: my-pnp-device
        iothub-enqueuedtime: 06/10/2020 10:27:59
        iothub-message-source: twinChangeEvents
        user-id: System.ArraySegment`1[System.Byte]
        correlation-id: 615051f364e
        content-type: application/json
        content-encoding: utf-8

Dijital ikiz değişiklik bildirimlerini okuma

Desteklenen bir IoT Hub yönlendiren dijital ikiz değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırebilirsiniz. Daha fazla bilgi için bkz. IoT Hub olmayan olaylar için farklı uç noktalara cihazdan buluta ileti göndermek için > yönlendirmeyi kullanma.

Önceki C# kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve değişiklik bildirimi türü hakkında bilgi opType sağlar:

Message received on partition 1:
        [{"op":"add","path":"/$metadata/maxTempSinceLastReboot","value":{"lastUpdateTime":"2020-10-06T10:39:16.0209836Z"}},{"op":"add","path":"/maxTempSinceLastReboot","value":34.9}]:
Application properties (set by device):
        hubName: my-pnp-hub
        deviceId: my-pnp-device
        operationTimestamp: 2020-10-06T10:39:16.0209836+00:00
        iothub-message-schema: digitalTwinChangeNotification
        opType: updateTwin
System properties (set by IoT Hub):
        iothub-connection-device-id: my-pnp-device
        iothub-enqueuedtime: 06/10/2020 10:39:16
        iothub-message-source: digitalTwinChangeEvents
        user-id: System.ArraySegment`1[System.Byte]
        correlation-id: 6169857bf8c
        content-type: application/json-patch+json
        content-encoding: utf-8

Önceki C# kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve değişiklik bildirimi türü hakkında bilgi opType sağlar:

Message received on partition 1:
        [{"op":"add","path":"/thermostat1","value":{"$metadata":{"maxTempSinceLastReboot":{"lastUpdateTime":"2020-10-06T10:41:44.8312666Z"}},"maxTempSinceLastReboot":29.1}}]:
Application properties (set by device):
        hubName: my-pnp-hub
        deviceId: my-pnp-device
        operationTimestamp: 2020-10-06T10:41:44.8312666+00:00
        iothub-message-schema: digitalTwinChangeNotification
        opType: updateTwin
System properties (set by IoT Hub):
        iothub-connection-device-id: my-pnp-device
        iothub-enqueuedtime: 06/10/2020 10:41:44
        iothub-message-source: digitalTwinChangeEvents
        user-id: System.ArraySegment`1[System.Byte]
        correlation-id: 616f108f0e3
        content-type: application/json-patch+json
        content-encoding: utf-8

Aşağıdaki kaynaklar da kullanılabilir:

IoT Hub hizmeti istemci örnekleri

Bu bölümde, IoT Hub hizmeti istemcisi ve com.microsoft.azure.sdk.iot.service.devicetwin ad alanının DeviceTwin ve DeviceMethod sınıflarını kullanan Java örnekleri verilmiştir. Cihaz ikizlerini kullanarak cihaz durumuyla etkileşim kurmak için DeviceTwin sınıfını kullanırsanız. Cihaz kayıtlarınızı sorgularken DeviceTwin sınıfını da IoT Hub. Cihaz komutlarını çağıran DeviceMethod sınıfını kullanırsınız. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar. Kod parçacıklarında değişkeni, deviceId IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Cihaz ikizi ve model kimliğini al

IoT hub'ınıza bağlanan IoT Tak Çalıştır cihaz ikizi ve model kimliğini almak için:

DeviceTwin twinClient = DeviceTwin.createFromConnectionString(iotHubConnectionString);

// ...

DeviceTwinDevice twin = new DeviceTwinDevice(deviceId);
twinClient.getTwin(twin);
System.out.println("Model Id of this Twin is: " + twin.getModelId());

Cihaz ikizlerini güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. İkizi güncelleştirmeden önce alasiniz. özelliği, cihazın varsayılan bileşeninde tanımlanır:

DeviceTwin twinClient = DeviceTwin.createFromConnectionString(iotHubConnectionString);
DeviceTwinDevice twin = new DeviceTwinDevice(deviceId);
twinClient.getTwin(twin);

double propertyValue = 60.2;
twin.setDesiredProperties(Collections.singleton(new Pair("targetTemperature", propertyValue)));
twinClient.updateTwin(twin);

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. İkizi güncelleştirmeden önce alasiniz. özelliği termostat1 bileşeninde tanımlanır:

public static Set<Pair> CreateComponentPropertyPatch(@NonNull String propertyName, @NonNull double propertyValue, @NonNull String componentName)
{
    JsonObject patchJson = new JsonObject();
    patchJson.addProperty("__t", "c");
    patchJson.addProperty(propertyName, propertyValue);
    return singleton(new Pair(componentName, patchJson));
}

// ...

DeviceTwin twinClient = DeviceTwin.createFromConnectionString(iotHubConnectionString);
DeviceTwinDevice twin = new DeviceTwinDevice(deviceId);
twinClient.getTwin(twin);

double propertyValue = 60.2;
twin.setDesiredProperties(CreateComponentPropertyPatch("targetTemperature", propertyValue, "thermostat1"));
twinClient.updateTwin(twin);

Bir bileşende özellik için, özellik düzeltme eki aşağıdaki örnekteki gibi olur:

{
  "thermostat1":
  {
    "__t": "c",
    "targetTemperature": 60.2
  }
}

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

DeviceMethod methodClient = DeviceMethod.createFromConnectionString(iotHubConnectionString);

Long responseTimeout = TimeUnit.SECONDS.toSeconds(200);
Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);

String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);
MethodResult result = methodClient.invoke(deviceId, "getMaxMinReport", responseTimeout, connectTimeout, commandInput);

System.out.println("Method result status is: " + result.getStatus());

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. komutu termostat1 bileşeninde tanımlanır:

DeviceMethod methodClient = DeviceMethod.createFromConnectionString(iotHubConnectionString);

Long responseTimeout = TimeUnit.SECONDS.toSeconds(200);
Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);

String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);
MethodResult result = methodClient.invoke(deviceId, "thermostat1*getMaxMinReport", responseTimeout, connectTimeout, commandInput);

System.out.println("Method result status is: " + result.getStatus());

IoT Hub ikizi örnekleri

Digital Twins kullanarak cihaz durumuyla etkileşim kurmak için com.microsoft.azure.sdk.iot.service.digitaltwin ad alanı içinde DigitalTwinAsyncClient sınıfını kullanırsınız. Aşağıdaki örneklerde aynı ad alanının UpdateOperationUtility ve BasicDigitalTwin sınıfları da kullanılır. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar.

değişkeni, digitalTwinid IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Dijital ikiz ve model kimliğini al

IoT hub'ınıza bağlı IoT Tak Çalıştır cihazın dijital ikizini ve model kimliğini almak için:

DigitalTwinAsyncClient asyncClient = DigitalTwinAsyncClient.createFromConnectionString(iotHubConnectionString);

CountDownLatch latch = new CountDownLatch(1);
asyncClient.getDigitalTwin(digitalTwinid, BasicDigitalTwin.class)
    .subscribe(
        getResponse ->
        {
            System.out.println("Digital Twin Model Id: " + getResponse.getMetadata().getModelId());
            System.out.println("Digital Twin: " + prettyBasicDigitalTwin(getResponse));
            latch.countDown();
        },
        error ->
        {
            System.out.println("Get Digital Twin failed: " + error);
            latch.countDown();
        });

latch.await(10, TimeUnit.SECONDS);

// ...

private static String prettyBasicDigitalTwin(BasicDigitalTwin basicDigitalTwin)
{
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    return gson.toJson(basicDigitalTwin);
}

Dijital ikizi güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. özelliği, cihazın varsayılan bileşeninde tanımlanır:

DigitalTwinAsyncClient asyncClient = DigitalTwinAsyncClient.createFromConnectionString(iotHubConnectionString);

CountDownLatch latch1 = new CountDownLatch(1);

UpdateOperationUtility updateOperationUtility = new UpdateOperationUtility();

// Add a new property.
updateOperationUtility.appendAddPropertyOperation("/" + "targetTemperature", 35);
asyncClient.updateDigitalTwin(digitalTwinid, updateOperationUtility.getUpdateOperations())
    .subscribe(
        getResponse ->
        {
            System.out.println("Updated Digital Twin");
            latch1.countDown();
        },
        error ->
        {
            System.out.println("Update Digital Twin failed: " + error);
            latch1.countDown();
        });
latch1.await(10, TimeUnit.SECONDS);
GetDigitalTwin();

// Replace an existing property.
CountDownLatch latch2 = new CountDownLatch(1);
updateOperationUtility.appendReplacePropertyOperation("/targetTemperature", 50);
asyncClient.updateDigitalTwin(digitalTwinid, updateOperationUtility.getUpdateOperations())
    .subscribe(
        getResponse ->
        {
            System.out.println("Updated Digital Twin");
            latch2.countDown();
        },
        error ->
        {
            System.out.println("Update Digital Twin failed: " + error);
            latch2.countDown();
        });

latch2.await(10, TimeUnit.SECONDS);
GetDigitalTwin();

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. özelliği termostat1 bileşeninde tanımlanır:

DigitalTwinClient client = DigitalTwinClient.createFromConnectionString(iotHubConnectionString);

// Get digital twin.
ServiceResponseWithHeaders<String, DigitalTwinGetHeaders> getResponse = client.getDigitalTwinWithResponse(digitalTwinid, String.class);

// Construct the options for conditional update.
DigitalTwinUpdateRequestOptions options = new DigitalTwinUpdateRequestOptions();
options.setIfMatch(getResponse.headers().eTag());

UpdateOperationUtility updateOperationUtility = new UpdateOperationUtility();

Map<String, Object> t1properties = new HashMap<>();
t1properties.put("targetTemperature", 50);
updateOperationUtility.appendReplaceComponentOperation("/thermostat1", t1properties);

digitalTwinUpdateOperations = updateOperationUtility.getUpdateOperations();
updateResponse = client.updateDigitalTwinWithResponse(digitalTwinid, digitalTwinUpdateOperations, options);
System.out.println("Update Digital Twin response status: " + updateResponse.response().message());

getResponse = client.getDigitalTwinWithResponse(digitalTwinid, String.class);

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

CountDownLatch latch = new CountDownLatch(1);

String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);

// Invoke a method on root level.
asyncClient.invokeCommand(digitalTwinid, "getMaxMinReport", commandInput)
    .subscribe(
        response ->
        {
            System.out.println("Invoked Command getMaxMinReport response: " + prettyString(response.getPayload()));
            latch.countDown();
        },
        error ->
        {
            RestException ex = (RestException)error;
            if(ex.response().code() == 404) {
                System.out.println("Invoked Command getMaxMinReport failed: " + error);
            }
            else {
                System.out.println("Ensure the device sample is running for this sample to succeed");
            }
            latch.countDown();
        });

latch.await(10, TimeUnit.SECONDS);

// ...

private static String prettyString(String str)
{
    Gson gson = new Gson();
    Gson gsonBuilder = new GsonBuilder().setPrettyPrinting().create();
    return gsonBuilder.toJson(gson.fromJson(str, Object.class));
}

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. komutu termostat1 bileşeninde tanımlanır:

DigitalTwinClient client = DigitalTwinClient.createFromConnectionString(iotHubConnectionString);

String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);

DigitalTwinInvokeCommandRequestOptions options = new DigitalTwinInvokeCommandRequestOptions();
try {
    ServiceResponseWithHeaders<DigitalTwinCommandResponse, DigitalTwinInvokeCommandHeaders> commandResponse = client.invokeComponentCommandWithResponse(digitalTwinid, "thermostat1", "getMaxMinReport", commandInput, options);
    System.out.println("Command getMaxMinReport, payload: " + prettyString(commandResponse.body().getPayload()));
    System.out.println("Command getMaxMinReport, status: " + commandResponse.body().getStatus());
} catch (RestException ex)
{
    if(ex.response().code() == 404)
    {
        System.out.println("Ensure the device sample is running for this sample to succeed.");
    }
    else
    {
        throw ex;
    }
}

// ...

private static String prettyString(String str)
{
    Gson gson = new Gson();
    Gson gsonBuilder = new GsonBuilder().setPrettyPrinting().create();
    return gsonBuilder.toJson(gson.fromJson(str, Object.class));
}

Cihaz telemetrisini okuma

IoT Tak Çalıştır cihazlar DTDL modelinde tanımlanan telemetri verileri veri IoT Hub. Varsayılan olarak IoT Hub telemetri, telemetriyi Event Hubs uç noktasına yönlendirir. Daha fazla bilgi edinmek için bkz. IoT Hub uç noktalara cihazdan buluta ileti göndermek için ileti yönlendirmeyi kullanma.

Aşağıdaki kod parçacığında, varsayılan uç noktadan telemetri Event Hubs gösterir. Bu kod parçacığındaki kod, IoT Hub cihazdan IoT hub'a telemetrigönderme hızlı başlangıçtan alınarak arka uç uygulamasıyla okunur:

import com.azure.messaging.eventhubs.EventHubClientBuilder;
import com.azure.messaging.eventhubs.EventHubConsumerAsyncClient;

// ...

EventHubClientBuilder eventHubClientBuilder = new EventHubClientBuilder()
    .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
    .connectionString(eventHubCompatibleConnectionString);

try (EventHubConsumerAsyncClient eventHubConsumerAsyncClient = eventHubClientBuilder.buildAsyncConsumerClient()) {

    receiveFromAllPartitions(eventHubConsumerAsyncClient);

}

// ...

private static void receiveFromAllPartitions(EventHubConsumerAsyncClient eventHubConsumerAsyncClient) {

eventHubConsumerAsyncClient
    .receive(false) // set this to false to read only the newly available events
    .subscribe(partitionEvent -> {
        System.out.println();
        System.out.printf("%nTelemetry received from partition %s:%n%s",
            partitionEvent.getPartitionContext().getPartitionId(), partitionEvent.getData().getBodyAsString());
        System.out.printf("%nApplication properties (set by device):%n%s", partitionEvent.getData().getProperties());
        System.out.printf("%nSystem properties (set by IoT Hub):%n%s",
            partitionEvent.getData().getSystemProperties());
    }, ex -> {
        System.out.println("Error receiving events " + ex);
    }, () -> {
        System.out.println("Completed receiving events");
    });
}

Önceki kodun aşağıdaki çıktısı, yalnızca varsayılan bileşene sahip olan bileşen olmayan Thermostat IoT Tak Çalıştır cihaz tarafından gönderilen sıcaklık telemetrisini gösterir. Sistem dt-dataschema özelliği model kimliğini gösterir:

Telemetry received from partition 1:
{"temperature": 10.700000}
Application properties (set by device):
{$.cdid=my-pnp-device}
System properties (set by IoT Hub):
{correlation-id=dd960185-6ddb-4b5f-89bb-e26b0b3c201e, content-encoding=UTF-8, iothub-connection-auth-method={"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}, iothub-enqueuedtime=Tue Oct 20 12:28:10 BST 2020, dt-dataschema=dtmi:com:example:Thermostat;1, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, iothub-connection-auth-generation-id=637375776990653481, group-sequence=0, iothub-message-source=Telemetry, creation-time=0, message-id=1c05cece-070b-4e2e-b2e8-e263858594a3, content-type=application/json}

Telemetry received from partition 1:
{"temperature": 10.700000}
Application properties (set by device):
{$.cdid=my-pnp-device}
System properties (set by IoT Hub):
{correlation-id=d10a7350-43ef-4cf6-9db5-a4b08684cd9d, content-encoding=UTF-8, iothub-connection-auth-method={"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}, iothub-enqueuedtime=Tue Oct 20 12:28:15 BST 2020, dt-dataschema=dtmi:com:example:Thermostat;1, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, iothub-connection-auth-generation-id=637375776990653481, group-sequence=0, iothub-message-source=Telemetry, creation-time=0, message-id=d3a80af4-1246-41a0-a09a-582a12c17a00, content-type=application/json}

Önceki kodun aşağıdaki çıktısı, çok bileşenli TemperatureController tarafından cihaza gönderilen sıcaklık telemetrisini IoT Tak Çalıştır gösterir. Sistem dt-subject özelliği, telemetri gönderilen bileşenin adını gösterir. Bu örnekte iki bileşen thermostat1 thermostat2 DTDL modelinde tanımlanan ve bileşenleridir. Sistem dt-dataschema özelliği model kimliğini gösterir:

Telemetry received from partition 1:
null
Application properties (set by device):
{$.cdid=my-pnp-device}
System properties (set by IoT Hub):
{correlation-id=413002d0-2107-4c08-8f4a-995ae1f4047b, content-encoding=UTF-8, iothub-connection-auth-method={"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}, iothub-enqueuedtime=Tue Oct 20 12:31:14 BST 2020, dt-dataschema=dtmi:com:example:TemperatureController;1, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, iothub-connection-auth-generation-id=637387902591517456, group-sequence=0, iothub-message-source=Telemetry, creation-time=0, message-id=da8bd068-850e-43fb-862f-66080d5969e4, content-type=application/json, dt-subject=thermostat1}

Telemetry received from partition 1:
null
Application properties (set by device):
{$.cdid=my-pnp-device}
System properties (set by IoT Hub):
{correlation-id=2d9407e5-413f-4f8d-bd30-cd153e03c72f, content-encoding=UTF-8, iothub-connection-auth-method={"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}, iothub-enqueuedtime=Tue Oct 20 12:31:14 BST 2020, dt-dataschema=dtmi:com:example:TemperatureController;1, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, iothub-connection-auth-generation-id=637387902591517456, group-sequence=0, iothub-message-source=Telemetry, creation-time=0, message-id=ed419c4e-ef2c-4acf-8991-6245059c5fdc, content-type=application/json, dt-subject=thermostat2}

Cihaz ikizi değişiklik bildirimlerini okuma

Desteklenen bir uç IoT Hub cihaz ikizi değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırabilirsiniz. Daha fazla bilgi için bkz. IoT Hub telemetri dışı olaylar için farklı uç noktalara cihazdan buluta ileti > yönlendirmeyi kullanma.

Önceki Java kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received from partition 1:
{"version":11,"properties":{"reported":{"maxTempSinceLastReboot":43.4,"$metadata":{"$lastUpdated":"2020-10-20T11:50:41.123127Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-20T11:50:41.123127Z"}},"$version":10}}}
Application properties (set by device):
{operationTimestamp=2020-10-20T11:50:41.1231270+00:00, opType=updateTwin, hubName=my-pnp-hub, deviceId=my-pnp-device, iothub-message-schema=twinChangeNotification}
System properties (set by IoT Hub):
{user-id=[B@12fd5bb4, correlation-id=11339418426a, content-encoding=utf-8, iothub-enqueuedtime=Tue Oct 20 12:50:41 BST 2020, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, group-sequence=0, iothub-message-source=twinChangeEvents, creation-time=0, content-type=application/json}

Önceki Java kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received from partition 1:
{"version":9,"properties":{"reported":{"thermostat1":{"__t":"c","maxTempSinceLastReboot":32.5},"$metadata":{"$lastUpdated":"2020-10-20T11:48:01.2960851Z","thermostat1":{"$lastUpdated":"2020-10-20T11:48:01.2960851Z","__t":{"$lastUpdated":"2020-10-20T11:48:01.2960851Z"},"maxTempSinceLastReboot":{"$lastUpdated":"2020-10-20T11:48:01.2960851Z"}}},"$version":8}}}
Application properties (set by device):
{operationTimestamp=2020-10-20T11:48:01.2960851+00:00, opType=updateTwin, hubName=my-pnp-hub, deviceId=my-pnp-device, iothub-message-schema=twinChangeNotification}
System properties (set by IoT Hub):
{user-id=[B@23949bae, correlation-id=113334d542e1, content-encoding=utf-8, iothub-enqueuedtime=Tue Oct 20 12:48:01 BST 2020, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, group-sequence=0, iothub-message-source=twinChangeEvents, creation-time=0, content-type=application/json}

Dijital ikiz değişiklik bildirimlerini okuma

Desteklenen bir IoT Hub yönlendiren dijital ikiz değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırebilirsiniz. Daha fazla bilgi için bkz. IoT Hub telemetri dışı olaylar için farklı uç noktalara cihazdan buluta ileti > yönlendirmeyi kullanma.

Önceki Java kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received from partition 1:
[{"op":"replace","path":"/$metadata/maxTempSinceLastReboot/lastUpdateTime","value":"2020-10-20T11:52:40.627628Z"},{"op":"replace","path":"/maxTempSinceLastReboot","value":16.9}]
Application properties (set by device):
{operationTimestamp=2020-10-20T11:52:40.6276280+00:00, opType=updateTwin, hubName=my-pnp-hub, deviceId=my-pnp-device, iothub-message-schema=digitalTwinChangeNotification}
System properties (set by IoT Hub):
{user-id=[B@4475ce2a, correlation-id=1133db52c0e0, content-encoding=utf-8, iothub-enqueuedtime=Tue Oct 20 12:52:40 BST 2020, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, group-sequence=0, iothub-message-source=digitalTwinChangeEvents, creation-time=0, content-type=application/json-patch+json}

Önceki Java kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received from partition 1:
[{"op":"add","path":"/thermostat1","value":{"$metadata":{"maxTempSinceLastReboot":{"lastUpdateTime":"2020-10-20T11:31:04.7811405Z"}},"maxTempSinceLastReboot":27.2}}]
Application properties (set by device):
{operationTimestamp=2020-10-20T11:31:04.7811405+00:00, opType=updateTwin, hubName=my-pnp-hub, deviceId=my-pnp-device, iothub-message-schema=digitalTwinChangeNotification}
System properties (set by IoT Hub):
{user-id=[B@75981aa, correlation-id=1130d6f4d212, content-encoding=utf-8, iothub-enqueuedtime=Tue Oct 20 12:31:04 BST 2020, absolute-expiry-time=0, iothub-connection-device-id=my-pnp-device, group-sequence=0, iothub-message-source=digitalTwinChangeEvents, creation-time=0, content-type=application/json-patch+json}

Aşağıdaki kaynaklar da kullanılabilir:

IoT Hub hizmeti istemci örnekleri

Bu bölümde, IoT Hub hizmeti istemcisini ve Registry ve Client sınıflarını kullanan JavaScript örnekleri yer almaktadır. Cihaz ikizlerini kullanarak cihaz durumuyla etkileşim kurmak için Registry sınıfını kullanırsanız. Kayıt Defteri sınıfını, kayıt defterinizin cihaz kayıtlarını sorgulamak için de IoT Hub. Cihaz komutlarını çağıran İstemci sınıfını kullanırsınız. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar. Kod parçacıklarında değişkeni, deviceId IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Cihaz ikizi ve model kimliğini al

IoT hub'ınıza bağlanan IoT Tak Çalıştır ikizi ve model kimliğini almak için:

var Registry = require('azure-iothub').Registry;

// ...

var registry = Registry.fromConnectionString(connectionString);
registry.getTwin(deviceId, function(err, twin) {
  if (err) {
    console.error(err.message);
  } else {
    console.log('Model Id: ' + twin.modelId);
    console.log(JSON.stringify(twin, null, 2));
  }
}

Cihaz ikizlerini güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. Örnek, ikizi güncelleştirmeden önce nasıl ala ihtiyacınız olduğunu gösterir. özelliği, cihazın varsayılan bileşeninde tanımlanır:

var Registry = require('azure-iothub').Registry;
var registry = Registry.fromConnectionString(connectionString);

registry.getTwin(deviceId, function(err, twin) {
  if (err) {
    console.error(err.message);
  } else {
    var twinPatch = {
      properties: {
        desired: {
          targetTemperature: 42
        }
      }
    };
    twin.update(twinPatch, function(err, twin) {
      if (err) {
        console.error(err.message);
      } else {
        console.log(JSON.stringify(twin, null, 2));
      }
    }
  }
}

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. Örnek, ikizi güncelleştirmeden önce nasıl ala ihtiyacınız olduğunu gösterir. özelliği termostat1 bileşeninde tanımlanır:

var Registry = require('azure-iothub').Registry;
var registry = Registry.fromConnectionString(connectionString);

registry.getTwin(deviceId, function(err, twin) {
  if (err) {
    console.error(err.message);
  } else {
    var twinPatch = {
      properties: {
        desired: {
          thermostat1:
          {
            __t: "c",
            targetTemperature: 45
          }
        }
      }
    };
    twin.update(twinPatch, function(err, twin) {
      if (err) {
        console.error(err.message);
      } else {
        console.log(JSON.stringify(twin, null, 2));
      }
    }
  }
}

Bir bileşende özellik için, özellik düzeltme eki aşağıdaki örnekteki gibi olur:

{
  "thermostat1":
  {
    "__t": "c",
    "targetTemperature": 20
  }
}

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

var Client = require('azure-iothub').Client;

// ...

var client = Client.fromConnectionString(connectionString);

var methodParams = {
  methodName: "getMaxMinReport",
  payload: new Date().getMinutes -2,
  responseTimeoutInSeconds: 15
};

client.invokeDeviceMethod(deviceId, methodParams, function (err, result) {
  if (err) {
    console.error('Failed to invoke method \'' + methodParams.methodName + '\': ' + err.message);
  } else {
    console.log(methodParams.methodName + ' on ' + deviceId + ':');
    console.log(JSON.stringify(result, null, 2));
  }
});

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. komutu termostat1 bileşeninde tanımlanır:

var Client = require('azure-iothub').Client;

// ...

var client = Client.fromConnectionString(connectionString);

var methodParams = {
  methodName: "thermostat1*getMaxMinReport",
  payload: new Date().getMinutes -2,
  responseTimeoutInSeconds: 15
};

client.invokeDeviceMethod(deviceId, methodParams, function (err, result) {
  if (err) {
    console.error('Failed to invoke method \'' + methodParams.methodName + '\': ' + err.message);
  } else {
    console.log(methodParams.methodName + ' on ' + deviceId + ':');
    console.log(JSON.stringify(result, null, 2));
  }
});

IoT Hub ikizi örnekleri

DigitalTwinClient sınıfını kullanarak dijital ikizleri kullanarak cihaz durumuyla etkileşim kurabilirsiniz. Cihazın DTDL modeli, cihazın uygulayan özelliklerini ve komutlarını tanımlar.

Bu bölümde api'sini kullanan JavaScript Digital Twins verilmiştir.

değişkeni, digitalTwinId IoT hub'ınıza IoT Tak Çalıştır cihazın cihaz kimliğini tutar.

Dijital ikiz ve model kimliğini al

IoT hub'ınıza bağlı IoT Tak Çalıştır cihazın dijital ikizini ve model kimliğini almak için:

const IoTHubTokenCredentials = require('azure-iothub').IoTHubTokenCredentials;
const DigitalTwinClient = require('azure-iothub').DigitalTwinClient;
const { inspect } = require('util');

// ...

const credentials = new IoTHubTokenCredentials(connectionString);
const digitalTwinClient = new DigitalTwinClient(credentials);

const digitalTwin = await digitalTwinClient.getDigitalTwin(digitalTwinId);

console.log(inspect(digitalTwin));
console.log('Model Id: ' + inspect(digitalTwin.$metadata.$model));

Dijital ikizi güncelleştirme

Aşağıdaki kod parçacığında, bir cihaz targetTemperature özelliğinin nasıl güncelleştiril olduğu gösterir. özelliği, cihazın varsayılan bileşeninde tanımlanır:

const IoTHubTokenCredentials = require('azure-iothub').IoTHubTokenCredentials;
const DigitalTwinClient = require('azure-iothub').DigitalTwinClient;

// ...

const credentials = new IoTHubTokenCredentials(connString);
const digitalTwinClient = new DigitalTwinClient(credentials);

const patch = [{
  op: 'add',
  path: '/targetTemperature',
  value: 42
}];
await digitalTwinClient.updateDigitalTwin(digitalTwinId, patch);

Aşağıdaki kod parçacığında, bir bileşende targetTemperature özelliğin nasıl güncelleştiril olduğu gösterir. özelliği termostat1 bileşeninde tanımlanır:

const IoTHubTokenCredentials = require('azure-iothub').IoTHubTokenCredentials;
const DigitalTwinClient = require('azure-iothub').DigitalTwinClient;

// ...

const credentials = new IoTHubTokenCredentials(connString);
const digitalTwinClient = new DigitalTwinClient(credentials);

const patch = [{
  op: 'add',
  path: '/thermostat1/targetTemperature',
  value: 42
}];
await digitalTwinClient.updateDigitalTwin(digitalTwinId, patch);

Call komutu

Aşağıdaki kod parçacığında, varsayılan bir getMaxMinReport bileşende tanımlanan komutun nasıl çağrıl olduğu gösterir:

const IoTHubTokenCredentials = require('azure-iothub').IoTHubTokenCredentials;
const DigitalTwinClient = require('azure-iothub').DigitalTwinClient;
const { inspect } = require('util');

// ...

const commandPayload = new Date().getMinutes -2;

const credentials = new IoTHubTokenCredentials(connectionString);
const digitalTwinClient = new DigitalTwinClient(credentials);

const options = {
  connectTimeoutInSeconds: 30,
  responseTimeoutInSeconds: 40
};
const commandResponse = await digitalTwinClient.invokeCommand(digitalTwinId, "getMaxMinReport", commandPayload, options);

console.log(inspect(commandResponse));

Aşağıdaki kod parçacığında, bir bileşende getMaxMinReport komutun nasıl çağrıl olduğu gösterir. komutu termostat1 bileşeninde tanımlanır:

const IoTHubTokenCredentials = require('azure-iothub').IoTHubTokenCredentials;
const DigitalTwinClient = require('azure-iothub').DigitalTwinClient;
const { inspect } = require('util');

// ...

const commandPayload = new Date().getMinutes -2;

const credentials = new IoTHubTokenCredentials(connectionString);
const digitalTwinClient = new DigitalTwinClient(credentials);

const options = {
  connectTimeoutInSeconds: 30,
  responseTimeoutInSeconds: 40
};
const commandResponse = await digitalTwinClient.invokeComponentCommand(digitalTwinId, "thermostat1", "getMaxMinReport", commandPayload, options);

console.log(inspect(commandResponse));

Cihaz telemetrisini okuma

IoT Tak Çalıştır cihazlar DTDL modelinde tanımlanan telemetri verileri veri IoT Hub. Varsayılan olarak IoT Hub telemetri, telemetriyi Event Hubs uç noktasına yönlendirir. Daha fazla bilgi edinmek için bkz. IoT Hub uç noktalara cihazdan buluta ileti göndermek için ileti yönlendirmeyi kullanma.

Aşağıdaki kod parçacığında, varsayılan uç noktadan telemetri Event Hubs gösterir. Bu kod parçacığındaki kod, IoT Hub cihazdan IoT hub'a telemetrigönderme hızlı başlangıçtan alınarak arka uç uygulamasıyla okunur:

const { EventHubConsumerClient } = require("@azure/event-hubs");

var printError = function (err) {
  console.log(err.message);
};

var printMessages = function (messages) {
  for (const message of messages) {
    console.log("Telemetry received: ");
    console.log(JSON.stringify(message.body));
    console.log("Properties (set by device): ");
    console.log(JSON.stringify(message.properties));
    console.log("System properties (set by IoT Hub): ");
    console.log(JSON.stringify(message.systemProperties));
    console.log("");
  }
};

// ...

const clientOptions = {};

const consumerClient = new EventHubConsumerClient("$Default", connectionString, clientOptions);

consumerClient.subscribe({
  processEvents: printMessages,
  processError: printError,
});

Önceki kodun aşağıdaki çıktısı, çok bileşenli TemperatureController tarafından cihaza gönderilen sıcaklık telemetrisini IoT Tak Çalıştır gösterir. Sistem dt-subject özelliği, telemetri gönderilen bileşenin adını gösterir. Bu örnekte iki bileşen thermostat1 thermostat2 DTDL modelinde tanımlanan ve bileşenleridir. Sistem dt-dataschema özelliği model kimliğini gösterir:

Telemetry received:
{"temperature":68.77370855171125}
Properties (set by device):
undefined
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-connection-auth-method":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id":"637388034455888246","iothub-enqueuedtime":1603206669320,"iothub-message-source":"Telemetry","dt-subject":"thermostat1","dt-dataschema":"dtmi:com:example:TemperatureController;1","contentType":"application/json","contentEncoding":"utf-8"}

Telemetry received:
{"temperature":30.833394506549226}
Properties (set by device):
undefined
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-connection-auth-method":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id":"637388034455888246","iothub-enqueuedtime":1603206665835,"iothub-message-source":"Telemetry","dt-subject":"thermostat2","dt-dataschema":"dtmi:com:example:TemperatureController;1","contentType":"application/json","contentEncoding":"utf-8"}

Cihaz ikizi değişiklik bildirimlerini okuma

Desteklenen uç IoT Hub cihaz ikizi değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırabilirsiniz. Daha fazla bilgi için bkz. IoT Hub telemetri dışı olaylar için farklı uç noktalara cihazdan buluta ileti > yönlendirmeyi kullanma.

Önceki JavaScript kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received:
{"version":4,"properties":{"reported":{"maxTempSinceLastReboot":42.1415152639582,"$metadata":{"$lastUpdated":"2020-10-21T10:01:40.1281138Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-21T10:01:40.1281138Z"}},"$version":3}}}
Properties (set by device):
{"hubName":"my-pnp-hub","deviceId":"my-pnp-device","operationTimestamp":"2020-10-21T10:01:40.1281138+00:00","iothub-message-schema":"twinChangeNotification","opType":"updateTwin"}
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-enqueuedtime":1603274500282,"iothub-message-source":"twinChangeEvents","userId":{"type":"Buffer","data":[109,121,45,112,110,112,45,104,117,98]},"correlationId":"11ed82d13f50","contentType":"application/json","contentEncoding":"utf-8"}

Önceki JavaScript kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması gerekirken aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received:
{"version":4,"properties":{"reported":{"thermostat1":{"maxTempSinceLastReboot":3.5592971602417913,"__t":"c"},"$metadata":{"$lastUpdated":"2020-10-21T10:07:51.8284866Z","thermostat1":{"$lastUpdated":"2020-10-21T10:07:51.8284866Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-21T10:07:51.8284866Z"},"__t":{"$lastUpdated":"2020-10-21T10:07:51.8284866Z"}}},"$version":3}}}
Properties (set by device):
{"hubName":"my-pnp-hub","deviceId":"my-pnp-device","operationTimestamp":"2020-10-21T10:07:51.8284866+00:00","iothub-message-schema":"twinChangeNotification","opType":"updateTwin"}
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-enqueuedtime":1603274871951,"iothub-message-source":"twinChangeEvents","userId":{"type":"Buffer","data":[109,121,45,112,110,112,45,104,117,98]},"correlationId":"11ee605b195f","contentType":"application/json","contentEncoding":"utf-8"}

Dijital ikiz değişiklik bildirimlerini okuma

Desteklenen bir uç IoT Hub yönlendiren dijital ikiz değişiklik bildirimleri oluşturmak için yapılandırmayı yapılandırebilirsiniz. Daha fazla bilgi için bkz. IoT Hub telemetri dışı olaylar için farklı uç noktalara cihazdan buluta ileti > yönlendirmeyi kullanma.

Önceki JavaScript kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received:
[{"op":"add","path":"/$metadata/maxTempSinceLastReboot","value":{"lastUpdateTime":"2020-10-21T10:01:40.1281138Z"}},{"op":"add","path":"/maxTempSinceLastReboot","value":42.1415152639582}]
Properties (set by device):
{"hubName":"my-pnp-hub","deviceId":"my-pnp-device","operationTimestamp":"2020-10-21T10:01:40.1281138+00:00","iothub-message-schema":"digitalTwinChangeNotification","opType":"updateTwin"}
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-enqueuedtime":1603274500282,"iothub-message-source":"digitalTwinChangeEvents","userId":{"type":"Buffer","data":[109,121,45,112,110,112,45,104,117,98]},"correlationId":"11ed82d13f50","contentType":"application/json-patch+json","contentEncoding":"utf-8"}

Önceki JavaScript kod parçacığında gösterilen kod, bileşenlere sahip bir cihaz için IoT Hub ikizi değişiklik bildirimleri oluşturması üzerine aşağıdaki çıkışı oluşturur. Bu örnekte termostat bileşenine sahip bir sıcaklık algılayıcısı cihazı bildirim oluşturması durumuyla ilgili çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve size değişiklik opType bildiriminin türü hakkında bilgi sağlar:

Telemetry received:
[{"op":"add","path":"/thermostat1","value":{"$metadata":{"maxTempSinceLastReboot":{"lastUpdateTime":"2020-10-21T10:07:51.8284866Z"}},"maxTempSinceLastReboot":3.5592971602417913}}]
Properties (set by device):
{"hubName":"my-pnp-hub","deviceId":"my-pnp-device","operationTimestamp":"2020-10-21T10:07:51.8284866+00:00","iothub-message-schema":"digitalTwinChangeNotification","opType":"updateTwin"}
System properties (set by IoT Hub):
{"iothub-connection-device-id":"my-pnp-device","iothub-enqueuedtime":1603274871951,"iothub-message-source":"digitalTwinChangeEvents","userId":{"type":"Buffer","data":[109,121,45,112,110,112,45,104,117,98]},"correlationId":"11ee605b195f","contentType":"application/json-patch+json","contentEncoding":"utf-8"}

Aşağıdaki kaynaklar da kullanılabilir:

IoT Hub hizmeti istemci örnekleri

Bu bölümde, IoT Hub Service Client ve Iothubregistrymanager ve Cloudtodevicemethod sınıfları kullanılarak Python örnekleri gösterilmektedir. Device TWINS kullanarak cihaz durumuyla etkileşim kurmak için Iothubregistrymanager sınıfını kullanırsınız. Ayrıca, IoT Hub cihaz kayıtlarını sorgulamak Için Iothubregistrymanager sınıfını da kullanabilirsiniz. Cihazdaki komutları çağırmak için Cloudtodevicemethod sınıfını kullanın. Cihazın Dtdl modeli, cihazın uyguladığı özellikleri ve komutları tanımlar. Kod parçacıklarında, device_id değişken IoT Hub 'ınıza kayıtlı olan ıot Tak ve kullan cihazının CIHAZ kimliğini barındırır.

Cihaz ikizi ve model KIMLIĞINI al

IoT Hub 'ınıza bağlanan IoT Tak ve Kullan cihazının cihaz ikizi ve model KIMLIĞINI almak için:

from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import Twin, TwinProperties

iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)

# ...

twin = iothub_registry_manager.get_twin(device_id)
print("The device twin is: ")
print("")
print(twin)
print("")

additional_props = twin.additional_properties
if "modelId" in additional_props:
    print("The Model ID for this device is:")
    print(additional_props["modelId"])
    print("")

Cihaz ikizi Güncelleştir

Aşağıdaki kod parçacığı, targetTemperature bir cihazdaki özelliğinin nasıl güncelleştirilmesini gösterir. Örnek, ikizi ' i güncelleştirmeden önce nasıl almanız gerektiğini gösterir etag . Özelliği, cihazın varsayılan bileşeninde tanımlanmıştır:

iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)

twin = iothub_registry_manager.get_twin(device_id)

twin_patch = Twin()

twin_patch.properties = TwinProperties(
    desired={"targetTemperature": 42}
)
updated_twin = iothub_registry_manager.update_twin(device_id, twin_patch, twin.etag)

Aşağıdaki kod parçacığında, targetTemperature bir bileşen üzerinde özelliğin nasıl güncelleştirilecek gösterilmektedir. Örnek, ikizi ' i güncelleştirmeden önce nasıl almanız gerektiğini gösterir ETag . Özelliği thermostat1 bileşeninde tanımlanmıştır:

iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)

twin = iothub_registry_manager.get_twin(device_id)

twin_patch = Twin()

twin_patch.properties = TwinProperties(
    desired={ "thermostat1": {
        "__t": "c",
        "targetTemperature": 42}
    }
)
updated_twin = iothub_registry_manager.update_twin(device_id, twin_patch, twin.etag)

Bir bileşenin özelliği için, özellik düzeltme eki aşağıdaki örneğe benzer şekilde görünür:

{
"thermostat1":
  {
    "__t": "c",
    "targetTemperature": 20
  }
}

Call komutu

Aşağıdaki kod parçacığı, getMaxMinReport varsayılan bir bileşende tanımlanan komutun nasıl çağıralınacağını gösterir:

from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import CloudToDeviceMethod

# ...

iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)

method_payload = datetime.datetime.now() - datetime.timedelta(minutes=2)
device_method = CloudToDeviceMethod(method_name="getMaxMinReport", payload=method_payload)
result = iothub_registry_manager.invoke_device_method(device_id, device_method)
print(result.payload)

Aşağıdaki kod parçacığında, bir bileşende komutun nasıl çağrılacağını gösterir getMaxMinReport . Komut thermostat1 bileşeninde tanımlanmıştır:

from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import CloudToDeviceMethod

# ...

iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)

method_payload = datetime.datetime.now() - datetime.timedelta(minutes=2)
device_method = CloudToDeviceMethod(method_name="thermostat1*getMaxMinReport", payload=method_payload)
result = iothub_registry_manager.invoke_device_method(device_id, device_method)
print(result.payload)

IoT Hub Digital ikizi örnekleri

Dijital TWINS kullanarak cihaz durumuyla etkileşim kurmak için Digitaltwınclient sınıfını kullanırsınız. Cihazın Dtdl modeli, cihazın uyguladığı özellikleri ve komutları tanımlar.

device_idDeğişkeni, IoT Hub 'ınıza kayıtlı olan ıot Tak ve kullan cihazının CIHAZ kimliğini içerir.

Dijital ikizi ve model KIMLIĞINI alın

IoT Hub 'ınıza bağlanan IoT Tak ve Kullan cihazının dijital ikizi ve model KIMLIĞINI almak için:

from azure.iot.hub import DigitalTwinClient

digital_twin_client = DigitalTwinClient(iothub_connection_str)

digital_twin = digital_twin_client.get_digital_twin(device_id)
if digital_twin:
    print(digital_twin)
    print("Model Id: " + digital_twin["$metadata"]["$model"])
else:
    print("No digital_twin found")

Dijital ikizi Güncelleştir

Aşağıdaki kod parçacığı, targetTemperature bir cihazdaki özelliğinin nasıl güncelleştirilmesini gösterir. Özelliği, cihazın varsayılan bileşeninde tanımlanmıştır:

from azure.iot.hub import DigitalTwinClient

digital_twin_client = DigitalTwinClient(iothub_connection_str)

patch = [{"op": "add", "path": "/targetTemperature", "value": 42}]
digital_twin_client.update_digital_twin(device_id, patch)

Aşağıdaki kod parçacığında, targetTemperature bir bileşen üzerinde özelliğin nasıl güncelleştirilecek gösterilmektedir. Özelliği thermostat1 bileşeninde tanımlanmıştır:

from azure.iot.hub import DigitalTwinClient

digital_twin_client = DigitalTwinClient(iothub_connection_str)

patch = [{"op": "add", "path": "/targetTemperature", "value": 42}]
digital_twin_client.update_digital_twin(device_id, patch)

Call komutu

Aşağıdaki kod parçacığı, getMaxMinReport varsayılan bir bileşende tanımlanan komutun nasıl çağıralınacağını gösterir:

from azure.iot.hub import DigitalTwinClient

payload = datetime.datetime.now() - datetime.timedelta(minutes=2)

connect_timeout_in_seconds = 3
response_timeout_in_seconds = 7


digital_twin_client = DigitalTwinClient(iothub_connection_str)

invoke_command_result = digital_twin_client.invoke_command(
    device_id, "getMaxMinReport", payload, connect_timeout_in_seconds, response_timeout_in_seconds
)
if invoke_command_result:
    print(invoke_command_result)
else:
    print("No invoke_command_result found")

Aşağıdaki kod parçacığında, bir bileşende komutun nasıl çağrılacağını gösterir getMaxMinReport . Komut thermostat1 bileşeninde tanımlanmıştır:

from azure.iot.hub import DigitalTwinClient

payload = datetime.datetime.now() - datetime.timedelta(minutes=2)

connect_timeout_in_seconds = 3
response_timeout_in_seconds = 7


digital_twin_client = DigitalTwinClient(iothub_connection_str)

invoke_command_result = digital_twin_client.invoke_component_command(
    device_id, "thermostat1", "getMaxMinReport", payload, connect_timeout_in_seconds, response_timeout_in_seconds
)
if invoke_command_result:
    print(invoke_command_result)
else:
    print("No invoke_command_result found")

Cihaz telemetrisini okuma

IoT Tak ve Kullan cihazları DTDL modelinde tanımlanan telemetrileri IoT Hub gönderir. Varsayılan olarak, IoT Hub Telemetriyi kullanabileceğiniz bir Event Hubs uç noktasına yönlendirir. Daha fazla bilgi edinmek için bkz. farklı uç noktalara cihazdan buluta iletiler göndermek için IoT Hub ileti yönlendirmeyi kullanma.

Aşağıdaki kod parçacığı, varsayılan Event Hubs uç noktasından Telemetriyi okumayı gösterir. Bu kod parçacığındaki kod, IoT Hub hızlı başlangıçta bir cihazdan IoT Hub 'ına telemetri gönderme ve arka uç uygulamasıyla okumaişlemi gerçekleştirmektir:

import asyncio
from azure.eventhub import TransportType
from azure.eventhub.aio import EventHubConsumerClient

# Define callbacks to process events
async def on_event_batch(partition_context, events):
    for event in events:
        print("Received event from partition: {}.".format(partition_context.partition_id))
        print("Telemetry received: ", event.body_as_str())
        print("Properties (set by device): ", event.properties)
        print("System properties (set by IoT Hub): ", event.system_properties)
        print()
    await partition_context.update_checkpoint()

async def on_error(partition_context, error):
    # ...

loop = asyncio.get_event_loop()
client = EventHubConsumerClient.from_connection_string(
    conn_str=CONNECTION_STR,
    consumer_group="$default",
)

try:
    loop.run_until_complete(client.receive_batch(on_event_batch=on_event_batch, on_error=on_error))
except KeyboardInterrupt:
    print("Receiving has stopped.")
finally:
    loop.run_until_complete(client.close())
    loop.stop()

Önceki koddan bulunan aşağıdaki çıktıda, bileşen olmayan termostat IoT Tak ve kullan cihazının yalnızca varsayılan bileşene sahip olduğu sıcaklık telemetrisi gösterilmektedir. dt-dataschemaSystem özelliği, model kimliğini gösterir:

Received event from partition: 1.
Telemetry received:  {"temperature": 12}
Properties (set by device):  None
System properties (set by IoT Hub):  {b'content-type': b'application/json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-connection-auth-method': b'{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}', b'iothub-connection-auth-generation-id': b'637388855582764406', b'iothub-enqueuedtime': 1603288810715, b'iothub-message-source': b'Telemetry', b'dt-dataschema': b'dtmi:com:example:Thermostat;1', b'x-opt-sequence-number': 13280, b'x-opt-offset': b'12890070640', b'x-opt-enqueued-time': 1603288810824}

Önceki koddan bulunan aşağıdaki çıktıda, çok bileşen TemperatureController IoT Tak ve kullan cihazının gönderdiği sıcaklık telemetrisi gösterilmektedir. dt-subjectSystem özelliği, Telemetriyi gönderen bileşenin adını gösterir. Bu örnekte, iki bileşen thermostat1 ve thermostat2 dtdl modelinde tanımlanmıştır. dt-dataschemaSystem özelliği, model kimliğini gösterir:

Received event from partition: 1.
Telemetry received:  {"temperature": 45}
Properties (set by device):  None
System properties (set by IoT Hub):  {b'content-type': b'application/json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-connection-auth-method': b'{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}', b'iothub-connection-auth-generation-id': b'637388858939631652', b'iothub-enqueuedtime': 1603289127844, b'iothub-message-source': b'Telemetry', b'dt-subject': b'thermostat1', b'dt-dataschema': b'dtmi:com:example:TemperatureController;1', b'x-opt-sequence-number': 13328, b'x-opt-offset': b'12890095440', b'x-opt-enqueued-time': 1603289128001}

Received event from partition: 1.
Telemetry received:  {"temperature": 49}
Properties (set by device):  None
System properties (set by IoT Hub):  {b'content-type': b'application/json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-connection-auth-method': b'{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}', b'iothub-connection-auth-generation-id': b'637388858939631652', b'iothub-enqueuedtime': 1603289133017, b'iothub-message-source': b'Telemetry', b'dt-subject': b'thermostat2', b'dt-dataschema': b'dtmi:com:example:TemperatureController;1', b'x-opt-sequence-number': 13329, b'x-opt-offset': b'12890095928', b'x-opt-enqueued-time': 1603289133173}

Cihaz ikizi değişiklik bildirimlerini oku

Desteklenen bir uç noktaya yönlendirmek üzere cihaz ikizi değişiklik bildirimleri oluşturmak için IoT Hub yapılandırabilirsiniz. Daha fazla bilgi edinmek için bkz. IoT Hub ileti yönlendirmeyi kullanarak, telemetri olmayan olaylar > farklı uç noktalara cihazdan buluta iletiler gönderme.

Önceki Python kod parçacığında gösterilen kod, bileşen olmayan bir termostat cihazı için IoT Hub cihaz ikizi değişiklik bildirimleri oluşturduğunda aşağıdaki çıktıyı üretir. Uygulama özellikleri iothub-message-schema ve opType değişiklik bildirimi türü hakkında bilgi verir:

Received event from partition: 1.
Telemetry received:  {"version":3,"properties":{"reported":{"maxTempSinceLastReboot":10.96,"$metadata":{"$lastUpdated":"2020-10-21T14:10:42.4171263Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-21T14:10:42.4171263Z"}},"$version":2}}}
Properties (set by device):  {b'hubName': b'my-pnp-hub', b'deviceId': b'my-pnp-device', b'operationTimestamp': b'2020-10-21T14:10:42.4171263+00:00', b'iothub-message-schema': b'twinChangeNotification', b'opType': b'updateTwin'}
System properties (set by IoT Hub):  {b'user-id': b'my-pnp-hub\x81\x0e\xa4\x7f', b'correlation-id': b'12104ced5402', b'content-type': b'application/json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-enqueuedtime': 1603289442519, b'iothub-message-source': b'twinChangeEvents', b'x-opt-sequence-number': 13332, b'x-opt-offset': b'12890097392', b'x-opt-enqueued-time': 1603289442738}

Önceki Python kod parçacığında gösterilen kod, bileşenler içeren bir cihaz için cihaz ikizi değişiklik bildirimleri IoT Hub oluşturduğunda aşağıdaki çıktıyı üretir. Bu örnek, bir termostat bileşeni olan bir sıcaklık algılayıcısı cihazı bildirim oluşturduğunda çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve opType değişiklik bildirimi türü hakkında bilgi verir:

Received event from partition: 1.
Telemetry received:  {"version":4,"properties":{"reported":{"thermostat1":{"maxTempSinceLastReboot":98.34,"__t":"c"},"$metadata":{"$lastUpdated":"2020-10-21T14:13:39.36491Z","thermostat1":{"$lastUpdated":"2020-10-21T14:13:39.36491Z","maxTempSinceLastReboot":{"$lastUpdated":"2020-10-21T14:13:39.36491Z"},"__t":{"$lastUpdated":"2020-10-21T14:13:39.36491Z"}}},"$version":3}}}
Properties (set by device):  {b'hubName': b'my-pnp-hub', b'deviceId': b'my-pnp-device', b'operationTimestamp': b'2020-10-21T14:13:39.3649100+00:00', b'iothub-message-schema': b'twinChangeNotification', b'opType': b'updateTwin'}
System properties (set by IoT Hub):  {b'user-id': b'my-pnp-hub', b'correlation-id': b'1210b664ab83', b'content-type': b'application/json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-enqueuedtime': 1603289619481, b'iothub-message-source': b'twinChangeEvents', b'x-opt-sequence-number': 13341, b'x-opt-offset': b'12890102216', b'x-opt-enqueued-time': 1603289619668}

Dijital ikizi değişiklik bildirimlerini oku

Desteklenen bir uç noktaya yönlendirmek için dijital ikizi değişiklik bildirimleri oluşturacak şekilde IoT Hub yapılandırabilirsiniz. Daha fazla bilgi edinmek için bkz. IoT Hub ileti yönlendirmeyi kullanarak, telemetri olmayan olaylar > farklı uç noktalara cihazdan buluta iletiler gönderme.

Önceki Python kod parçacığında gösterilen kod, IoT Hub bileşen olmayan bir termostat cihazı için dijital ikizi değişiklik bildirimleri oluşturduğunda aşağıdaki çıktıyı üretir. Uygulama özellikleri iothub-message-schema ve opType değişiklik bildirimi türü hakkında bilgi verir:

Received event from partition: 1.
Telemetry received:  [{"op":"add","path":"/$metadata/maxTempSinceLastReboot","value":{"lastUpdateTime":"2020-10-21T14:10:42.4171263Z"}},{"op":"add","path":"/maxTempSinceLastReboot","value":10.96}]
Properties (set by device):  {b'hubName': b'my-pnp-hub', b'deviceId': b'my-pnp-device', b'operationTimestamp': b'2020-10-21T14:10:42.4171263+00:00', b'iothub-message-schema': b'digitalTwinChangeNotification', b'opType': b'updateTwin'}
System properties (set by IoT Hub):  {b'user-id': b'my-pnp-hub\x81\x0e\xa4\x7f', b'correlation-id': b'12104ced5402', b'content-type': b'application/json-patch+json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-enqueuedtime': 1603289442519, b'iothub-message-source': b'digitalTwinChangeEvents', b'x-opt-sequence-number': 13333, b'x-opt-offset': b'12890098024', b'x-opt-enqueued-time': 1603289442738}

Önceki Python kod parçacığında gösterilen kod, IoT Hub bileşenleri olan bir cihaz için dijital ikizi değişiklik bildirimleri oluşturduğunda aşağıdaki çıktıyı üretir. Bu örnek, bir termostat bileşeni olan bir sıcaklık algılayıcısı cihazı bildirim oluşturduğunda çıktıyı gösterir. Uygulama özellikleri iothub-message-schema ve opType değişiklik bildirimi türü hakkında bilgi verir:

Received event from partition: 1.
Telemetry received:  [{"op":"add","path":"/thermostat1","value":{"$metadata":{"maxTempSinceLastReboot":{"lastUpdateTime":"2020-10-21T14:13:39.36491Z"}},"maxTempSinceLastReboot":98.34}}]
Properties (set by device):  {b'hubName': b'my-pnp-hub', b'deviceId': b'my-pnp-device', b'operationTimestamp': b'2020-10-21T14:13:39.3649100+00:00', b'iothub-message-schema': b'digitalTwinChangeNotification', b'opType': b'updateTwin'}
System properties (set by IoT Hub):  {b'user-id': b'my-pnp-hub', b'correlation-id': b'1210b664ab83', b'content-type': b'application/json-patch+json', b'content-encoding': b'utf-8', b'iothub-connection-device-id': b'my-pnp-device', b'iothub-enqueuedtime': 1603289619481, b'iothub-message-source': b'digitalTwinChangeEvents', b'x-opt-sequence-number': 13342, b'x-opt-offset': b'12890102984', b'x-opt-enqueued-time': 1603289619668}

Sonraki adımlar

Cihaz modellemeyi öğrendiğinize göre, bazı ek kaynaklar: