Skip to main content

Azure Digital Twins入门 - 使用SDK操作Azure Digital Twins实例

分类:  Azure物联网 标签:  #Azure # #Digitial Twin 发布于: 2023-06-15 20:29:58

前一节我们学习了如何使用Azure Cli扩展工具来创建和管理模型以及digital tiws, 我们本节使用Azure SDK通过代码来完成同样的工作。

我们整个演示使用如下的步骤:

  • 确定数字化的目标清单
  • 制作数字化模型
  • 使用Azure Digital Twins Explorer工具来创建Digital TwinRelatioonship关系映射,Twin Graph
  • 使用Azure Cli IoT扩展来创建Digital TwinRelationship关系映射, Twin Graph
  • 使用.Net SDK来创建Digital TwinRelationShip关系映射,Twin Graph
  • 链接Azure Digital Twins ExplorerAzure IoT Hub, 映射实际的IoT设备
  • 结合Azure IoT Hub Device Provisioning Service自动管理设备
  • 结合Event hubAzure Function链接输出数据。

本节主要学习如何使用Azure SDK代码来上传我们之前创建的数字模型,创建Digital TwinRelationship关系映射,Twin Graph

关于如何安装Azure Cli和基本的配置,您可以参考文档:<>

如果你还没有创建数字模型,您可以参考链接创建我们需要的数字模型:<>

请先确定我们目前已经拥有了四个数字模型文件,以及Azure Cli已经登录,模型文件列表如下:

  • FactoryModel.json
  • PoolModel.json
  • PHValueSensor.json
  • TemperatorSensor.json

准备Azure Cli的环境

您可以通过如下的命令快速的准备好Azure Cli的环境:

$ az cloud list -o table
IsActive    Name               Profile
----------  -----------------  ---------
False       AzureCloud         latest
True        AzureChinaCloud    latest
False       AzureUSGovernment  latest
False       AzureGermanCloud   latest

$ az cloud set --name AzureChinaCloud

$ az login

$ az account list -o table

 $ az account set --subscription <Your Subscription id>

至此您应该已经拥有了Azure Cli的环境了。

创建项目

使用如下的命令创建项目:

dotnet new console Demo
cd Demo

然后将文件:

  • FactoryModel.json
  • PoolModel.json
  • PHValueSensor.json
  • TemperatorSensor.json

拷贝到Demo目录下

安装必要的包:

dotnet add package Azure.DigitalTwins.Core
dotnet add package Azure.Identity

使用编辑器打开当前目录,例如VS Code

使用认证连接ADT实例

打开文件Program.cs, 先添加引用包:

using Azure.DigitalTwins.Core;
using Azure.Identity;
using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
using Azure;
using System.Text.Json;

使用默认的认证方式连接至ADT实例:

string adtInstanceUrl = "https://hongweidigitaltwindemo.api.ce2.digitaltwins.azure.cn";
var credential = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);

Console.WriteLine($"客户端准备完毕!");

保存后运行dotnet run, 查看效果

上传数字模型

确保之前定义的模型文件已经拷贝到了当前目录,使用如下的代码上传数字模型:

Console.WriteLine();

Console.WriteLine("上传数字模型:");

string factoryDTDL = File.ReadAllText("FactoryModel.json");
string poolDTDL = File.ReadAllText("PoolModel.json");
string phValueDTDL = File.ReadAllText("PHValueSensor.json");
string temperatorDTDL = File.ReadAllText("TemperatorSensor.json");

var models = new List<string> { factoryDTDL, poolDTDL, phValueDTDL, temperatorDTDL };

try
{

    await client.CreateModelsAsync(models);
    Console.WriteLine("模型上传成功!");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"上传模型错误: {ex.Status}: {ex.Message}");
}

//从实例中读出模型,展示已经上传的模型:

Console.WriteLine();
Console.WriteLine("浏览已经上传的模型:");
AsyncPageable<DigitalTwinsModelData> modelDataList = client.GetModelsAsync();

await foreach (DigitalTwinsModelData md in modelDataList)
{
    Console.WriteLine($"Model: {md.Id}");
}

保存后运行代码dotnet run, 您也可以使用ADT Explorere工具来查看上传的效果:


创建模型Twin

上传数字模型结束后,我们使用如下代码来创建数字模型的twin

注意
我们这里仅仅只给出了部分代码,您可以模仿代码完全所有的twin创建。

//我们开始创建Digital Twin了,请根据模型的ID。刚刚上述的代码已经打印模型的id。
//先创建factory的twin
Console.WriteLine("开始创建工厂模型的数字Twins 1");
var factoryTwinData = new BasicDigitalTwin();
factoryTwinData.Metadata.ModelId = "dtmi:com:example:FactoryModel;1";
factoryTwinData.Contents.Add("FactoryName", "factory-1");
factoryTwinData.Contents.Add("CityName", "Shanghai");
factoryTwinData.Contents.Add("FactoryCode", "factory-1");
factoryTwinData.Contents.Add("MyCategory", "test1");
factoryTwinData.Contents.Add("PoolNumber", 2);
factoryTwinData.Id = "factory-1";

try
{

    await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(factoryTwinData.Id,
    factoryTwinData);

    Console.WriteLine("开始创建工厂模型的数字Twins成功");


}
catch (RequestFailedException ex)
{
    Console.WriteLine($"创建Twin失败: {ex.Status}: {ex.Message}");

}


Console.WriteLine("开始创建工厂模型的数字Twins 2 ");
var factoryTwinData2 = new BasicDigitalTwin();
factoryTwinData2.Metadata.ModelId = "dtmi:com:example:FactoryModel;1";
factoryTwinData2.Contents.Add("FactoryName", "factory-2");
factoryTwinData2.Contents.Add("CityName", "Beijing");
factoryTwinData2.Contents.Add("FactoryCode", "factory-2");
factoryTwinData2.Contents.Add("MyCategory", "test2");
factoryTwinData2.Contents.Add("PoolNumber", 2);
factoryTwinData2.Id = "factory-2";

try
{

    await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(factoryTwinData2.Id,
    factoryTwinData2);

    Console.WriteLine("开始创建工厂模型的数字Twins 2 成功");


}
catch (RequestFailedException ex)
{
    Console.WriteLine($"创建Twin失败: {ex.Status}: {ex.Message}");

}

Console.WriteLine("开始创建Pool模型的数字Twins");

var poolTwinData = new BasicDigitalTwin();
poolTwinData.Metadata.ModelId = "dtmi:com:example:PoolModel;1";
poolTwinData.Contents.Add("PoolName", "pool-1");
poolTwinData.Contents.Add("PoolCode", "pool-1");
poolTwinData.Id = "pool-1";



try
{

    await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(poolTwinData.Id,
    poolTwinData);

    Console.WriteLine("pool-1 成功");


}
catch (RequestFailedException ex)
{
    Console.WriteLine($"创建Twin失败: {ex.Status}: {ex.Message}");

}

创建完成之后,您可以使用如下ADT工具查看:


创建关系映射

使用如下的代码创建关系映射

//开始创建两个twin之间的关系:

var relationship = new BasicRelationship 
{
    TargetId = "pool-1",
    Name = "rel_has_pools"
};

string relId = "factory-1-has-pool-1";

try 
{

await client.CreateOrReplaceRelationshipAsync("factory-1", relId, relationship);
Console.WriteLine("创建关系成功!");

} catch ( RequestFailedException ex )
{
    Console.WriteLine($"创建关系失败: {ex.Status}: {ex.Message}");
}

查询ADT

使用如下的代码查询:

//查询
string query = "select * from digitaltwins";

AsyncPageable<BasicDigitalTwin> queryResult = client.QueryAsync<BasicDigitalTwin>(query);

await foreach (BasicDigitalTwin twin in queryResult )
{
    Console.WriteLine(JsonSerializer.Serialize(twin));
    Console.WriteLine("---------------------------------");
}

至此我们结束了演示了,请继续关注我们接下来的演示。