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

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

Note

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

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

  • Visual Studio 2015 或 Visual Studio 2017。
  • 有效的 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 经典桌面项目。 将该项目命名为 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}";
    

    Important

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

获取 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;
    }
    

使用资源提供程序 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.chinacloudapi.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-azurermresource PowerShell cmdlet。

Note

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

后续步骤

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

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

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