你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何通过 IoT Edge 透明网关连接设备

IoT Edge 设备可以充当网关,提供本地网络上其他设备与 IoT Central 应用程序之间的连接。 当设备无法直接访问 IoT Central 应用程序时,使用网关。

IoT Edge 支持透明网关模式和转换网关模式 。 本文总结了如何实现透明网关模式。 在此模式中,网关将消息从下游设备传递到 IoT Central 应用程序中的 IoT 中心终结点。 网关不会在消息传递时对其进行操作。 在 IoT Central 中,每个下游设备都显示为网关设备的子设备:

一个示意图,其中将 IoT Edge 显示为一个透明网关。

重要

本文包括使用共享访问签名(也称为对称密钥身份验证)连接设备的步骤。 此身份验证方法便于测试和评估,但使用 X.509 证书对设备进行身份验证是一种更安全的方法。 若要了解详细信息,请参阅“安全最佳做法 > 连接安全性”。

为简单起见,本文使用虚拟机来托管下游设备和网关设备。 在实际情况中,下游设备和网关将在本地网络上的物理设备上运行。

本文介绍了如何使用 IoT Edge 1.4 运行时来实施方案。

先决条件

若要完成本文中的步骤,需要:

若要执行本文中的步骤,请将以下文件下载到计算机:

导入部署清单

每个 IoT Edge 设备都需要一个部署清单来配置 IoT Edge 运行时。 若要导入 IoT Edge 透明网关的部署清单,请执行以下操作:

  1. 导航到“Edge 清单”。

  2. 选择“+ 新建”,输入部署清单的名称(例如“透明网关”),然后上传之前下载的 EdgeTransparentGatewayManifest.json 文件。

  3. 选择“创建”,将部署清单保存在应用程序中。

添加设备模板

下游设备和网关设备都可以使用 IoT Central 中的设备模板。 IoT Central 允许你对下游设备和网关之间的关系进行建模,以便在它们连接后可以查看和管理它们。 将下游设备连接到网关不需要设备模板。

若要为下游设备创建设备模板,请创建一个标准设备模板,该模板对设备的功能进行建模。 本文所示的示例使用下载的恒温器设备模型。

为下游设备创建设备模板:

  1. 创建设备模板,然后选择“IoT 设备”作为模板类型。

  2. 在向导的“自定义”页上,输入设备模板的名称,例如“恒温器”。

  3. 创建设备模板后,选择“导入模型”。 选择一个模型,比如之前下载的 thermostat-1.json 文件。

  4. 若要为恒温器生成一些默认视图,请选择“视图”,然后选择“生成默认视图”。

  5. 发布设备模板。

为 IoT Edge 透明网关设备创建设备模板:

  1. 创建设备模板,然后选择“Azure IoT Edge”作为模板类型。

  2. 在向导的“自定义”页上,输入设备模板的名称,例如“Edge 网关”。

  3. 在向导的“自定义”页上,选中“这是网关设备”。

  4. 在“查看”页上,选择“创建” 。

  5. 在“创建模型”页面上,选择“自定义模型”。

  6. 将“关系”中的条目添加到下游设备模板。

以下屏幕截图显示了 IoT Edge 网关设备的“关系”页面,该网关设备具有使用“恒温器”设备模板的下游设备:

显示 IoT Edge 网关设备模板与恒温器下游设备模板关系的屏幕截图。

上一个屏幕截图显示了没有定义模块的 IoT Edge 网关设备模板。 透明网关不需要任何模块,因为 IoT Edge 运行时将消息直接从下游设备转发到 IoT Central。 如果网关本身需要发送遥测、同步属性或处理命令,则可以在根组件或模块中定义这些功能。

在发布网关和下游设备模板之前,添加任何所需的云属性和视图。

添加设备

将设备添加到 IoT Central 应用程序时,可以定义下游设备与透明网关之间的关系。

添加设备:

  1. 导航到 IoT Central 应用程序中的“设备”页。

  2. 添加透明网关 IoT Edge 设备的实例。 添加设备时,请确保选择“透明网关”部署清单。 在本文中,网关设备 ID 是 edgegateway

  3. 添加下游设备的一个或多个实例。 在本文中,下游设备是 ID 为 thermostat1thermostat2 的恒温器。

  4. 在设备列表中,选择每个下游设备并选择“附加到网关”。

以下屏幕截图显示你可以在“下游设备”页面上查看附加到网关的设备列表:

显示连接到透明网关的下游设备列表的屏幕截图。

在透明网关中,下游设备连接到网关本身,而不是网关托管的自定义模块。

在部署设备之前,你需要:

  • IoT Central 应用程序的“ID 范围”。
  • 网关和下游设备的“设备 ID”值。
  • 网关和下游设备的“主密钥”值。

若要查找这些值,请导航到设备列表中的每个设备并选择“连接”。 在继续之前,请记下这些值。

提示

可以连接设备并建立关系,而无需先为设备创建设备模板。 可以将未分配的下游设备连接到未分配的网关设备。

部署网关和设备

若要试用此方案,以下步骤将向你展示如何将网关和下游设备部署到 Azure 虚拟机。

提示

若要了解如何将 IoT Edge 运行时部署到物理设备,请参阅 IoT Edge 文档中的创建 IoT Edge 设备

若要尝试透明网关场景,请选择下面的按钮以部署两个 Linux 虚拟机。 一个虚拟机安装了 IoT Edge 1.4 运行时,并且是透明的 IoT Edge 网关。 另一个虚拟机是一个下游设备,将在该设备中运行代码来发送模拟恒温器遥测数据:

“部署到 Azure”按钮

部署并运行这两个虚拟机时,请验证 IoT Edge 网关设备是否在 edgegateway 虚拟机上运行:

  1. 转到 IoT Central 应用程序中的“设备”页。 如果 IoT Edge 网关设备连接到 IoT Central,则其状态为“已预配”。

  2. 打开 IoT Edge 网关设备并在“模块”页面上验证模块的状态。 如果 IoT Edge 运行时启动成功,“$edgeAgent”和“$edgeHub”模块的状态为“正在运行” :

    屏幕截图显示了在 IoT Edge 网关上运行的 $edgeAgent 和 $edgeHub 1.4 版模块。

    提示

    当虚拟机启动且设备在 IoT Central 应用程序中进行预配时,你可能需要等待几分钟。

配置网关

若要使 IoT Edge 设备充当透明网关,它需要一些证书来向任何下游设备证明其身份。 本文使用演示证书。 在生产环境中,使用证书颁发机构的证书。

生成演示证书并将其安装到网关设备上:

  1. 使用 SSH 连接并登录网关设备虚拟机。

  2. 运行以下命令克隆 IoT Edge 存储库并生成演示证书:

    # Clone the repo
    cd ~
    git clone https://github.com/Azure/iotedge.git
    
    # Generate the demo certificates
    mkdir certs
    cd certs
    cp ~/iotedge/tools/CACertificates/*.cnf .
    cp ~/iotedge/tools/CACertificates/certGen.sh .
    ./certGen.sh create_root_and_intermediate
    ./certGen.sh create_edge_device_ca_certificate "mycacert"
    

    运行上述命令后,就可以在接下来的步骤中使用以下文件:

    • ~/certs/certs/azure-iot-test-only.root.ca.cert.pem - 根 CA 证书,用于生成所有其他演示证书以测试 IoT Edge 场景。
    • ~/certs/certs/iot-edge-device-mycacert-full-chain.cert.pem - 从 IoT Edge 配置文件引用的设备 CA 证书。 在网关场景中,该 CA 证书是 IoT Edge 设备向下游设备验证其身份的方式。
    • ~/certs/private/iot-edge-device-mycacert.key.pem - 与设备 CA 证书关联的私钥。

    若要了解有关这些演示证书的详细信息,请参阅创建演示证书以测试 IoT Edge 设备功能

  3. 在文本编辑器中打开 config.toml 文件。 例如:

    sudo nano /etc/aziot/config.toml
    
  4. 在配置文件中找到以下设置。 添加如下证书设置:

    trust_bundle_cert = "file:///home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem"
    
    [edge_ca]
    cert = "file:///home/AzureUser/certs/certs/iot-edge-device-ca-mycacert-full-chain.cert.pem"
    pk = "file:///home/AzureUser/certs/private/iot-edge-device-ca-mycacert.key.pem"
    

    前面的示例假设你以 AzureUser 身份登录并创建了一个名为“mycacert”的设备 CA 证书

  5. 保存更改并重启 IoT Edge 运行时:

    sudo iotedge config apply
    

如果 IoT Edge 运行时在更改后成功启动,则在 IoT Central 网关设备的“模块”页面上,“$edgeAgent”和“$edgeHub”模块的状态更改为“运行” 。

如果运行时未启动,请检查在 IoT Edge 配置文件中所做的更改,并查看对 IoT Edge 设备进行故障排除

透明网关现已配置好,可以开始从下游设备转发遥测。

预配下游设备

IoT Central 依赖设备预配服务 (DPS) 在 IoT Central 中预配设备。 目前,IoT Edge 无法使用 DPS 为 IoT Central 应用程序预配下游设备。 以下步骤向你展示了如何手动预配 thermostat1 设备。 若要完成这些步骤,需要一个安装了 Python 且具有 Internet 连接的环境。 查看 Azure IoT Python SDK 以了解当前的 Python 版本要求。 Azure Cloud Shell 预装了 Python:

  1. 运行以下命令以安装 azure.iot.device 模块:

    pip install azure.iot.device
    
  2. 运行以下命令,下载执行设备预配的 Python 脚本:

    wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/provision_device.py
    
  3. 若要在 IoT Central 应用程序中预配 thermostat1 下游设备,请运行以下命令,替换 {your application id scope}{your device primary key}。 将设备添加到 IoT Central 应用程序时,请记下这些值:

    export IOTHUB_DEVICE_DPS_DEVICE_ID=thermostat1
    export IOTHUB_DEVICE_DPS_ID_SCOPE={your application id scope}
    export IOTHUB_DEVICE_DPS_DEVICE_KEY={your device primary key}
    python provision_device.py
    

在 IoT Central 应用程序中,验证 thermostat1 设备的“设备状态”现在是否为“已预配”。

配置下游设备

在上一部分中,你使用演示证书配置了 edgegateway 虚拟机,使其能够作为网关运行。 leafdevice 虚拟机已经准备好安装恒温器模拟器,该模拟器使用网关连接到 IoT Central。

leafdevice 虚拟机需要在 edgegateway 虚拟机上创建的根 CA 证书的副本。 将 /home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem 文件从 edgegateway 虚拟机复制到 leafdevice 虚拟机上的主目录。 可使用 scp 命令在 Linux 虚拟机之间复制文件。 例如,从 leafdevice 计算机:

scp AzureUser@edgegateway:/home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem .

若要了解如何检查从下游设备到网关的连接,请参阅测试网关连接

leafdevice 虚拟机上运行恒温器模拟器:

  1. 使用 SSH 连接并登录 leafdevice 虚拟机。

  2. 将 Python 示例下载到主目录:

    cd ~
    wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/simple_thermostat.py
    
  3. 安装 Azure IoT 设备 Python 模块:

    sudo apt update
    sudo apt install python3-pip
    pip3 install azure.iot.device
    
  4. 设置环境变量以配置示例。 用前面记录的 thermostat1 的主密钥替换 {your device shared key}。 这些变量假定网关虚拟机的名称为 edgegateway,恒温器设备的 ID 为 thermostat1

    export IOTHUB_DEVICE_SECURITY_TYPE=connectionString
    export IOTHUB_DEVICE_CONNECTION_STRING="HostName=edgegateway;DeviceId=thermostat1;SharedAccessKey={your device shared key}"
    export IOTEDGE_ROOT_CA_CERT_PATH=~/azure-iot-test-only.root.ca.cert.pem
    

    请注意连接字符串使用网关设备的名称(而不是 IoT 中心的名称)的方式。

  5. 若要运行代码,请使用以下命令:

    python3 simple_thermostat.py
    

    此命令的输出如下所示:

    Connecting using Connection String HostName=edgegateway;DeviceId=thermostat1;SharedAccessKey={your device shared key}
    Listening for command requests and property updates
    Press Q to quit
    Sending telemetry for temperature
    Sent message
    Sent message
    Sent message
    ...
    

    提示

    如果你在下游设备尝试连接时看到错误, 请尝试重新运行设备预配步骤。

  6. 若要查看 IoT Central 中的遥测,请导航到“thermostat1”设备的“概述”页 :

    显示下游设备遥测的屏幕截图。

    在“关于”页上,你可以查看从下游设备发送的属性值;在“命令”页上,你可以调用下游设备上的命令 。