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 Twin
、Relatioonship
关系映射,Twin Graph
- 使用
Azure Cli IoT
扩展来创建Digital Twin
,Relationship
关系映射,Twin Graph
- 使用
.Net SDK
来创建Digital Twin
,RelationShip
关系映射,Twin Graph
- 链接
Azure Digital Twins Explorer
到Azure IoT Hub
, 映射实际的IoT
设备 - 结合
Azure IoT Hub Device Provisioning Service
自动管理设备 - 结合
Event hub
和Azure Function
链接输出数据。
本节主要学习如何使用Azure SDK
代码来上传我们之前创建的数字模型,创建Digital Twin
, Relationship
关系映射,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("---------------------------------"); }
至此我们结束了演示了,请继续关注我们接下来的演示。