使用 Azure 资源管理器模板创建 IoT 中心 (.NET)

可以使用 Azure 资源管理器以编程方式创建和管理 Azure IoT 中心。 本教程介绍如何使用 Azure Resource Manager 模板通过 C# 程序创建 IoT 中心。

Note

Azure 提供了用于创建和使用资源的两个不同部署模型:Azure Resource Manager 模型和经典模型。 本文介绍了如何使用 Azure Resource Manager 部署模型。

要完成本教程,需要以下各项:

  • Visual Studio 2015 或 Visual Studio 2017。
  • 有效的 Azure 帐户。
    如果没有帐户,只需花费几分钟就能创建一个 帐户
  • 可用于存储 Azure Resource Manager 模板文件的 Azure 存储帐户
  • Azure PowerShell 1.0 或更高版本。

准备对 Azure Resource Manager 请求进行身份验证

必须使用 Azure Resource Manager 配合 Azure Active Directory (AD) 来验证所有针对资源执行的操作。 最简单的配置方式是使用 PowerShell 或 Azure CLI。

在继续之前,请安装 Azure PowerShell cmdlet

以下步骤说明如何使用 PowerShell 设置 AD 应用程序的密码身份验证。 可以在标准 PowerShell 会话中运行这些命令。

  1. 使用以下命令登录到 Azure 订阅:

    Login-AzureRmAccount -Environment $(Get-AzureRmEnvironment -Name AzureChinaCloud)
    
  2. 如果你有多个 Azure 订阅,则访问 Azure 即有权访问与凭据关联的所有 Azure 订阅。 使用以下命令,列出可供使用的 Azure 订阅:

    Get-AzureRMSubscription
    

    使用以下命令,选择想要用于运行命令以管理 IoT 中心的订阅。 可使用上一命令输出中的订阅名称或 ID:

    Select-AzureRMSubscription `
        -SubscriptionName "{your subscription name}"
    
  3. 记下 TenantIdSubscriptionId。 稍后会需要它们。

  4. 使用以下命令并替换占位符,以创建新的 Azure Active Directory 应用程序:

    • {Display name}:应用程序的显示名称,例如 MySampleApp
    • {Home page URL}:应用主页的 URL,例如 http://mysampleapp/home。 此 URL 不需要指向实际的应用程序。
    • {Application identifier}:唯一标识符,例如 http://mysampleapp。 此 URL 不需要指向实际的应用程序。
    • {Password}:用于向应用进行身份验证的密码。

      New-AzureRmADApplication -DisplayName {Display name} -HomePage {Home page URL} -IdentifierUris {Application identifier} -Password {Password}
      
  5. 请记下创建的应用程序的 ApplicationId。 稍后会需要它。
  6. 使用以下命令(将 {MyApplicationId} 替换为上一步骤中的 ApplicationId)创建新的服务主体:

    New-AzureRmADServicePrincipal -ApplicationId {MyApplicationId}
    
  7. 使用以下命令(将 {MyApplicationId} 替换为 ApplicationId)设置角色分配。

    New-AzureRmRoleAssignment -RoleDefinitionName Owner -ServicePrincipalName {MyApplicationId}
    

现在,已创建可从自定义 C# 应用程序进行身份验证的 Azure AD 应用程序。 在本教程的后续内容中,需要用到以下值:

  • TenantId
  • SubscriptionId
  • ApplicationId
  • 密码

准备 Visual Studio 项目

  1. 在 Visual Studio 中,使用“控制台应用(.NET Framework)”项目模板创建 Visual C# Windows 经典桌面项目。 将项目命名为 CreateIoTHub
  2. 在解决方案资源管理器中右键单击用户的项目,并单击“管理 NuGet 包”。
  3. 在 NuGet 包管理器中,选中“包括预发行版”,并在“浏览”页上搜索 Microsoft.Azure.Management.ResourceManager。 选择该包,单击“安装”,在“审阅更改”中单击“确定”,并单击“我接受”以接受许可证。
  4. 在 NuGet 包管理器中,搜索 Microsoft.IdentityModel.Clients.ActiveDirectory。 单击“安装”,在“审阅更改”中单击“确定”,并单击“我接受”以接受许可证。
  5. 在 Program.cs 中,将现有 using 语句替换为以下代码:

    using System;
    using Microsoft.Azure.Management.ResourceManager;
    using Microsoft.Azure.Management.ResourceManager.Models;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    using Microsoft.Rest;
    
  6. 在 Program.cs 中,将占位符值替换为以下静态变量。 在本教程前面的介绍中,已记下 ApplicationIdSubscriptionIdTenantIdPasswordYour Azure Storage account name 是要在其中存储 Azure 资源管理器模板文件的 Azure 存储帐户的名称。 资源组名称是创建 IoT 中心时要使用的资源组名称。 名称可以是现有的资源组或新资源组。 部署名称是部署的名称,例如 Deployment_01

    static string applicationId = "{Your ApplicationId}";
    static string subscriptionId = "{Your SubscriptionId}";
    static string tenantId = "{Your TenantId}";
    static string password = "{Your application Password}";
    static string storageAddress = "https://{Your storage account name}.blob.core.chinacloudapi.cn";
    static string rgName = "{Resource group name}";
    static string deploymentName = "{Deployment name}";
    

获取 Azure Resource Manager 令牌

Azure Active Directory 必须使用 Azure Resource Manager 来验证所有针对资源执行的任务。 此处显示的示例使用密码身份验证。有关其他方法,请参阅对 Azure Resource Manager 请求进行身份验证

  1. 将以下代码添加到 Program.cs 中的 Main 方法,以使用应用程序 ID 和密码从 Azure AD 中检索令牌。

    var authContext = new AuthenticationContext(string.Format  
      ("https://login.chinacloudapi.cn/{0}", tenantId));
    var credential = new ClientCredential(applicationId, password);
    AuthenticationResult token = authContext.AcquireTokenAsync
      ("https://management.core.chinacloudapi.cn/", credential).Result;
    
    if (token == null)
    {
      Console.WriteLine("Failed to obtain the token");
      return;
    }
    
  2. 创建一个 ResourceManagementClient 对象,该对象通过在 Main 方法的末尾添加以下代码来使用令牌:

    var creds = new TokenCredentials(token.AccessToken);
    var client = new ResourceManagementClient(creds);
    client.SubscriptionId = subscriptionId;
    
  3. 创建或获取对你使用的资源组的引用:

    var rgResponse = client.ResourceGroups.CreateOrUpdate(rgName,
        new ResourceGroup("East US"));
    if (rgResponse.Properties.ProvisioningState != "Succeeded")
    {
      Console.WriteLine("Problem creating resource group");
      return;
    }
    

提交模板以创建 IoT 中心

使用 JSON 模板和参数文件在资源组中创建 IoT 中心。 还可以使用 Azure Resource Manager 模板更改现有 IoT 中心。

  1. 在解决方案资源管理器中右键单击用户的项目,单击“添加”,并单击“新建项”。 将名为 template.json 的 JSON 文件添加到项目。

  2. 若要在中国东部区域中添加一个标准 IoT 中心,请将“template.json”的内容替换为以下资源定义。 有关支持 IoT 中心的区域的最新列表,请参阅 Azure 状态

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "hubName": {
          "type": "string"
        }
      },
      "resources": [
      {
        "apiVersion": "2016-02-03",
        "type": "Microsoft.Devices/IotHubs",
        "name": "[parameters('hubName')]",
        "location": "China East",
        "sku": {
          "name": "S1",
          "tier": "Standard",
          "capacity": 1
        },
        "properties": {
          "location": "China East"
        }
      }
      ],
      "outputs": {
        "hubKeys": {
          "value": "[listKeys(resourceId('Microsoft.Devices/IotHubs', parameters('hubName')), '2016-02-03')]",
          "type": "object"
        }
      }
    }
    
  3. 在解决方案资源管理器中右键单击项目,单击“添加”,然后单击“新建项”。 将名为 parameters.json 的 JSON 文件添加到项目。
  4. parameters.json 的内容替换为以下参数信息,以便将新 IoT 中心的名称设置为 {your initials}mynewiothub。 IoT 中心名称必须全局唯一,因此,应包含姓名或姓名首字母缩写:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "hubName": { "value": "mynewiothub" }
      }
    }
    

    Important

    IoT 中心将公开为 DNS 终结点,因此,命名时请务必避免包含任何敏感信息。

  5. 服务器资源管理器中,连接到 Azure 订阅,并在 Azure 存储帐户中创建名为 templates 的容器。 在“属性”面板中,将 templates 容器的“公共读取访问权限”权限设置为“Blob”。

  6. 在“服务器资源管理器”中,右键单击 templates 容器,并单击“查看 Blob 容器”。 单击“上传 Blob”按钮,选择“parameters.json”和“templates.json”这两个文件,并单击“打开”,将 JSON 文件上传到 templates 容器。 包含 JSON 数据的 Blob 的 URL 如下:

    https://{Your storage account name}.blob.core.chinacloudapi.cn/templates/parameters.json
    https://{Your storage account name}.blob.core.chinacloudapi.cn/templates/template.json
    
  7. 将以下方法添加到 Program.cs:

    static void CreateIoTHub(ResourceManagementClient client)
    {
    
    }
    
  8. CreateIoTHub 方法中添加以下代码,向 Azure Resource Manager 提交模板和参数文件:

    var createResponse = client.Deployments.CreateOrUpdate(
        rgName,
        deploymentName,
        new Deployment()
        {
          Properties = new DeploymentProperties
          {
            Mode = DeploymentMode.Incremental,
            TemplateLink = new TemplateLink
            {
              Uri = storageAddress + "/templates/template.json"
            },
            ParametersLink = new ParametersLink
            {
              Uri = storageAddress + "/templates/parameters.json"
            }
          }
        });
    
  9. CreateIoTHub 方法中添加以下代码,显示新 IoT 中心的状态和密钥:

    string state = createResponse.Properties.ProvisioningState;
    Console.WriteLine("Deployment state: {0}", state);
    
    if (state != "Succeeded")
    {
      Console.WriteLine("Failed to create iothub");
    }
    Console.WriteLine(createResponse.Properties.Outputs);
    

完成并运行应用程序

现在,可以调用 CreateIoTHub 方法来完成应用程序,并生成并运行该应用程序。

  1. 将以下代码添加到 Main 方法末尾:

    CreateIoTHub(client);
    Console.ReadLine();
    
  2. 单击“生成”,并单击“生成解决方案”。 更正所有错误。
  3. 单击“调试”,并单击“开始调试”以运行应用程序。 运行部署可能需要几分钟时间。

  4. 若要验证应用程序是否添加了新的 IoT 中心,请访问 Azure 门户并查看资源列表。 或者,使用 Get-azurermresource PowerShell cmdlet。

Note

本示例应用程序会添加用于对你计费的 S1 标准 IoT 中心。 可以通过 Azure 门户 删除该 IoT 中心,或者在完成后使用 Remove-AzureRmResource PowerShell cmdlet。

后续步骤

现在,已使用 Azure Resource Manager 模板和 C# 程序部署了一个 IoT 中心,接下来可以进一步进行探索:

若要详细了解如何开发 IoT 中心,请参阅以下文章:

若要进一步探索 IoT 中心的功能,请参阅: