是否可以通过 Internet 从远程 Web 服务器访问 IoT 设备(可能是 HTTP REST 客户端或 MQTT 客户端)并使用 IP 将文本发送到该特定设备(而不是在 MQTT 的情况下通过主题广播消息)设备地址?本文描述了物联网设备具有 IP 地址(路由器分配给物联网设备的私有 IP)。在这种情况下,如何从 Web 服务器看到设备?
注意:1-3 台设备将位于路由器后面的家庭网络上,消费者在技术上无法设置端口转发等内容。
是否可以通过 Internet 从远程 Web 服务器访问 IoT 设备(可能是 HTTP REST 客户端或 MQTT 客户端)并使用 IP 将文本发送到该特定设备(而不是在 MQTT 的情况下通过主题广播消息)设备地址?本文描述了物联网设备具有 IP 地址(路由器分配给物联网设备的私有 IP)。在这种情况下,如何从 Web 服务器看到设备?
注意:1-3 台设备将位于路由器后面的家庭网络上,消费者在技术上无法设置端口转发等内容。
因此,对您的问题的简短回答是否定的,您无法向所描述的设备发出 HTTP 请求。
原因是为了直接访问设备,客户端(此时您的中央云应用程序将是 HTTP 客户端)需要了解以下内容:
在您所描述的情况下,您两者都没有。您没有可公开路由的 IP 地址,因为该设备具有无法路由到的私有 (RFC 1918) IP 地址。如果您在路由器上为此设备设置端口转发,则可以使用路由器的外部 IP 地址,但由于大多数家庭宽带提供商不提供固定的 IPv4 地址,因此该地址不会是静态的,并且随时可能发生变化路由器重新启动。您可以让设备在路由器重新启动后每次重新获得网络访问权限时报告,让中央服务知道 IP 地址,但这意味着保留设备位置的实时列表。
您不能使用正常的端口转发有两个原因:
有一种解决方案允许设备设置自己的端口转发,称为 UPnP(通用即插即用),但这需要路由器支持此功能,并且在很大程度上被认为是一个安全漏洞,建议大多数人禁用它.
以上所有就是为什么像 MQTT 这样的协议是物联网设备的事实上的标准。因为设备连接到 MQTT 代理,然后无限期地保持该连接打开,所以避免了我概述的所有问题。
出站连接意味着无需保留设备连接详细信息列表,无需设置任何端口转发,对每个 NAT 路由器后面的设备数量没有限制,无需担心路由器的公共 IP 地址路由器变化。
每个设备订阅特定于其自身的主题(例如,基于设备序列号)并且因此可以接收专门针对该设备的消息,它也可以订阅允许广播类型消息传递的更一般的主题。
如果您的设备运行 Linux 发行版(如 Raspberry Pi),您可以设置反向 SSH 隧道,这样您就可以访问您的设备,即使它位于路由器后面。
这里的问题是您的设备必须启动连接,打开通往服务器的隧道。然后就可以通过服务器连接到设备了。因此,您可以向设备发送一条消息(通过 MQTT 或 HTTP),指示它应该打开反向隧道。
如果您使用的是微控制器(Arduino、ESP8266 等),则必须手动广播您想要的消息,别无选择。