你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

设置孪生到孪生的事件处理

本文介绍如何在孪生体之间发送事件,以便在更新图中的一个数字孪生体时,图中受此信息影响的相关孪生体可以更新。 此事件处理将帮助你创建完全连接的 Azure 数字孪生图,其中从外部源(如 IoT 中心)到达 Azure 数字孪生的数据将在整个图中传播。

若要设置这种孪生到孪生的事件处理,你将创建一个监视孪生体生命周期事件的 Azure 函数。 该函数识别哪些事件应该影响图中的其他孪生体,并使用事件数据相应地更新受影响的孪生体。

先决条件

若要设置孪生到孪生的处理,需要一个要使用的 Azure 数字孪生实例。 有关如何创建实例的说明,请参阅设置 Azure 数字孪生实例和身份验证。 实例应至少包含两个要在其中发送数据的孪生。

(可选)你可能还想要通过 IoT 中心为孪生设置自动遥测引入。 此过程不需要将数据从孪生体发送到孪生体,但它是完整解决方案的一个重要部分,其中孪生图由实时设备遥测驱动。

将孪生事件发送到终结点

若要设置孪生到孪生的事件处理,请首先在 Azure 数字孪生中创建终结点以及到该终结点的路由。 正在进行更新的孪生将使用路由将有关其更新事件的信息发送到终结点(事件网格稍后可以选取这些事件,并将它们传递给 Azure 函数进行处理)。

创建事件网格主题

事件网格是一项 Azure 服务,可帮助将来自 Azure 服务的事件路由和传递到 Azure 中的其他位置。 你可以创建一个事件网格主题以从源收集特定事件,然后订阅者可以侦听该主题,以便在事件送达时接收事件。

在 Azure CLI 中运行以下命令,以创建事件网格主题:

az eventgrid topic create --resource-group <your-resource-group> --name <name-for-your-event-grid-topic> --location <region>

此命令的输出是已创建的事件网格主题的相关信息。 保存为事件网格主题提供的名称,因为稍后将要使用。

创建终结点

接下来,在 Azure 数字孪生中创建事件网格终结点,该终结点将实例连接到事件网格主题。 使用下方的命令,根据需要填写上一步中事件网格主题的名称和其他占位符字段。

az dt endpoint create eventgrid --dt-name <Azure-Digital-Twins-instance> --eventgrid-resource-group <your-resource-group> --eventgrid-topic <your-event-grid-topic> --endpoint-name <name-for-your-Azure-Digital-Twins-endpoint>

此命令的输出是已创建的终结点的相关信息。

在输出中查找 provisioningState 字段,检查其值是否为“Succeeded”。

Screenshot of the result of the endpoint query in the Cloud Shell of the Azure portal, showing the endpoint with a provisioningState of Succeeded.

它也可能显示“Provisioning”,这意味着仍在创建终结点。 如果是这样,请等待几秒钟,并运行以下命令来检查终结点的状态。 重复此操作,直到 provisioningState 显示“Succeeded”。

az dt endpoint show --dt-name <your-Azure-Digital-Twins-instance> --endpoint-name <your-Azure-Digital-Twins-endpoint> 

保存终结点的名称,稍后需要使用。

创建路由

接下来,创建 Azure 数字孪生路由,以便将事件发送到创建的事件网格终结点。

使用以下 CLI 命令,根据需要填写上一步中终结点的名称和其他占位符字段。 此命令将转发孪生体图中发生的所有事件。

提示

如果需要,可以使用筛选器将事件仅筛选为特定事件。

az dt route create --dt-name <your-Azure-Digital-Twins-instance> --endpoint-name <your-Azure-Digital-Twins-endpoint> --route-name <name-for-your-Azure-Digital-Twins-route>

此命令的输出是一些有关已创建的路由的信息。

注意

必须先完成终结点(来自上一步)的预配工作,然后才能设置使用这些终结点的事件路由。 如果由于终结点未就绪而导致路由创建失败,请等待几分钟,然后重试。

创建 Azure 函数以更新孪生

接下来,创建一个 Azure 函数,该函数将侦听终结点并接收通过路由发送到该终结点的孪生事件。 函数的逻辑应该使用事件信息来确定需要更新哪些其他孪生,然后执行更新。

  1. 首先创建新的 Azure Functions 项目。

    可以使用 Visual Studio(相关说明,请参阅使用 Visual Studio 开发 Azure Functions)、Visual Studio Code(相关说明,请参阅在 Azure 中使用 Visual Studio Code 创建 C# 函数)或 Azure CLI(相关说明,请参阅在 Azure 中从命令行创建 C# 函数)来执行此操作

  2. 将以下包添加到项目(可以使用 Visual Studio NuGet 包管理器,或者使用命令行工具中的 dotnet add package 命令)。

  3. 填写函数的逻辑。 可以在 azure-digital-twins-getting-started 存储库中查看多个方案的示例函数代码,以帮助你入门。

  4. 使用首选方法将函数发布到 Azure。

    若要了解如何使用 Visual Studio 发布函数,请参阅使用 Visual Studio 开发 Azure Functions。 若要了解如何使用 Visual Studio Code 发布函数,请参阅使用 Visual Studio Code 在 Azure 中创建 C# 函数。 若要了解如何使用 Azure CLI 发布函数,请参阅在 Azure 中从命令行创建 C# 函数

完成发布函数过程后,可使用此 Azure CLI 命令来验证发布是否成功。 资源组有占位符、函数应用的名称以及特定函数的名称。 该命令会输出有关函数的信息。

az functionapp function show --resource-group <your-resource-group> --name <your-function-app> --function-name <your-function>

配置函数应用

在函数可以访问 Azure 数字孪生之前,需要实例的一些相关信息以及访问该实例的权限。 在本部分中,为函数分配访问角色并配置应用程序设置,使其能够查找并访问实例。

Azure Cloud Shell本地 Azure CLI 中运行以下命令。

注意

此部分必须由有权管理用户对 Azure 资源的用户访问权限(包括授予和委派权限)的 Azure 用户完成。 满足此要求的常见角色包括“所有者”、“帐户管理员”或“用户访问管理员”和“参与者”的组合。 有关 Azure 数字孪生角色的权限要求的详细信息,请参阅设置实例和身份验证

分配访问角色

Azure 函数需要将持有者令牌传递给它。 为确保传递了持有者令牌,请为函数应用授予 Azure 数字孪生实例的“Azure 数字孪生数据所有者”角色,这将授予函数应用在实例上执行数据平面活动的权限

  1. 使用以下命令为函数创建系统托管标识(如果该函数已有一个,此命令将输出其详细信息)。 记下输出中的 principalId 字段。 你将使用此 ID 来引用函数,以便可以在下一步中授予其权限。

    az functionapp identity assign --resource-group <your-resource-group> --name <your-function-app-name>	
    
  2. 使用以下命令中的 principalId 值为函数赋予 Azure 数字孪生实例的“Azure 数字孪生数据所有者”角色

    az dt role-assignment create --dt-name <your-Azure-Digital-Twins-instance> --assignee "<principal-ID>" --role "Azure Digital Twins Data Owner"
    

配置应用程序设置

接下来,通过为其设置 环境变量 ,使 Azure 数字孪生实例的 URL 可供函数访问。

提示

通过将 https:// 添加到实例主机名的开头,创建 Azure 数字孪生实例的 URL。 若要查看主机名以及实例的所有属性,请运行 az dt show --dt-name <your-Azure-Digital-Twins-instance>

以下命令为实例的 URL 设置环境变量,函数在需要访问实例时将使用该环境变量。

az functionapp config appsettings set --resource-group <your-resource-group> --name <your-function-app-name> --settings "ADT_SERVICE_URL=https://<your-Azure-Digital-Twins-instance-host-name>"

将函数连接到终结点

接下来,将 Azure 函数订阅到先前创建的事件网格终结点。 这将确保数据可以通过事件网格主题从更新的孪生体流向函数,函数可以根据需要使用事件信息更新其他孪生体。

若要订阅 Azure 函数,你将创建一个事件网格订阅,使其将来自你之前创建的事件网格主题的数据发送到 Azure 函数

使用以下 CLI 命令,填写订阅 ID、资源组、函数应用和函数名称的占位符。

az eventgrid event-subscription create --name <name-for-your-event-subscription> --source-resource-id /subscriptions/<subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.EventGrid/topics/<your-event-grid-topic> --endpoint-type azurefunction --endpoint /subscriptions/<subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.Web/sites/<your-function-app-name>/functions/<function-name> 

现在,函数可以通过事件网格主题接收事件。 数据流设置已完成。

测试和验证结果

最后一步是验证流是否正常工作,方法是更新孪生并检查相关孪生是否根据 Azure 函数中的逻辑进行更新。

若要启动该过程,请更新作为事件流源的孪生。 可以使用 Azure CLIAzure 数字孪生 SDKAzure 数字孪生 REST API 进行更新。

接下来,查询相关孪生的 Azure 数字孪生实例。 可以使用 Azure CLIAzure 数字孪生 REST API 和 SDK。 验证孪生是否收到数据并按预期更新。

后续步骤

在本文中,你在 Azure 数字孪生中设置了孪生到孪生的事件处理。 接下来,设置一个 Azure 函数,根据来自 IoT 中心设备的传入遥测自动触发此流:从 IoT 中心传入遥测