教程:使用模拟设备测试与 IoT 中心的连接

本教程使用 Azure IoT 中心门户工具和 Azure CLI 命令来测试设备连接性。 本教程还使用简单的可以在台式机上运行的设备模拟器。

如果没有 Azure 订阅,请在开始前创建试用版订阅

在本教程中,你将了解如何执行以下操作:

  • 检查设备身份验证
  • 检查设备到云的连接性
  • 检查云到设备的连接性
  • 检查设备孪生同步

先决条件

可以使用本地 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

  • 本教程中运行的示例应用程序使用 Node.js。 开发计算机上需要有 Node.js v10.x.x 或更高版本。

    • 可从 nodejs.org 下载适用于多个平台的 Node.js。

    • 可以使用以下命令验证开发计算机上 Node.js 当前的版本:

      node --version
      
  • 适用于 Node.js 的 Azure IoT 示例克隆或下载示例 Node.js 项目。

  • 确保已在防火墙中打开端口 8883。 本教程中的设备示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)

创建 IoT 中心

在本部分中,使用 Azure CLI 创建 IoT 中心和资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 IoT 中心充当中央消息中心,用于 IoT 应用程序与设备之间的双向通信。

如果你的 Azure 订阅中已有 IoT 中心,可以跳过本部分。

创建 IoT 中心和资源组:

  1. 启动 CLI 应用程序。 若要在本文的其余部分运行 CLI 命令,请复制命令语法,将其粘贴到 CLI 应用程序中,编辑变量值,然后按 Enter 键。

    • 如果要在本地使用 Azure CLI,请启动 CLI 控制台应用程序并登录到 Azure CLI。
  2. 运行 az extension add,安装 azure-iot 扩展或将其升级到当前版本。

    az extension add --upgrade --name azure-iot
    
  3. 在 CLI 应用程序中,运行 az group create 命令来创建资源组。 以下命令在 chinanorth 位置创建名为 MyResourceGroup 的资源组。

    注意

    (可选)可以设置其他位置。 若要查看可用位置,请运行 az account list-locations。 本快速入门使用示例命令中所示的 chinanorth。

    az group create --name MyResourceGroup --location chinanorth
    
  4. 运行 az iot hub create 命令创建 IoT 中心。 创建 IoT 中心可能需要数分钟的时间。

    YourIotHubName。 使用你为 IoT 中心选择的名称,在以下命令中替换此占位符和周围的大括号。 IoT 中心名称必须在 Azure 中全局唯一。 无论你在何处看到占位符,都请使用本快速入门的其余部分中的 IoT 中心名称。

    az iot hub create --resource-group MyResourceGroup --name {your_iot_hub_name}
    

检查设备身份验证

设备在与中心交换数据之前,必须通过中心进行身份验证。 可以使用门户的“设备管理”部分的 IoT 设备工具来管理设备并检查其使用的身份验证密钥。 在教程的此部分,请添加一个新的测试设备,检索其密钥,并检查此测试设备能否连接到中心。 稍后请重置身份验证密钥,观察在设备尝试使用过期密钥时会发生什么情况。

注册设备

必须先将设备注册到 IoT 中心,然后该设备才能进行连接。 在本部分中,将使用 Azure CLI 创建设备标识。

如果你已在 IoT 中心注册了设备,可以跳过本部分。

创建设备标识:

  1. 在 CLI shell 中运行 az iot hub device-identity create 命令。 此命令创建设备标识。

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

    myDevice。 可以在整个文章中将此名称用于设备 ID,也可以提供其他设备名称。

    az iot hub device-identity create --device-id myDevice --hub-name {your_iot_hub_name}
    
  2. 运行 az iot hub device-identity connection-string show 命令。

    az iot hub device-identity connection-string show --device-id myDevice --hub-name {your_iot_hub_name}
    

    连接字符串输出采用以下格式:

    HostName=<your IoT Hub name>.azure-devices.net;DeviceId=<your device id>;SharedAccessKey=<some value>
    
  3. 在安全位置保存连接字符串。

注意

让你的 CLI 应用程序保持开启。 因为在稍后的步骤中需要用到。

模拟测试设备

若要模拟你的设备将遥测数据发送到 IoT 中心,请运行以前下载的 Node.js 模拟设备应用程序。

  1. 在开发计算机的终端窗口中,导航到下载的示例 Node.js 项目的根文件夹。 然后导航到 iot-hub\Tutorials\ConnectivityTests 文件夹。

  2. 在终端窗口中,运行以下命令以安装所需的库,并运行模拟设备应用程序。 使用注册设备时记下的设备连接字符串。

    npm install
    node SimulatedDevice-1.js "{your_device_connection_string}"
    

    终端窗口在连接到中心后会显示成功消息:

    Screenshot that shows the simulated device connecting.

你现在已使用 IoT 中心生成的设备密钥成功地从设备进行了身份验证。

重置密钥

在此部分,请重置设备密钥,然后观察模拟的设备尝试进行连接时发生的错误。

  1. 若要重置设备的主设备密钥,请运行 az iot hub device-identity update 命令:

    # Generate a new Base64 encoded key using the current date
    read key < <(date +%s | sha256sum | base64 | head -c 32)
    
    # Reset the primary device key for test device
    az iot hub device-identity update --device-id {your_device_id} --set authentication.symmetricKey.primaryKey=$key --hub-name {your_iot_hub_name}
    
  2. 在开发计算机的终端窗口中,再次运行模拟的设备应用程序:

    npm install
    node SimulatedDevice-1.js "{your_device_connection_string}"
    

    这一次会看到应用程序尝试进行连接时发生的身份验证错误:

    Screenshot that shows the connection failing after the key reset.

生成共享访问签名 (SAS) 令牌

如果设备使用某个 IoT 中心设备 SDK,SDK 库代码会生成用于通过中心进行身份验证的 SAS 令牌。 可以通过中心名称、设备名称和设备密钥生成 SAS 令牌。

在某些情况下,例如在云协议网关中或使用自定义身份验证方案的情况下,可能需要自行生成 SAS 令牌。 若要排查 SAS 生成代码的问题,必须生成可以在测试过程中使用的已知良好的 SAS 令牌。

注意

SimulatedDevice-2.js 示例包括使用 SDK 和不使用 SDK 生成 SAS 令牌的示例。

  1. 运行 az iot hub genereate-sas-token 命令以使用 CLI 生成已知良好的 SAS 令牌:

    az iot hub generate-sas-token --device-id {your_device_id} --hub-name {your_iot_hub_name}
    
  2. 复制生成的 SAS 令牌的完整文本。 SAS 令牌类似于以下示例:SharedAccessSignature sr=tutorials-iot-hub.azure-devices.net%2Fdevices%2FmyDevice&sig=xxxxxx&se=111111

  3. 在开发计算机的终端窗口中,导航到下载的示例 Node.js 项目的根文件夹。 然后导航到 iot-hub\Tutorials\ConnectivityTests 文件夹。

  4. 在终端窗口中,运行以下命令,安装所需的库,并运行模拟设备应用程序:

    npm install
    node SimulatedDevice-2.js "{Your SAS token}"
    

    使用 SAS 令牌连接到中心后,终端窗口会显示成功消息:

    Screenshot that shows a successful connection using a SAS token.

你现在已使用 CLI 命令生成的测试性 SAS 令牌成功地从设备进行了身份验证。 SimulatedDevice-2.js 文件包含的示例代码演示了如何在代码中生成 SAS 令牌。

协议

设备可以使用以下任何协议连接到 IoT 中心:

协议 出站端口
MQTT 8883
基于 WebSocket 的 MQTT 443
AMQP 5671
基于 WebSockets 的 AMQP 443
HTTPS 443

如果防火墙阻止了出站端口,则设备无法进行连接:

Screenshot that shows a connection error when the outbound port is blocked.

检查设备到云的连接性

设备在连接后会开始向你的 IoT 中心发送遥测数据。 此部分介绍如何验证设备发送的遥测数据是否已到达中心。

发送设备到云的消息

  1. 由于在上一部分中重置了设备的连接字符串,因此请使用 az iot hub device-identity connection-string show 命令检索更新后的连接字符串:

    az iot hub device-identity connection-string show --device-id {your_device_id} --output table --hub-name {your_iot_hub_name}
    
  2. 若要运行可发送消息的模拟设备,请导航到已下载代码中的 iot-hub\Tutorials\ConnectivityTests 文件夹。

  3. 在终端窗口中,运行以下命令,安装所需的库,并运行模拟设备应用程序:

    npm install
    node SimulatedDevice-3.js "{your_device_connection_string}"
    

    终端窗口在将遥测数据发送到中心时会显示相关信息:

    Screenshot that shows the simulated device sending messages.

监视传入消息

可以使用门户中的“指标”来验证遥测消息是否已到达 IoT 中心。

  1. Azure 门户中,在“资源”下拉列表中选择你的 IoT 中心。

  2. 在导航菜单的“监视”部分中选择“指标”。

  3. 将“发送的遥测消息数”选为指标,然后将时间范围设置为“过去一小时”。 图表显示模拟设备发送的消息的聚合计数:

    Screenshot showing left pane metrics.

启动模拟设备后,指标在数分钟后才会变得可用。

检查云到设备的连接性

此部分介绍如何对设备进行测试性的直接方法调用,以便检查云到设备的连接性。 请在开发计算机上运行模拟设备,以便侦听来自中心的直接方法调用。

  1. 在终端窗口中,请使用以下命令运行模拟设备应用程序:

    node SimulatedDevice-3.js "{your_device_connection_string}"
    
  2. 在单独的窗口中,使用 az iot hub invoke-device-method 命令在设备上调用直接方法:

    az iot hub invoke-device-method --device-id {your_device_id} --method-name TestMethod --timeout 10 --method-payload '{"key":"value"}' --hub-name {your_iot_hub_name}
    

    模拟设备在收到直接方法调用后会将一条消息列显到控制台:

    Screenshot that shows the device confirming that the direct method was received.

    模拟设备在成功收到直接方法调用之后,会向中心发送确认:

    Screenshot showing that the device returns a direct method acknowledgment.

检查孪生同步

设备使用孪生在设备和中心之间同步状态。 在此部分,请使用 CLI 命令向设备发送所需属性,以及读取设备发送的报告属性。

在此部分使用的模拟设备只要一启动就会向中心发送报告属性,并且只要一收到所需属性就会将其列显到控制台。

  1. 在终端窗口中,请使用以下命令运行模拟设备应用程序:

    node SimulatedDevice-3.js "{your_device_connection_string}"
    
  2. 在单独的窗口中,运行 az iot hub device-twin show 命令以验证中心是否从设备接收到报告的属性:

    az iot hub device-twin show --device-id {your_device_id} --hub-name {your_iot_hub_name}
    

    在命令的输出中,可以在报告属性部分看到 devicelaststarted 属性。 该属性显示上次启动模拟设备的日期和时间。

    Screenshot showing the reported properties of a device.

  3. 若要验证中心是否可以向设备发送所需属性值,请使用 az iot hub device-twin update 命令:

    az iot hub device-twin update --set properties.desired='{"mydesiredproperty":"propertyvalue"}' --device-id {your_device_id} --hub-name {your_iot_hub_name}
    

    模拟设备在收到中心的所需属性更新后会列显一条消息:

    Screenshot that shows the device confirming that the desired properties update was received.

除了即时接收所需属性更改,模拟设备还会在启动时自动检查是否存在所需属性。

清理资源

如果不再需要 IoT 中心,请在门户中删除该中心与资源组。 为此,请选择包含你的 IoT 中心的资源组,然后选择“删除”。

后续步骤

本教程介绍了如何检查设备密钥、如何检查设备到云的连接性、如何检查云到设备的连接性,以及如何检查设备孪生同步。 若要详细了解如何监视 IoT 中心,请访问有关 IoT 中心监视的操作方法文章。