Azure Digital Twins入门 - 使用Azure Function + Event Grid将数据输出
分类: Azure物联网 ◆ 标签: #Azure # #Digitial Twin ◆ 发布于: 2023-06-15 20:39:46

我们前面学习了如何使用Azure function
+ Azure IoT Hub
将具体的设备和它的Digital Twins
联系起来,并且使用Event
+ Azure function
作为Azure Digital Twins
的数据输入,我们本节使用EventGrid
+ Azure Function
将数据导出。
创建和设置EventGrid
我们登录到Azure Portal
之后,在marketplace
里搜索Event Grid Topic
, 并创建它,创建好了之后,回到Azure Digital Twins
, 按照如下图来设置Endpoint
, 选取Event Grid
, 并指定我们刚刚创建的Event Grid
。
创建了指定Endpoint
了之后,按照如下的图来配置Event Route
:
然后在指定的对话框里选择合适的事件:
您可以发现这里可以选择您自己关系的事件。
需要注意的是,我们配置这个部分是已经将Azure Digital Twins
的相关事件委托给Event Grid
来了,要处理这些事件,并对这些事件做出反应,我们仍然需要Azure Function
, 因此接下来我们需要配置Event Grid
的输出到Azure Function
, 在Azure Portal
里找到Event Grid Topic
的资源之后,按照如下的步骤来配置:
然后配置界面上可以这样选:
然后在出现的界面上选择Azure function
,并设置好就可以了。
编写Function
代码
使用Visual Studio
创建基于Azure funciton
的项目,向这个项目添加一个Function
, 然后使用如下的代码来替代:
using Azure; using Azure.Core.Pipeline; using Azure.DigitalTwins.Core; using Azure.Identity; using Azure.Messaging.EventGrid; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.EventGrid; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Net.Http; using System.Threading.Tasks; namespace SampleFunctionsApp { public static class ProcessDTRoutedData { private static readonly HttpClient httpClient = new HttpClient(); //需要在Azure function的配置里添加环境变量:ADT_SERVICE_URL private static string adtServiceUrl = Environment.GetEnvironmentVariable("ADT_SERVICE_URL"); [FunctionName("ProcessDTRoutedData")] public static async Task Run([EventGridTrigger] EventGridEvent eventGridEvent, ILogger log) { log.LogInformation("Start execution"); DigitalTwinsClient client; try { //请参考之前文章中是如何在function App启用System Managed Identity, 并从ADT实例中赋予角色的。 var credentials = new DefaultAzureCredential(); client = new DigitalTwinsClient(new Uri(adtServiceUrl), credentials, new DigitalTwinsClientOptions { Transport = new HttpClientTransport(httpClient) }); log.LogInformation("ADT service client connection created."); } catch (Exception e) { log.LogError($"ADT service client connection failed. {e}"); return; } if (client != null) { if (eventGridEvent != null && eventGridEvent.Data != null) { string twinId = eventGridEvent.Subject.ToString(); JObject message = (JObject)JsonConvert.DeserializeObject(eventGridEvent.Data.ToString()); log.LogInformation($"Reading event from {twinId}: {eventGridEvent.EventType}: {message["data"]}"); string parentId = await AdtUtilities.FindParentAsync(client, twinId, "contains", log); if (parentId != null) { // Read properties which values have been changed in each operation foreach (var operation in message["data"]["patch"]) { string opValue = (string)operation["op"]; if (opValue.Equals("replace")) { string propertyPath = ((string)operation["path"]); if (propertyPath.Equals("/Temperature")) { await AdtUtilities.UpdateTwinPropertyAsync(client, parentId, propertyPath, operation["value"].Value<float>(), log); } } } } } } } } }
部署Azure function
之后,即可观察到Azure Digital Twins
的一些事件被捕捉,并通过Event Grid
复制到Azure function
中,并反向反馈给Azure Digital Twins
的实例。