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

IoT 中心设备流(预览版)

Azure IoT 中心设备流可促进为各种云到设备通信方案创建安全的双向 TCP 隧道。 设备流由 IoT 中心*流式处理终结点进行介导,该终结点充当了设备与服务终结点之间的代理。 此设置如下图所示,当设备位于网络防火墙之后或处于专用网络内部时特别有用。 因此,IoT 中心设备流有助于满足客户以防火墙友好方式访问 IoT 设备的需求,而无需广泛开放传入或传出网络防火墙端口。

“IoT 中心设备流概述”

使用 IoT 中心设备流可让设备保持安全状态,同时只需打开端口 443 上到 IoT 中心流式处理终结点的出站 TCP 连接。 建立设备流后,服务端和设备端应用程序将各自具有针对 WebSocket 客户端对象的编程访问权限,以便相互发送和接收原始字节。 此隧道提供的可靠性和顺序保证与 TCP 提供的可靠性和顺序保证相当。

优点

IoT 中心设备流具有以下优点:

  • 防火墙友好的安全连接:可以从服务终结点访问 IoT 设备,而无需在设备或网络外围打开入站防火墙端口(仅需要端口 443 上到 IoT 中心的出站连接)。

  • 身份验证:隧道的设备端和服务端都需要使用相应的凭据对 IoT 中心进行身份验证。

  • 加密:默认情况下,IoT 中心设备流使用启用了 TLS 的连接。 此因素可确保始终加密流量,而无论应用程序是否使用加密。

  • 连接的简洁性:在许多情况下,使用设备流可消除对虚拟专用网络进行复杂设置以连接到 IoT 设备的需求。

  • 与 TCP/IP 堆栈的兼容性:IoT 中心设备流可以接纳 TCP/IP 应用程序流量。 此方法意味着各种基于标准的专有协议都可以使用此功能。

  • 专用网络设置的易用性:服务可以通过引用设备 ID(而不是设备的 IP 地址)与设备通信。 在设备位于专用网络内并拥有专用 IP 地址,或其 IP 地址由系统动态分配且对于服务端未知的情况下,这很有用。

设备流工作流

当服务请求通过提供设备 ID 连接到设备时,设备流会启动。 此工作流特别适合客户端/服务器通信模型,其中包括 SSH 和 RDP,即用户打算使用 SSH 或 RDP 客户端程序远程连接到设备上运行的 SSH 或 RDP 服务器。

设备流创建过程涉及设备、服务、IoT 中心的主要终结点和流式处理终结点之间的协商。 IoT 中心的主要终结点协调设备流的创建,流式处理终结点则处理在服务和设备之间流动的流量。

设备流创建流程

使用 SDK 以编程方式创建设备流涉及以下步骤,如下图所示:

“设备流握手过程”

  1. 设备应用程序会预先注册回叫,以便在向设备发起新设备流时收到通知。 此步骤通常在设备启动并连接到 IoT 中心时发生。

  2. 服务端程序在需要时通过提供设备 ID(而不是 IP 地址)来发起设备流。

  3. IoT 中心通过调用步骤 1 中注册的回叫来通知设备端程序。 设备可能会接受或拒绝流启动请求。 此逻辑可以特定于应用程序方案。 如果设备拒绝流请求,IoT 中心会相应地通知服务;否则,将执行以下步骤。

  4. 设备会在端口 443 上创建到流式处理终结点的安全出站 TCP 连接,并将连接升级为 WebSocket。 流式处理终结点的 URL 以及用于进行身份验证的凭据都由 IoT 中心在步骤 3 发送的请求中向设备提供。

  5. 服务获得设备接受流这一结果的通知,并继续创建自己的到流式处理终结点的 WebSocket 客户端。 同样,它从 IoT 中心接收流式处理终结点 URL 和身份验证信息。

在上述握手过程中:

  • 握手过程必须在 60 秒内完成(步骤 2 到 5),否则握手会因超时而失败且服务将相应获得通知。

  • 上述流创建流程完成后,流式处理终结点将充当代理,并通过其各自的 WebSocket 在服务和设备之间传输流量。

  • 设备和服务都需要通过端口 443 实现到 IoT 中心主要终结点和流式处理终结点的出站连接。 IoT 中心门户的“概览”选项卡上提供这些终结点的 URL。

  • 已建立的流的可靠性和排序保证与 TCP 的可靠性和排序保证相当。

  • 到 IoT 中心和流式处理终结点的所有连接都使用 TLS 并加密。

终止流

当到网关的任一 TCP 连接(由服务或设备)断开时,建立的流会终止。 此操作可以通过关闭设备或服务程序上的 WebSocket 自愿发生,也可能在出现网络连接超时或进程失败的情况下非自愿发生。 当设备或服务与流式处理终结点的连接终止时,另一个 TCP 连接也会被(强制)终止,服务和设备负责重新创建流(如果需要)。

连接要求

设备流的设备端和服务端都必须能够建立到 IoT 中心及其流式处理终结点的启用 TLS 的连接。 这种情况需要在端口 443 上建立到这些终结点的出站连接。 可以在 IoT 中心的“概述”选项卡上找到与这些终结点关联的主机名,如下图所示

“设备流终结点”

或者,可以使用中心“属性”部分下的 Azure CLI 检索终结点信息,具体而言是 property.hostnameproperty.deviceStreams 键。

az iot hub devicestream show --name <YourIoTHubName>

输出是一个 JSON 对象,其中包括中心设备和服务可能需要连接以建立设备流的所有终结点。

{
  "streamingEndpoints": [
    "https://<YourIoTHubName>.<region-stamp>.streams.azure-devices.net"
  ]
}

注意

确保已安装 Azure CLI 2.0.57 或更高版本。 可从安装 Azure CLI 页下载最新版本。

允许以出站方式连接到设备流式处理终结点

如本文开头所述,设备在设备流启动过程中创建到 IoT 中心流式处理终结点的出站连接。 设备或其网络上的防火墙必须允许端口 443 上到流式传输网关的出站连接(请注意,通信发生在使用 TLS 加密的 WebSocket 连接上)。

可以在 Azure IoT 中心门户的“概述”选项卡下找到设备流式处理终结点的主机名。“设备流终结点”

或者,可以使用 Azure CLI 找到此信息:

az iot hub devicestream show --name <YourIoTHubName>

注意

确保已安装 Azure CLI 2.0.57 或更高版本。 可从安装 Azure CLI 页下载最新版本。

通过设备流资源日志排除故障

可以设置 Azure Monitor 来收集 IoT 中心发出的设备流的资源日志。 此方法在故障排除场景下非常有用。

按照以下步骤创建诊断设置,以将 IoT 中心的设备流日志发送到 Azure Monitor 日志:

  1. 在 Azure 门户中,导航到 IoT 中心。 在左窗格中的“监视”下,选择“诊断设置”。 然后选择“添加诊断设置”。

  2. 提供诊断设置的名称,并从日志列表中选择“DeviceStreams”。 选择“发送到 Log Analytics”。 系统将引导你选择现有的 Log Analytics 工作区或创建新的资源。

    启用设备流日志

  3. 创建诊断设置以将设备流日志发送到 Log Analytics 工作区后,可以通过在 Azure 门户的 IoT 中心的左窗格中的“监视”下选择“日志”来访问日志。 设备流日志在 AzureDiagnostics 表中显示并具有 Category=DeviceStreams。 在执行操作后,可能需要几分钟时间,日志才会出现在表中。

    如下所示,日志中还提供目标设备的标识和操作的结果。

    “访问设备流日志”

要了解有关将 Azure Monitor 与 IoT 中心一起使用的更多信息,请参阅 Monitor IoT 中心。 有关可用于 IoT 中心的所有资源日志、指标和表的信息,请参阅监视 Azure IoT 中心数据参考

区域可用性

在公开预览版发布期间,IoT 中心设备流在“美国中部”、“美国东部 EUAP”、“北欧”和“东南亚”区域提供。 请确保在这其中的一个区域创建中心。

SDK 可用性

每个流的两端(设备端和服务端)使用 IoT 中心 SDK 建立隧道。 在公开预览版中,客户可以选择以下 SDK 语言:

  • C 和 C# SDK 支持设备端上的设备流。

  • NodeJS 和 C# SDK 支持服务端上的设备流。

后续步骤