使用资源提供程序 REST API 创建 IoT 中心 (.NET)

可以通过编程方式使用 IoT 中心资源提供程序 REST API 创建和管理 Azure IoT 中心。 本教程介绍如何使用 IoT 中心资源提供程序 REST API 通过 C# 程序创建 IoT 中心。

备注

本文已经过更新,以便使用 Azure Az PowerShell 模块。 若要与 Azure 交互,建议使用的 PowerShell 模块是 Az PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

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

  • Visual Studio。

  • 有效的 Azure 帐户。
    如果没有帐户,只需花费几分钟就能创建一个帐户

  • Azure PowerShell 1.0 或更高版本。

准备对 Azure 资源管理器请求进行身份验证

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

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

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

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

    Connect-AzAccount -Environment AzureChinaCloud
    
  2. 如果有多个 Azure 订阅,则访问 Azure 即有权访问与凭据关联的所有 Azure 订阅。 使用以下命令,列出可供使用的 Azure 订阅:

    Get-AzSubscription
    

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

    Select-AzSubscription `
        -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}:用于向应用进行身份验证的密码。

      $SecurePassword=ConvertTo-SecureString {password} –asplaintext –force
      New-AzADApplication -DisplayName {Display name} -HomePage {Home page URL} -IdentifierUris {Application identifier} -Password $SecurePassword
      
  5. 请记下创建的应用程序的 ApplicationId。 稍后会需要它。

  6. 使用以下命令(将 {MyApplicationId} 替换为上一步骤中的 ApplicationId)创建新的服务主体:

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

    New-AzRoleAssignment -RoleDefinitionName Owner -ServicePrincipalName {MyApplicationId}
    

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

  • TenantId
  • SubscriptionId
  • ApplicationId
  • 密码

准备 Visual Studio 项目

  1. 在 Visual Studio 中,使用“控制台应用(.NET Framework)”项目模板创建 Visual C# Windows 经典桌面项目。 将该项目命名为 CreateIoTHubREST

  2. 在解决方案资源管理器中右键单击项目,然后单击“管理 NuGet 包”。

  3. 在 NuGet 包管理器中,选中“包括预发行版”,并在“浏览”页上搜索 Microsoft.Azure.Management.ResourceManager。 选择该包,单击“安装”,在“审阅更改”中单击“确定”,并单击“我接受”以接受许可证。

  4. 在 NuGet 包管理器中,搜索 Microsoft.IdentityModel.Clients.ActiveDirectory。 单击“安装”,在“审阅更改”中单击“确定”,并单击“我接受”以接受许可证。

  5. 在 Program.cs 中,将现有 using 语句替换为以下代码:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using Microsoft.Azure.Management.ResourceManager;
    using Microsoft.Azure.Management.ResourceManager.Models;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    using Newtonsoft.Json;
    using Microsoft.Rest;
    using System.Linq;
    using System.Threading;
    
  6. 在 Program.cs 中,将占位符值替换为以下静态变量。 在本教程前面的介绍中,已记下 ApplicationIdSubscriptionIdTenantIdPassword。 资源组名称是创建 IoT 中心时要使用的资源组名称。 可以使用现有的资源组或新资源组。 “IoT 中心名称”是你创建的 IoT 中心的名称,例如“MyIoTHub”。 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 rgName = "{Resource group name}";
    static string iotHubName = "{IoT Hub name including your initials}";
    

    重要

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

获取 Azure 资源管理器令牌

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

  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.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;
    client.BaseUri = new Uri("https://management.chinacloudapi.cn/");
    
  3. 创建或获取对正在使用的资源组的引用:

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

使用资源提供程序 REST API 创建 IoT 中心

使用 IoT 中心资源提供程序 REST API 在资源组中创建 IoT 中心。 还可以使用资源提供程序 REST API 更改现有的 IoT 中心。

  1. 将以下方法添加到 Program.cs:

    static void CreateIoTHub(string token)
    {
    
    }
    
  2. 将以下代码添加到 CreateIoTHub 方法中。 该代码使用标头中的身份验证令牌创建 HttpClient 对象:

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    
  3. 将以下代码添加到 CreateIoTHub 方法中。 此代码描述要创建的 IoT 中心,并生成 JSON 表示形式。 有关支持 IoT 中心的位置的最新列表,请参阅 Azure 状态

    var description = new
    {
      name = iotHubName,
      location = "China East",
      sku = new
      {
        name = "S1",
        tier = "Standard",
        capacity = 1
      }
    };
    
    var json = JsonConvert.SerializeObject(description, Formatting.Indented);
    
  4. 将以下代码添加到 CreateIoTHub 方法中。 使用此代码将 REST 请求提交到 Azure。 然后该代码会检查响应,并检索可用于监视部署任务状态的 URL:

    var content = new StringContent(JsonConvert.SerializeObject(description), Encoding.UTF8, "application/json");
    var requestUri = string.Format("https://management.chinacloudapi.cn/subscriptions/{0}/resourcegroups/{1}/providers/Microsoft.devices/IotHubs/{2}?api-version=2016-02-03", subscriptionId, rgName, iotHubName);
    var result = client.PutAsync(requestUri, content).Result;
    
    if (!result.IsSuccessStatusCode)
    {
      Console.WriteLine("Failed {0}", result.Content.ReadAsStringAsync().Result);
      return;
    }
    
    var asyncStatusUri = result.Headers.GetValues("Azure-AsyncOperation").First();
    
  5. 将以下代码添加到 CreateIoTHub 方法的末尾。 该代码使用上一个步骤中检索的 asyncStatusUri 地址来等待部署完成:

    string body;
    do
    {
      Thread.Sleep(10000);
      HttpResponseMessage deploymentstatus = client.GetAsync(asyncStatusUri).Result;
      body = deploymentstatus.Content.ReadAsStringAsync().Result;
    } while (body == "{\"status\":\"Running\"}");
    
  6. 将以下代码添加到 CreateIoTHub 方法的末尾。 此代码检索创建的 IoT 中心的键,并将其打印到控制台:

    var listKeysUri = string.Format("https://management.azure.cn/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Devices/IotHubs/{2}/IoTHubKeys/listkeys?api-version=2016-02-03", subscriptionId, rgName, iotHubName);
    var keysresults = client.PostAsync(listKeysUri, null).Result;
    
    Console.WriteLine("Keys: {0}", keysresults.Content.ReadAsStringAsync().Result);
    

完成并运行应用程序

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

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

    CreateIoTHub(token.AccessToken);
    Console.ReadLine();
    
  2. 单击“生成”,并单击“生成解决方案”。 更正所有错误。

  3. 单击“调试”,并单击“开始调试”以运行应用程序。 运行部署可能需要几分钟时间。

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

备注

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

后续步骤

现在,已使用资源提供程序 REST API 部署了一个 IoT 中心,接下来可以进一步进行探索:

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

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