دليل مطوري خدمات أجهزة التوصيل و التشغيل إنترنت الأشياء

يتيح لك أجهزة التوصيل و التشغيل إنترنت الأشياء إنشاء أجهزة إنترنت الأشياء التي تعلن عن قدراتها لتطبيقات Azure IoT. لا تتطلب أجهزة إنترنت الأشياء أجهزة التوصيل و التشغيل تكوينا يدويا عندما يقوم العميل بتوصيلها بالتطبيقات التي تدعم أجهزة التوصيل و التشغيل إنترنت الأشياء.

يتيح لك IoT أجهزة التوصيل و التشغيل استخدام الأجهزة التي أعلنت عن معرف الطراز الخاص بها مع مركز إنترنت الأشياء الخاص بك. على سبيل المثال، يمكنك الوصول إلى خصائص وأوامر الجهاز مباشرة.

لاستخدام جهاز أجهزة التوصيل و التشغيل إنترنت الأشياء المتصل بمركز إنترنت الأشياء، إحدى مجموعات تطوير البرامج (SDK) لخدمة إنترنت الأشياء:

حزم Service SDK

استخدم مجموعات تطوير البرامج (SDK) لخدمة Azure IoT Service في الحل الخاص بك للتفاعل مع الأجهزة والوحدات النمطية. على سبيل المثال، يمكنك استخدام SDKs الخدمة لقراءة وتحديث الخصائص التوأم واستدعاء الأوامر. تتضمن اللغات المدعومة C # و Java و Node.js و Python.

تتيح لك مجموعات SDK للخدمة الوصول إلى معلومات الجهاز من أحد الحلول، مثل سطح المكتب أو تطبيق الويب. تتضمن مجموعات SDK للخدمة مساحتي أسماء ونماذج كائنات يمكنك استخدامها لاسترداد معرف النموذج:

  • عميل خدمة Iot Hub. تعرض هذه الخدمة معرف الطراز كخاصية مزدوجة للجهاز.

  • عميل التوائم الرقمية. تعمل واجهة برمجة تطبيقات Digital Twins API الجديدة على تركيبات نموذج لغة تعريف التوائم الرقمية (DTDL) مثل المكونات والخصائص والأوامر. تسهل واجهات برمجة التطبيقات الرقمية المزدوجة على منشئي الحلول إنشاء حلول أجهزة التوصيل و التشغيل إنترنت الأشياء.

كما تتوفر الموارد التالية:

أمثلة على عملاء خدمة IoT Hub

يعرض هذا القسم أمثلة C # باستخدام عميل خدمة IoT Hub وفئتي RegistryManagerوServiceClient . يمكنك استخدام الفئة RegistryManager للتفاعل مع حالة الجهاز باستخدام توائم الجهاز. يمكنك أيضا استخدام فئة RegistryManagerللاستعلام عن تسجيلات الأجهزة في IoT Hub. يمكنك استخدام فئة ServiceClient لاستدعاء الأوامر على الجهاز. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز. في مقتطفات التعليمات البرمجية، deviceTwinId يحتفظ المتغير بمعرف الجهاز الخاص بجهاز أجهزة التوصيل و التشغيل إنترنت الأشياء المسجل في مركز إنترنت الأشياء.

الحصول على الجهاز المزدوج ومعرف الطراز

للحصول على التوأم للجهاز ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل متصل بمركز إنترنت الأشياء:

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}.");

تحديث الجهاز التوأم

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. توضح العينة كيف تحتاج إلى الحصول على التوأم ETag قبل تحديثه. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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);

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. توضح العينة كيف تحتاج إلى الحصول على التوأم ETag قبل تحديثه. يتم تعريف الخاصية في مكون Thermostat1 :

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

بالنسبة لخاصية في مكون، يبدو تصحيح الخاصية مثل المثال التالي:

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

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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}.";
}

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون Thermostat1 :

// 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.");
}

أمثلة على التوأم الرقمي لمركز إنترنت الأشياء

يمكنك استخدام الفئة DigitalTwinClient للتفاعل مع حالة الجهاز باستخدام التوائم الرقمية. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز.

يعرض هذا القسم أمثلة C # باستخدام واجهة برمجة تطبيقات Digital Twins. تستخدم المقتطفات التالية الفئات التالية لتمثيل التوأم الرقمي لأجهزة منظم الحرارة والتحكم في درجة الحرارة:

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

digitalTwinId يحتفظ المتغير بمعرف الجهاز الخاص بجهاز IoT أجهزة التوصيل و التشغيل المسجل في مركز إنترنت الأشياء الخاص بك.

احصل على التوأم الرقمي ومعرف الطراز

للحصول على التوأم الرقمي ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل المتصل بمركز إنترنت الأشياء:

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)}");

تحديث التوأم الرقمي

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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}.");

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. يتم تعريف الخاصية في مكون Thermostat1 :

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}.");

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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}.");
  }
}

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون Thermostat1 :

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.");
    }
}

قراءة القياس عن بعد للجهاز

ترسل أجهزة أجهزة التوصيل و التشغيل إنترنت الأشياء القياس عن بعد المحدد في نموذج DTDL إلى IoT Hub. بشكل افتراضي، يقوم IoT Hub بتوجيه القياس عن بعد إلى نقطة نهاية Event Hubs حيث يمكنك استهلاكه. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى نقاط نهاية مختلفة.

يوضح مقتطف التعليمات البرمجية التالي كيفية قراءة القياس عن بعد من نقطة نهاية مراكز الأحداث الافتراضية. يتم أخذ التعليمة البرمجية الموجودة في هذا المقتطف من التشغيل السريع لمركز إنترنت الأشياء إرسال القياس عن بعد من جهاز إلى مركز إنترنت الأشياء وقراءته باستخدام تطبيق خلفي:

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

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز Thermostat IoT أجهزة التوصيل و التشغيل بدون مكون يحتوي على المكون الافتراضي فقط. dt-dataschema تعرض خاصية النظام معرف النموذج:

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

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز TemperatureController IoT أجهزة التوصيل و التشغيل متعدد المكونات. dt-subject تعرض خاصية النظام اسم المكون الذي أرسل القياس عن بعد. في هذا المثال، المكونان هما thermostat1 وكما thermostat2 هو محدد في نموذج DTDL. dt-dataschema تعرض خاصية النظام معرف النموذج:

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

قراءة إشعارات التغيير المزدوج للجهاز

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير مزدوجة للجهاز للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية C# السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية C# السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

قراءة إشعارات التغيير الرقمي المزدوج

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير التوأم الرقمي للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية C# السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة رقمية لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية C # السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إعلامات تغيير مزدوجة رقمية لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

كما تتوفر الموارد التالية:

أمثلة على عملاء خدمة IoT Hub

يعرض هذا القسم أمثلة Java باستخدام عميل خدمة IoT Hub وفئتي DeviceTwinوDeviceMethod من مساحة اسم com.microsoft.azure.sdk.iot.service.devicetwin. يمكنك استخدام الفئة DeviceTwin للتفاعل مع حالة الجهاز باستخدام توائم الجهاز. يمكنك أيضا استخدام فئة DeviceTwinللاستعلام عن تسجيلات الأجهزة في مركز إنترنت الأشياء. يمكنك استخدام الفئة DeviceMethod لاستدعاء الأوامر على الجهاز. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز. في مقتطفات التعليمات البرمجية، deviceId يحتفظ المتغير بمعرف الجهاز الخاص بجهاز أجهزة التوصيل و التشغيل إنترنت الأشياء المسجل في مركز إنترنت الأشياء.

الحصول على الجهاز المزدوج ومعرف الطراز

للحصول على التوأم للجهاز ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل متصل بمركز إنترنت الأشياء:

DeviceTwin twinClient = DeviceTwin.createFromConnectionString(iotHubConnectionString);

// ...

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

تحديث الجهاز التوأم

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. يجب أن تحصل على التوأم قبل تحديثه. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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);

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. يجب أن تحصل على التوأم قبل تحديثه. يتم تعريف الخاصية في مكون ترموستات1 :

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);

بالنسبة لخاصية في مكون، يبدو تصحيح الخاصية مثل المثال التالي:

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

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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());

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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());

أمثلة على التوأم الرقمي لمركز إنترنت الأشياء

يمكنك استخدام الفئة DigitalTwinAsyncClient في مساحة اسم com.microsoft.azure.sdk.iot.service.digitaltwin للتفاعل مع حالة الجهاز باستخدام التوائم الرقمية. تستخدم الأمثلة التالية أيضا فئتي UpdateOperationUtility و BasicDigitalTwin من نفس مساحة الاسم. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز.

digitalTwinid يحتفظ المتغير بمعرف الجهاز الخاص بجهاز IoT أجهزة التوصيل و التشغيل المسجل في مركز إنترنت الأشياء الخاص بك.

احصل على التوأم الرقمي ومعرف الطراز

للحصول على التوأم الرقمي ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل المتصل بمركز إنترنت الأشياء:

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);
}

تحديث التوأم الرقمي

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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();

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. يتم تعريف الخاصية في مكون ترموستات1 :

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);

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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));
}

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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));
}

قراءة القياس عن بعد للجهاز

ترسل أجهزة أجهزة التوصيل و التشغيل إنترنت الأشياء القياس عن بعد المحدد في نموذج DTDL إلى IoT Hub. بشكل افتراضي، يقوم IoT Hub بتوجيه القياس عن بعد إلى نقطة نهاية Event Hubs حيث يمكنك استهلاكه. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى نقاط نهاية مختلفة.

يوضح مقتطف التعليمات البرمجية التالي كيفية قراءة القياس عن بعد من نقطة نهاية مراكز الأحداث الافتراضية. يتم أخذ التعليمة البرمجية الموجودة في هذا المقتطف من التشغيل السريع لمركز إنترنت الأشياء إرسال القياس عن بعد من جهاز إلى مركز إنترنت الأشياء وقراءته باستخدام تطبيق خلفي:

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");
    });
}

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز Thermostat IoT أجهزة التوصيل و التشغيل بدون مكون يحتوي على المكون الافتراضي فقط. dt-dataschema تعرض خاصية النظام معرف النموذج:

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}

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز TemperatureController IoT أجهزة التوصيل و التشغيل متعدد المكونات. dt-subject تعرض خاصية النظام اسم المكون الذي أرسل القياس عن بعد. في هذا المثال، المكونان هما thermostat1 وكما thermostat2 هو محدد في نموذج DTDL. dt-dataschema تعرض خاصية النظام معرف النموذج:

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}

قراءة إشعارات التغيير المزدوج للجهاز

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير مزدوجة للجهاز للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Java السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز ترموستات بدون مكون. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Java السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

قراءة إشعارات التغيير الرقمي المزدوج

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير التوأم الرقمي للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Java السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة رقمية لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Java السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة رقمية لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

كما تتوفر الموارد التالية:

أمثلة على عملاء خدمة IoT Hub

يعرض هذا القسم أمثلة جافا سكريبت باستخدام عميل خدمة IoT Hub وفئتي التسجيلوالعميل . يمكنك استخدام فئة التسجيل للتفاعل مع حالة الجهاز باستخدام توائم الجهاز. يمكنك أيضا استخدام فئة التسجيلللاستعلام عن تسجيلات الأجهزة في IoT Hub. يمكنك استخدام فئة العميل لاستدعاء الأوامر على الجهاز. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز. في مقتطفات التعليمات البرمجية، deviceId يحتفظ المتغير بمعرف الجهاز الخاص بجهاز أجهزة التوصيل و التشغيل إنترنت الأشياء المسجل في مركز إنترنت الأشياء.

الحصول على الجهاز المزدوج ومعرف الطراز

للحصول على التوأم للجهاز ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل متصل بمركز إنترنت الأشياء:

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));
  }
}

تحديث الجهاز التوأم

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. توضح العينة كيف تحتاج إلى الحصول على التوأم قبل تحديثه. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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));
      }
    }
  }
}

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. توضح العينة كيف تحتاج إلى الحصول على التوأم قبل تحديثه. يتم تعريف الخاصية في مكون ترموستات1 :

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));
      }
    }
  }
}

بالنسبة لخاصية في مكون، يبدو تصحيح الخاصية مثل المثال التالي:

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

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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));
  }
});

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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));
  }
});

أمثلة على التوأم الرقمي لمركز إنترنت الأشياء

يمكنك استخدام الفئة DigitalTwinClient للتفاعل مع حالة الجهاز باستخدام التوائم الرقمية. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز.

يعرض هذا القسم أمثلة جافا سكريبت باستخدام واجهة برمجة تطبيقات Digital Twins.

digitalTwinId يحتفظ المتغير بمعرف الجهاز الخاص بجهاز IoT أجهزة التوصيل و التشغيل المسجل في مركز إنترنت الأشياء الخاص بك.

احصل على التوأم الرقمي ومعرف الطراز

للحصول على التوأم الرقمي ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل المتصل بمركز إنترنت الأشياء:

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));

تحديث التوأم الرقمي

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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);

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. يتم تعريف الخاصية في مكون ترموستات1 :

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);

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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));

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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));

قراءة القياس عن بعد للجهاز

ترسل أجهزة أجهزة التوصيل و التشغيل إنترنت الأشياء القياس عن بعد المحدد في نموذج DTDL إلى IoT Hub. بشكل افتراضي، يقوم IoT Hub بتوجيه القياس عن بعد إلى نقطة نهاية Event Hubs حيث يمكنك استهلاكه. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى نقاط نهاية مختلفة.

يوضح مقتطف التعليمات البرمجية التالي كيفية قراءة القياس عن بعد من نقطة نهاية مراكز الأحداث الافتراضية. يتم أخذ التعليمة البرمجية الموجودة في هذا المقتطف من التشغيل السريع لمركز إنترنت الأشياء إرسال القياس عن بعد من جهاز إلى مركز إنترنت الأشياء وقراءته باستخدام تطبيق خلفي:

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,
});

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز TemperatureController IoT أجهزة التوصيل و التشغيل متعدد المكونات. dt-subject تعرض خاصية النظام اسم المكون الذي أرسل القياس عن بعد. في هذا المثال، المكونان هما thermostat1 وكما thermostat2 هو محدد في نموذج DTDL. dt-dataschema تعرض خاصية النظام معرف النموذج:

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

قراءة إشعارات التغيير المزدوج للجهاز

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير مزدوجة للجهاز للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة جافا سكريبت السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة JavaScript السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

قراءة إشعارات التغيير الرقمي المزدوج

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير التوأم الرقمي للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة جافا سكريبت السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إعلامات تغيير مزدوجة رقمية لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة JavaScript السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة رقمية لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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

كما تتوفر الموارد التالية:

أمثلة على عملاء خدمة IoT Hub

يعرض هذا القسم أمثلة بايثون باستخدام عميل خدمة IoT Hub وفئتي IoTHubRegistryManagerوCloudToDeviceMethod . يمكنك استخدام الفئة IoTHubRegistryManager للتفاعل مع حالة الجهاز باستخدام توائم الجهاز. يمكنك أيضا استخدام فئة IoTHubRegistryManagerللاستعلام عن تسجيلات الأجهزة في IoT Hub. يمكنك استخدام الفئة CloudToDeviceMethod لاستدعاء الأوامر على الجهاز. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز. في مقتطفات التعليمات البرمجية، device_id يحتفظ المتغير بمعرف الجهاز الخاص بجهاز أجهزة التوصيل و التشغيل إنترنت الأشياء المسجل في مركز إنترنت الأشياء.

الحصول على الجهاز المزدوج ومعرف الطراز

للحصول على التوأم للجهاز ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل متصل بمركز إنترنت الأشياء:

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("")

تحديث الجهاز التوأم

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. توضح العينة كيف تحتاج إلى الحصول على التوأم etag قبل تحديثه. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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)

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. توضح العينة كيف تحتاج إلى الحصول على التوأم ETag قبل تحديثه. يتم تعريف الخاصية في مكون ترموستات1 :

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)

بالنسبة لخاصية في مكون، يبدو تصحيح الخاصية مثل المثال التالي:

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

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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)

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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)

أمثلة على التوأم الرقمي لمركز إنترنت الأشياء

يمكنك استخدام الفئة DigitalTwinClient للتفاعل مع حالة الجهاز باستخدام التوائم الرقمية. يحدد طراز DTDL للجهاز الخصائص والأوامر التي ينفذها الجهاز.

device_id يحتفظ المتغير بمعرف الجهاز الخاص بجهاز IoT أجهزة التوصيل و التشغيل المسجل في مركز إنترنت الأشياء الخاص بك.

احصل على التوأم الرقمي ومعرف الطراز

للحصول على التوأم الرقمي ومعرف الطراز لجهاز IoT أجهزة التوصيل و التشغيل المتصل بمركز إنترنت الأشياء:

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")

تحديث التوأم الرقمي

يوضح مقتطف التعليمات البرمجية التالي كيفية تحديث targetTemperature الخاصية على جهاز. يتم تعريف الخاصية في المكون الافتراضي للجهاز:

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)

يوضح المقتطف التالي كيفية تحديث targetTemperature الخاصية على أحد المكونات. يتم تعريف الخاصية في مكون ترموستات1 :

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)

أمر الاتصال

يوضح المقتطف التالي كيفية استدعاء الأمر المعرف getMaxMinReport في مكون افتراضي:

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")

يوضح المقتطف التالي كيفية استدعاء getMaxMinReport الأمر على أحد المكونات. يتم تعريف الأمر في مكون ترموستات1 :

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")

قراءة القياس عن بعد للجهاز

ترسل أجهزة أجهزة التوصيل و التشغيل إنترنت الأشياء القياس عن بعد المحدد في نموذج DTDL إلى IoT Hub. بشكل افتراضي، يقوم IoT Hub بتوجيه القياس عن بعد إلى نقطة نهاية Event Hubs حيث يمكنك استهلاكه. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى نقاط نهاية مختلفة.

يوضح مقتطف التعليمات البرمجية التالي كيفية قراءة القياس عن بعد من نقطة نهاية مراكز الأحداث الافتراضية. يتم أخذ التعليمة البرمجية الموجودة في هذا المقتطف من التشغيل السريع لمركز إنترنت الأشياء إرسال القياس عن بعد من جهاز إلى مركز إنترنت الأشياء وقراءته باستخدام تطبيق خلفي:

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()

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز Thermostat IoT أجهزة التوصيل و التشغيل بدون مكون يحتوي على المكون الافتراضي فقط. dt-dataschema تعرض خاصية النظام معرف النموذج:

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}

يوضح الإخراج التالي من التعليمة البرمجية السابقة قياس درجة الحرارة عن بعد المرسل بواسطة جهاز TemperatureController IoT أجهزة التوصيل و التشغيل متعدد المكونات. dt-subject تعرض خاصية النظام اسم المكون الذي أرسل القياس عن بعد. في هذا المثال، المكونان هما thermostat1 وكما thermostat2 هو محدد في نموذج DTDL. dt-dataschema تعرض خاصية النظام معرف النموذج:

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}

قراءة إشعارات التغيير المزدوج للجهاز

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير مزدوجة للجهاز للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية السابق ل Python بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز ترموستات بدون مكون. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Python السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة للجهاز لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

قراءة إشعارات التغيير الرقمي المزدوج

يمكنك تكوين IoT Hub لإنشاء إعلامات تغيير التوأم الرقمي للتوجيه إلى نقطة نهاية مدعومة. لمعرفة المزيد، راجع استخدام توجيه رسائل IoT Hub لإرسال رسائل من الجهاز إلى السحابة إلى أحداث مختلفة غير القياس عن بعد لنقاط > النهاية.

تقوم التعليمة البرمجية الموضحة في مقتطف التعليمات البرمجية السابق ل Python بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إشعارات تغيير مزدوجة رقمية لجهاز ترموستات بدون مكونات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

تقوم التعليمة البرمجية الموضحة في مقتطف شفرة Python السابق بإنشاء الإخراج التالي عندما يقوم IoT Hub بإنشاء إعلامات تغيير مزدوجة رقمية لجهاز يحتوي على مكونات. يوضح هذا المثال الإخراج عندما يقوم جهاز مستشعر درجة الحرارة المزود بمكون ترموستات بإنشاء إشعارات. خصائص iothub-message-schema التطبيق وتعطيك opType معلومات حول نوع إعلام التغيير:

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}

الخطوات التالية

الآن بعد أن تعرفت على نمذجة الأجهزة ، إليك بعض الموارد الإضافية: