Azure IoT 中心设备流可促进为各种云到设备通信方案创建安全的双向 TCP 隧道。 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 以编程方式创建设备流涉及以下步骤,如下图所示:
图示展示 IoT 中心设备流握手过程的步骤。
设备应用程序会预先注册回叫,以便在向设备发起新设备流时收到通知。 此步骤通常在设备启动并连接到 IoT 中心时发生。
服务端程序在需要时通过提供设备 ID(而不是 IP 地址)来发起设备流。
IoT 中心通过调用步骤 1 中注册的回叫来通知设备端程序。 设备可能会接受或拒绝流启动请求。 此逻辑可以特定于应用程序方案。 如果设备拒绝流请求,IoT 中心会相应地通知服务;否则,将执行以下步骤。
设备会在端口 443 上创建到流式处理终结点的安全出站 TCP 连接,并将连接升级为 WebSocket。 流式处理终结点的 URL 以及用于进行身份验证的凭据都由 IoT 中心在步骤 3 发送的请求中向设备提供。
服务获得设备接受流这一结果的通知,并继续创建自己的到流式处理终结点的 WebSocket 客户端。 同样,它从 IoT 中心接收流式处理终结点 URL 和身份验证信息。
在前面所述的握手过程中:
握手过程必须在 60 秒内完成(步骤 2 到 5),否则握手失败并出现超时,并相应地通知服务。
在前面描述的流创建流完成之后,流式处理终结点充当代理,并通过各自的 WebSocket 在服务和设备之间传输流量。
设备和服务都需要通过端口 443 实现到 IoT 中心主要终结点和流式处理终结点的出站连接。 IoT 中心门户的“概览”选项卡上提供这些终结点的 URL。
已建立的流的可靠性和排序保证与 TCP 的可靠性和排序保证相当。
与 IoT 中心及其流式处理终结点的所有连接都使用 TLS 并加密。
终止流
当到网关的任一 TCP 连接(由服务或设备)断开时,建立的流会终止。 此操作可以通过关闭设备或服务程序上的 WebSocket 自愿发生,也可能在出现网络连接超时或进程失败的情况下非自愿发生。 当设备或服务与流式处理终结点的连接终止时,另一个 TCP 连接也会被(强制)终止,服务和设备负责重新创建流(如果需要)。
连接要求
设备流的设备端和服务端都必须能够建立到 IoT 中心及其流式处理终结点的启用 TLS 的连接。 这种情况需要在端口 443 上建立到这些终结点的出站连接。 可以在 Azure 门户的 IoT 中心概述窗格中找到与流式处理终结点关联的主机名,如以下屏幕截图所示。
或者,可以使用中心“属性”部分下的 Azure CLI 检索终结点信息,具体而言是 property.hostname
和 property.deviceStreams
键。
az iot hub devicestream show --name <YourIoTHubName>
输出是一个 JSON 对象,其中包括中心设备和服务可能需要连接以建立设备流的所有终结点。
{
"streamingEndpoints": [
"https://<YourIoTHubName>.<region-stamp>.streams.azure-devices.net"
]
}
注意
确保安装 Azure CLI 版本 2.73.0 或更高版本。 可从安装 Azure CLI 页下载最新版本。
允许以出站方式连接到设备流式处理终结点
如本文开头所述,设备在设备流启动过程中创建到 IoT 中心流式处理终结点的出站连接。 设备或其网络上的防火墙必须允许端口 443 上到流式传输网关的出站连接(请注意,通信发生在使用 TLS 加密的 WebSocket 连接上)。
可以在 Azure 门户的 IoT 中心概述窗格中找到与流式处理终结点关联的主机名,如以下屏幕截图所示。
或者,可以使用 Azure CLI 找到此信息,如以下示例所示:
az iot hub devicestream show --name <YourIoTHubName>
注意
确保安装 Azure CLI 版本 2.73.0 或更高版本。 可从安装 Azure CLI 页下载最新版本。
通过设备流资源日志排除故障
可以将 Azure Monitor 设置为收集 IoT 中心发出的 设备流的资源日志 。 此方法在故障排除场景下非常有用。
按照以下步骤创建诊断设置,将 IoT 中心的设备流资源日志发送到 Azure Monitor 日志:
在 Azure 门户中,导航到 IoT 中心。 在左窗格中的“监视”下,选择“诊断设置”。 然后选择“添加诊断设置”。
提供诊断设置的名称,并从日志列表中选择 设备流(预览 )。 然后选择“发送到 Log Analytics 工作区”。 系统会引导你选择现有的 Log Analytics 工作区或创建新的工作区。
创建诊断设置以将设备流资源日志发送到 Log Analytics 工作区后,可以通过在 Azure 门户中 IoT 中心左侧窗格的“监视”下选择“日志”来访问日志。 设备流日志在
AzureDiagnostics
表中显示并具有Category=DeviceStreams
。 在执行操作后,可能需要几分钟时间,日志才会出现在表中。如下所示,日志中还提供目标设备的标识和操作的结果。
若要详细了解如何将 Azure Monitor 与 IoT 中心配合使用,请参阅 “监视 Azure IoT 中心”。 有关可用于 IoT 中心的所有资源日志、指标和表的信息,请参阅 Azure IoT 中心监视数据参考。
区域可用性
在公开预览版发布期间,IoT 中心设备流在“美国中部”、“美国东部 EUAP”、“北欧”和“东南亚”区域提供。 请确保在这其中的一个区域创建中心。
SDK 可用性
每个流的两端(设备端和服务端)使用 IoT 中心 SDK 建立隧道。 在公开预览版中,客户可以选择以下 SDK 语言:
C 和 C# SDK 支持设备端的设备流。
Node.js 和 C# SDK 支持服务端的设备流。