你当前正在访问 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 中,每个下游设备都显示为网关设备的子设备:
重要
本文包括使用共享访问签名(也称为对称密钥身份验证)连接设备的步骤。 此身份验证方法便于测试和评估,但使用 X.509 证书对设备进行身份验证是一种更安全的方法。 若要了解详细信息,请参阅“安全最佳做法 > 连接安全性”。
为简单起见,本文使用虚拟机来托管下游设备和网关设备。 在实际情况中,下游设备和网关将在本地网络上的物理设备上运行。
本文介绍了如何使用 IoT Edge 1.4 运行时来实施方案。
先决条件
若要完成本文中的步骤,需要:
一个有效的 Azure 订阅。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
根据自定义应用程序模板创建的 IoT Central 应用程序。 若要了解详细信息,请参阅创建 IoT Central 应用程序。
若要执行本文中的步骤,请将以下文件下载到计算机:
- 恒温器设备模型 (thermostat-1.json) - 此文件是下游设备的设备模型。
- 透明网关清单 (EdgeTransparentGatewayManifest.json) - 此文件是网关设备的 IoT Edge 部署清单。
导入部署清单
每个 IoT Edge 设备都需要一个部署清单来配置 IoT Edge 运行时。 若要导入 IoT Edge 透明网关的部署清单,请执行以下操作:
导航到“Edge 清单”。
选择“+ 新建”,输入部署清单的名称(例如“透明网关”),然后上传之前下载的 EdgeTransparentGatewayManifest.json 文件。
选择“创建”,将部署清单保存在应用程序中。
添加设备模板
下游设备和网关设备都可以使用 IoT Central 中的设备模板。 IoT Central 允许你对下游设备和网关之间的关系进行建模,以便在它们连接后可以查看和管理它们。 将下游设备连接到网关不需要设备模板。
若要为下游设备创建设备模板,请创建一个标准设备模板,该模板对设备的功能进行建模。 本文所示的示例使用下载的恒温器设备模型。
为下游设备创建设备模板:
创建设备模板,然后选择“IoT 设备”作为模板类型。
在向导的“自定义”页上,输入设备模板的名称,例如“恒温器”。
创建设备模板后,选择“导入模型”。 选择一个模型,比如之前下载的 thermostat-1.json 文件。
若要为恒温器生成一些默认视图,请选择“视图”,然后选择“生成默认视图”。
发布设备模板。
为 IoT Edge 透明网关设备创建设备模板:
创建设备模板,然后选择“Azure IoT Edge”作为模板类型。
在向导的“自定义”页上,输入设备模板的名称,例如“Edge 网关”。
在向导的“自定义”页上,选中“这是网关设备”。
在“查看”页上,选择“创建” 。
在“创建模型”页面上,选择“自定义模型”。
将“关系”中的条目添加到下游设备模板。
以下屏幕截图显示了 IoT Edge 网关设备的“关系”页面,该网关设备具有使用“恒温器”设备模板的下游设备:
上一个屏幕截图显示了没有定义模块的 IoT Edge 网关设备模板。 透明网关不需要任何模块,因为 IoT Edge 运行时将消息直接从下游设备转发到 IoT Central。 如果网关本身需要发送遥测、同步属性或处理命令,则可以在根组件或模块中定义这些功能。
在发布网关和下游设备模板之前,添加任何所需的云属性和视图。
添加设备
将设备添加到 IoT Central 应用程序时,可以定义下游设备与透明网关之间的关系。
添加设备:
导航到 IoT Central 应用程序中的“设备”页。
添加透明网关 IoT Edge 设备的实例。 添加设备时,请确保选择“透明网关”部署清单。 在本文中,网关设备 ID 是
edgegateway
。添加下游设备的一个或多个实例。 在本文中,下游设备是 ID 为
thermostat1
和thermostat2
的恒温器。在设备列表中,选择每个下游设备并选择“附加到网关”。
以下屏幕截图显示你可以在“下游设备”页面上查看附加到网关的设备列表:
在透明网关中,下游设备连接到网关本身,而不是网关托管的自定义模块。
在部署设备之前,你需要:
- IoT Central 应用程序的“ID 范围”。
- 网关和下游设备的“设备 ID”值。
- 网关和下游设备的“主密钥”值。
若要查找这些值,请导航到设备列表中的每个设备并选择“连接”。 在继续之前,请记下这些值。
提示
可以连接设备并建立关系,而无需先为设备创建设备模板。 可以将未分配的下游设备连接到未分配的网关设备。
部署网关和设备
若要试用此方案,以下步骤将向你展示如何将网关和下游设备部署到 Azure 虚拟机。
提示
若要了解如何将 IoT Edge 运行时部署到物理设备,请参阅 IoT Edge 文档中的创建 IoT Edge 设备。
若要尝试透明网关场景,请选择下面的按钮以部署两个 Linux 虚拟机。 一个虚拟机安装了 IoT Edge 1.4 运行时,并且是透明的 IoT Edge 网关。 另一个虚拟机是一个下游设备,将在该设备中运行代码来发送模拟恒温器遥测数据:
部署并运行这两个虚拟机时,请验证 IoT Edge 网关设备是否在 edgegateway
虚拟机上运行:
转到 IoT Central 应用程序中的“设备”页。 如果 IoT Edge 网关设备连接到 IoT Central,则其状态为“已预配”。
打开 IoT Edge 网关设备并在“模块”页面上验证模块的状态。 如果 IoT Edge 运行时启动成功,“$edgeAgent”和“$edgeHub”模块的状态为“正在运行” :
提示
当虚拟机启动且设备在 IoT Central 应用程序中进行预配时,你可能需要等待几分钟。
配置网关
若要使 IoT Edge 设备充当透明网关,它需要一些证书来向任何下游设备证明其身份。 本文使用演示证书。 在生产环境中,使用证书颁发机构的证书。
生成演示证书并将其安装到网关设备上:
使用 SSH 连接并登录网关设备虚拟机。
运行以下命令克隆 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 设备功能。
在文本编辑器中打开 config.toml 文件。 例如:
sudo nano /etc/aziot/config.toml
在配置文件中找到以下设置。 添加如下证书设置:
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 证书。
保存更改并重启 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:
运行以下命令以安装
azure.iot.device
模块:pip install azure.iot.device
运行以下命令,下载执行设备预配的 Python 脚本:
wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/provision_device.py
若要在 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
虚拟机上运行恒温器模拟器:
使用 SSH 连接并登录
leafdevice
虚拟机。将 Python 示例下载到主目录:
cd ~ wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/simple_thermostat.py
安装 Azure IoT 设备 Python 模块:
sudo apt update sudo apt install python3-pip pip3 install azure.iot.device
设置环境变量以配置示例。 用前面记录的
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 中心的名称)的方式。
若要运行代码,请使用以下命令:
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 ...
提示
如果你在下游设备尝试连接时看到错误, 请尝试重新运行设备预配步骤。
若要查看 IoT Central 中的遥测,请导航到“thermostat1”设备的“概述”页 :
在“关于”页上,你可以查看从下游设备发送的属性值;在“命令”页上,你可以调用下游设备上的命令 。