控制连接到 IoT 中心的设备 (Android)

在本快速入门中,会使用直接方法来控制连接到 Azure IoT 中心的模拟设备。 IoT 中心是一项 Azure 服务,使你可以从云管理 IoT 设备,并将大量设备遥测引入云进行存储或处理。 可使用直接方法远程更改连接到 IoT 中心的设备的行为。 本快速入门使用两个应用程序:一个是模拟设备应用程序,用于响应从后端服务应用程序调用的直接方法;另一个是服务应用程序,用于在 Android 设备上调用直接方法。

先决条件

可以使用本地 Azure CLI。

  • 如果需要,请安装 Azure CLI 来运行 CLI 参考命令。

  • 本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 通过使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

注意

本文使用最新版本的 Azure IoT 扩展(称为 azure-iot)。 旧版本称为 azure-cli-iot-ext。只应同时安装有一个版本。 可以使用命令 az extension list 来验证当前安装的扩展。

使用 az extension remove --name azure-cli-iot-ext 可删除扩展的旧版本。

使用 az extension add --name azure-iot 可添加扩展的新版本。

若要查看已安装了哪些扩展,请使用 az extension list

创建 IoT 中心

如果已完成上一快速入门:将遥测数据从设备发送到 IoT 中心,则可跳过此步骤,使用已创建的 IoT 中心。

此部分介绍如何使用 Azure 门户创建 IoT 中心。

  1. 登录 Azure 门户

  2. 在 Azure 主页上,选择“+ 创建资源”按钮。

  3. 在“类别”菜单中选择“物联网”,然后选择“IoT 中心”。

  4. 在“基本信息”选项卡上,按如下所示填写字段:

    重要

    由于 IoT 中心将作为 DNS 终结点公开可发现,因此请务必避免在命名它时输入任何敏感信息或个人身份信息。

    属性
    订阅 选择要用于中心的订阅。
    资源组 选择一个资源组或新建一个资源组。 若要新建资源组,请选择“新建”并填写要使用的名称。
    IoT 中心名称 输入中心的名称。 此名称必须全局唯一,长度介于 3 到 50 个字母数字字符之间。 名称还可以包含短破折号 ('-') 字符。
    区域 选择离你最近的地区,也就是你希望中心所在的位置。 某些功能(如 IoT 中心设备流)仅适用于特定区域。 对于这些受限功能,你必须选择受支持的区域之一。
    选择要用于中心的层。 根据你需要多少功能以及每天通过解决方案发送多少消息来选择层。

    免费层适用于测试和评估。 如果是免费层,则可将 500 台设备连接到中心,每天最多可传输 8,000 条消息。 每个 Azure 订阅可以在免费层中创建一个 IoT 中心。

    若要比较每个层可使用的功能,请选择“比较层”。 有关详细信息,请参阅选择适用于解决方案的 IoT 中心层
    每日消息数量限制 为中心选择消息的每日最大配额。 可用选项取决于为中心选择的层。 若要查看可用的消息传送和定价选项,请选择“查看所有选项”,然后选择最符合中心需求的选项。 有关详细信息,请参阅 IoT 中心配额和限制

    Screen capture that shows how to create an IoT hub in the Azure portal.

  5. 在完成时选择“下一步:网络”,继续创建中心。

  6. 在“网络”选项卡上填写字段,如下所示:

    属性
    连接配置 选择设备可以用来连接到 IoT 中心的终结点。 本例接受默认设置“公共终结点”。 可以在创建 IoT 中心后更改此设置。 有关详细信息,请参阅管理 IoT 中心的公用网络访问

    Screen capture that shows how to choose the endpoints that can connect to a new IoT hub.

  7. 在完成时选择“下一步:管理”,继续创建中心。

    Screen capture that shows how to set the role-based access control and scale for a new IoT hub.

    可在此处接受默认设置。 如果需要,可以修改以下任何字段:

    • 定价和缩放层级:根据你需要多少功能以及每天通过解决方案发送多少消息来选择层级。 免费层适用于测试和评估。 如果是免费层,则可将 500 台设备连接到中心,每天最多可传输 8,000 条消息。 每个 Azure 订阅可以在免费层中创建一个 IoT 中心。 有关其他层级选项的详细信息,请参阅选择合适的 IoT 中心层级

      如果你正在按照快速入门进行操作,请选择免费层级。

    • IoT 中心单位:每日每单位允许的消息数取决于中心的定价层。 例如,如果希望中心支持 700,000 条消息引入,请选择两个 S1 层单位。

    • 基于角色的访问控制:此属性决定如何管理对 IoT 中心的访问。 允许共享访问策略或仅选择基于角色的访问控制。 有关详细信息,请参阅使用 Azure Active Directory 控制对 IoT 中心的访问

    • 设备到云的分区:此属性会将设备到云的消息与这些消息的同步读取器的数量关联起来。 大多数中心只需要 4 个分区。

    注意

    所示价格仅用作示例。

  8. 在完成时选择“下一步:标记”继续到下一屏幕。

    标记是名称/值对。 可以为多个资源和资源组分配相同的标记,以便对资源进行分类并合并计费。 在本文档中,不会添加任何标记。 有关详细信息,请参阅使用标记来组织 Azure 资源

    Screen capture that shows how to assign tags for a new IoT hub.

  9. 在完成时选择“下一步:查看+创建”可查看选择。

  10. 选择“创建”,以启动新中心的部署。 创建中心时,部署将持续几分钟。 部署完成后,选择“转到资源”以打开新的中心。

注册设备

如果已完成上一快速入门:将遥测数据从设备发送到 IoT 中心,则可跳过此步骤,使用在上一快速入门中注册的设备。

必须先将设备注册到 IoT 中心,然后该设备才能进行连接。 在本快速入门中,请使用 CLI 来注册模拟设备。

  1. 在终端中运行以下命令来创建设备标识。

    YourIoTHubName:将下面的占位符替换为你为 IoT 中心选择的名称。

    MyAndroidDevice:这是所注册的设备的名称。 建议使用 MyAndroidDevice,如图所示。 如果为设备选择不同名称,则可能还需要在本文中从头至尾使用该名称,并在运行示例应用程序之前在其中更新设备名称。

    az iot hub device-identity create \
      --hub-name {YourIoTHubName} --device-id MyAndroidDevice
    
  2. 运行以下命令,获取刚注册设备的设备连接字符串

    YourIoTHubName:将下面的占位符替换为你为 IoT 中心选择的名称。

    az iot hub device-identity connection-string show\
      --hub-name {YourIoTHubName} \
      --device-id MyAndroidDevice \
      --output table
    

    记下如下所示的设备连接字符串:

    HostName={YourIoTHubName}.azure-devices.cn;DeviceId=MyAndroidDevice;SharedAccessKey={YourSharedAccessKey}

    稍后会在快速入门中用到此值。

检索服务连接字符串

还需一个服务连接字符串,以便后端服务应用程序能够连接到 IoT 中心以执行方法并检索消息。 以下命令检索 IoT 中心的服务连接字符串:

YourIoTHubName:将下面的占位符替换为你为 IoT 中心选择的名称。

az iot hub connection-string show --policy-name service --hub-name {YourIoTHubName} --output table

记下如下所示的服务连接字符串:

HostName={YourIoTHubName}.azure-devices.cn;SharedAccessKeyName=service;SharedAccessKey={YourSharedAccessKey}

稍后会在快速入门中用到此值。 此服务连接字符串与你在上一步中记录的设备连接字符串不同。

侦听直接方法调用

本快速入门的这两个示例都是 GitHub 上 Azure IoT SDKs for Java 存储库的一部分。 下载或克隆存储库。

设备 SDK 示例应用程序可以在物理 Android 设备或 Android 模拟器上运行。 示例会连接到 IoT 中心的特定于设备的终结点,发送模拟遥测数据,并侦听中心的直接方法调用。 在本快速入门中,中心的直接方法调用告知设备对其发送遥测的间隔进行更改。 执行直接方法后,模拟设备会将确认发送回中心。

  1. 在 Android Studio 中打开 GitHub 示例 Android 项目。 此项目位于克隆的或下载的 Azure IoT SDKs for Java 存储库副本的以下目录中:\azure-iot-sdk-java\device\iot-device-samples\android-sample。

  2. 在 Android Studio 中打开示例项目的 gradle.properties,将 Device_Connection_String 占位符替换为此前记下的设备连接字符串。

    DeviceConnectionString=HostName={YourIoTHubName}.azure-devices.cn;DeviceId=MyAndroidDevice;SharedAccessKey={YourSharedAccessKey}
    
  3. 在 Android Studio 中,单击“文件”>“将项目与 Gradle 文件同步”。 验证生成是否已完成。

    注意

    如果项目同步失败,可能是由于以下某个原因:

    • 项目中引用的 Android Gradle 插件和 Gradle 的版本对于 Android Studio 版本来说已经过时。 请按照这些说明操作,以引用并安装正确版本的插件和 Gradle 以进行安装。
    • Android SDK 的许可协议尚未签署。 请按照 Build 输出中的说明签署许可协议并下载 SDK。
  4. 生成完成以后,请单击“运行”>“运行‘应用’”。 将应用配置为在物理 Android 设备或 Android 模拟器上运行。 若要详细了解如何在物理设备或模拟器上运行 Android 应用,请参阅运行您的应用

  5. 待应用加载以后,请单击“启动”按钮,开始将遥测数据发送到 IoT 中心:

    Sample screenshot of client device android app

在运行时期间执行服务 SDK 示例以更新遥测时间间隔时,需要让此应用在物理设备或模拟器上运行。

从中心读取遥测数据

在本部分中,将使用具有 IoT 扩展的 Azure PowerShell 监视 Android 设备发送的消息。

  1. 通过 Azure PowerShell 运行以下命令以建立连接并从 IoT 中心读取消息:

    YourIoTHubName:将下面的占位符替换为你为 IoT 中心选择的名称。

    az iot hub monitor-events --hub-name {YourIoTHubName} --output table
    

    以下屏幕截图显示了 IoT 中心接收 Android 设备发送的遥测数据后的输出:

    Read the device messages using the Azure CLI

默认情况下,遥测应用每 5 秒钟从 Android 设备发送一次遥测数据。 在下一部分,将使用直接方法调用更新 Android IoT 设备的遥测时间间隔。

调用直接方法

服务应用程序会连接到 IoT 中心的服务端终结点。 应用程序通过 IoT 中心对设备进行直接方法调用,并侦听确认。

请在单独的物理 Android 设备或 Android 模拟器上运行此应用。

IoT 中心后端服务应用程序通常在云中运行,这样可以更轻松地减轻与敏感的连接字符串相关联的风险。该字符串控制某个 IoT 中心的所有设备。 在此示例中,我们将它作为 Android 应用运行,仅仅是为了演示。 其他语言版本的本快速入门提供与典型后端服务应用程序更匹配的示例。

  1. 在 Android Studio 中打开 GitHub 服务示例 Android 项目。 此项目位于克隆的或下载的 Azure IoT SDKs for Java 存储库副本的以下目录中:\azure-iot-sdk-java\device\iot-device-samples\android-sample。

  2. 在 Android Studio 中,打开示例项目的 gradle.properties。 将 ConnectionStringDeviceId 属性的值更新为此前记下的服务连接字符串和已注册的 Android 设备 ID。

    ConnectionString=HostName={YourIoTHubName}.azure-devices.cn;SharedAccessKeyName=service;SharedAccessKey={YourSharedAccessKey}
    DeviceId=MyAndroidDevice
    
  3. 在 Android Studio 中,单击“文件”>“将项目与 Gradle 文件同步”。 验证生成是否已完成。

    注意

    如果项目同步失败,可能是由于以下某个原因:

    • 项目中引用的 Android Gradle 插件和 Gradle 的版本对于 Android Studio 版本来说已经过时。 请按照这些说明操作,以引用并安装正确版本的插件和 Gradle 以进行安装。
    • Android SDK 的许可协议尚未签署。 请按照 Build 输出中的说明签署许可协议并下载 SDK。
  4. 生成完成以后,请单击“运行”>“运行‘应用’”。 将应用配置为在单独的物理 Android 设备或 Android 模拟器上运行。 若要详细了解如何在物理设备或模拟器上运行 Android 应用,请参阅运行您的应用

  5. 待应用加载以后,将“设置消息传送时间间隔”值更新为 1000,然后单击“调用”。

    遥测消息传送时间间隔以毫秒为单位。 设备示例的默认遥测时间间隔设置为 5 秒钟。 此更改会更新 Android IoT 设备,使遥测数据每秒发送一次。

    Enter telemetry interval

  6. 应用会收到一个表明方法是否已成功执行的确认。

    Direct Method acknowledgment

清理资源

如果想要继续学习下一篇建议的文章,可以保留已创建的资源,以便重复使用。

否则,可删除本文中创建的 Azure 资源,避免收费。

重要

删除资源组的操作不可逆。 资源组以及包含在其中的所有资源将被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有的包含要保留资源的资源组中创建了 IoT 中心,则只删除 IoT 中心资源本身,而不要删除资源组。

若要按名称删除资源组,请执行以下操作:

  1. 登录到 Azure 门户,然后选择“资源组”。

  2. 在“按名称筛选”文本框中,键入包含 IoT 中心的资源组的名称。

  3. 在结果列表中的资源组右侧,选择“...”,然后选择“删除资源组” 。

    Delete

  4. 系统会要求确认是否删除资源组。 再次键入资源组的名称进行确认,然后选择“删除” 。 片刻之后,将会删除该资源组及其包含的所有资源。

后续步骤

在本快速入门中,已从后端应用程序调用了设备上的直接方法,并在模拟设备应用程序中响应了直接方法调用。

若要了解如何将设备到云的消息路由到云中的不同目标,请继续学习下一教程。