为物联网设备创建自己的个人云需要什么?

物联网 联网 微控制器
2021-06-19 22:48:51

这是我一直在思考的一个主题,特别是因为“物联网”的概念最近一直在流传。

我将从我说“物联网”时的意思开始我知道物联网这个词可能有不同的含义,而且有时会被误用。它可能是一个没有明确定义的术语,并可能导致围绕它的确切含义进行大讨论,我自己不知道该术语的正确和广泛接受的定义。所以对我来说,物联网是一个概念,这个概念定义了从另一个嵌入式设备或手机通过互联网远程连接到嵌入式设备的能力就如此容易。

在这种情况下,连接的目的并不重要,如果您可以将办公室中的一台设备与家中的另一台设备连接,或者您是否可以通过手机连接家中的一台设备,所有这些都通过互联网,那么我们谈论的是 IoT 设备(嵌入式设备,而不是电话)。

因此,在同意我所说的 IoT 之后,我现在将描述我正在努力实现的目标。

我试图实现的正是我在物联网定义中所描述的。

我想让家里的一个或多个嵌入式设备通过以太网或 wifi 连接到我的互联网路由器,并且能够通过远程位置的另一个嵌入式设备远程连接到它们(远程我的意思是不在同一个网络上)也许还可以通过我手机上的监控应用程序连接到他们

例如,我可能有一个简单的嵌入式设备充当开/关开关,连接到我的车库门开启器,另一个嵌入式设备充当我办公桌上的大红色按钮,以便我可以按下办公桌上的红色按钮车库门打开了。

另一个例子是拥有一个具有 ADC 功能的嵌入式设备,它可以监控我家的温度,并在达到阈值时向我发送警报。通知可以通过一个简单的 Android 应用程序接收,也可以通过另一个带有小屏幕的嵌入式设备在我工作的办公桌上接收。

这些示例可能很愚蠢,但只是为了说明我试图实现的可能场景和用例。最后,想法是一样的,通过互联网将一个嵌入式设备与另一个嵌入式设备连接起来。

还有一点需要澄清的是,这些设备之间的数据交换将非常轻量级,每次只有几个字节,而不是设备之间需要数百千字节的数据交换。

此外,我所指的“嵌入式设备”是基于 100MHz 或 200MHz cortex-m4 微控制器的简单但功能强大的设备。澄清这一点很重要,因为这些设备上不会运行任何 Linux 或复杂的库。最后,仅仅为了打开和关闭灯泡而拥有运行 Linux 的强大处理器是一种资源浪费,完全没有必要无论如何,我打算使用 BeagleBoard、Raspberry Pi 或任何其他类似的板作为我的嵌入式设备。只是微控制器,因为不需要比这更复杂的。

我对物联网平台和那些复杂的解决方案知之甚少。当我开始寻找通过互联网将一个嵌入式设备与另一个嵌入式设备连接的方法时,我偶然发现了几个提供物联网服务的站点。

我知道有一些物联网云服务,例如:

仅举几个。这些的主要问题是成本和复杂性。你必须付费才能获得这些服务,而且你必须学习如何实现他们拥有的所有服务,以防万一你需要它们,还有他们的 API 和一堆其他对我来说似乎没有必要的东西只能在设备之间交换一些字节。我只是想要一些比这更简单的东西,一些我自己可以做的事情。

你可能会说实现我自己的“云”,如果这是我必须做的事情,并不简单,有时为了简单起见最好使用这些类型的服务,但我想知道有两个主要原因实施我自己的物联网服务。

主要原因是我想自己做。我不想依赖第 3 方将我的设备相互连接起来,因为我将为我的设备开发代码和硬件,所以最好也创建我自己的方法将它们连接为 IoT 设备。

第二个原因是学习如何去做。通过了解实现这一目标所需的所有必要事项,我将对物联网世界有更好的了解。

另外,我想提一下,我精通 C 并且我在工作和家里都使用 Linux 作为我的日常操作系统,所以请避免使用 Windows 的东西,因为那对我没用。我不害怕我必须在 C 中为我的嵌入式设备或在 Linux 上实现的任何东西来实现实现我的目标所需的任何东西。

所以我的问题是,为了在它们之间进行数据交换,需要实现什么,以及在哪里能够将两个或多个嵌入式设备相互连接?

这个问题我可以用什么来在我们自己的服务器上创建物联网?有类似的东西但已关闭并且没有任何答案,还假设要使用现有的云基础架构。所以它对我没有帮助。

一篇文章哪些物联网服务可用于在云中存储/发送/发布通用数据?有一个类似的问题,但 OP 明确要求提供物联网服务,我正试图避免这些。

3个回答

也许我错过了问题的重点,但我认为这是回答的良好开端。

你至少需要三样东西。

  1. 一个永远在线的计算节点,用于聚合您的数据。这不需要很强大,它可以是在您的 NAS 上运行的进程,甚至(理论上)在您的路由器上运行。为简单起见,假设它是 Raspberry Pi。这也可以提供您决定在未来支持的任何花哨的无线电协议。尽管理论上您可以在所有节点都暴露于 Internet 的情况下运行点对点,但指定一个节点作为主节点并让其处理数据整理和发布(向应用程序/用户)更容易。当然,集线器也可以是一个节点,特别是如果您使用功能中等的 WiFi 节点。
  2. 一个合适的软件堆栈,允许端点将其数据提交到您的中心节点。 是你在这里需要的那种东西,加上一个操作系统来运行它。
  3. DNS 和端口转发,以方便从更广泛的互联网访问您的服务器。

然后不要忘记安全。通过这样做,您将更接近于打开家庭网络上的所有内容以进行攻击。也许只有一点点,但意识到风险是件好事。您可以尝试并小心处理,但请务必假设您会犯错误。

轻量级设备和几个字节的日期率要求使用MQTT,正如已经提到的。您的传感器节点可以基于独立的 ESP8266 模块,这些模块功能强大到足以托管 MQTT 客户端实现。或者,您可以简单地将这些模块与外部微控制器一起用作 AT 命令控制的 Wi-Fi 模块。

您可以在功能较弱的微控制器上实现您自己的 MQTT 解决方案,例如使用带有 4 kB 闪存的 Atmega48V 的人

您可以在计算机上托管代理,但运行 Raspberry Pi 会更节能。同样,如果您喜欢编码,您可以实现自己的 MQTT 代理。我个人发现Mosquitto非常适合此目的。

缺点是所有传感器节点都需要 TCP/IP 连接。


电池友好的解决方案可能是使用支持LoraWANZigBee 的传感器/执行器节点,并在 Raspberry/BeagleBone 上实现网关,该网关也可以托管一个简单的 Web 服务器,可以从您的手机或其他设备访问。


在每种情况下,归根结底都是让您的集线器、网关或服务器可以在您的专用网络之外访问。有更多方法可以做到这一点,主要关注点始终是安全性。这是我认为风险最大的部分。

@Sean 很好地总结了基本要求。

您已经质疑了之前关于控制器/集线器需求的两个答案。考虑到要使事情发生,您需要存在规则。如果你想按下一个红色的大按钮来打开车库门,一些规则必须将传感器(按钮)与所需的动作(打开门)联系起来。有两种方法可以实现这一点:您可以将规则直接放在按钮中,或者您可以将规则放在单独的计算机中。

让我们更多地考虑直接解决方案。如果您教按钮有关车库门的知识,那么您的按钮内部就有规则。该按钮需要车库门的 ID,因此如果您更换车库门,该按钮将不起作用。如果按钮在您的办公桌上,并且您的房子使用专有网络,则按钮必须知道您家网关的地址和门的地址。按钮需要知道特定的协议来指示您的门打开 - 所有制造商都制造了解所有门信号的兼容按钮吗?除非您重新编程,否则按钮不能做任何其他事情 - 您是否有用于按钮芯片的闪存编程器,并且该编程器是否与任何其他设备兼容?如果你想让车库门打开,5分钟后关闭,您的按钮需要维护实时时钟的所有复杂性。您的按钮不会知道门的状态,因此很难知道您是关门还是开门。你如何备份规则,以便如果你的按钮坏了,你的替换按钮可以完成这项工作?从好的方面来说,这听起来很便宜:您不需要单独的计算机。

有了控制器,事情就不一样了。来自所有传感器的所有消息都传送到控制器。每个传感器都很简单:将信号发送到控制器。然后,控制器可以将所需的任何输入应用于非常复杂的规则:它可以检查阳光传感器,除非天黑,否则不打开室外灯,或者如果当月的平均降雨量高于平均水平且当前温度高于平均水平,则不运行洒水器比平均水平低五度。控制器可以跟踪状态。如果您想要一个“关闭车库门”按钮而不是“打开车库门”按钮,这可能很重要(当我不在家时,我很少想打开门,但如果它是,我肯定想关闭它不小心打开了。)

控制器可以为知道如何听按钮的设备驱动程序和知道如何对门说话的其他驱动程序提供场所。与隐藏在按钮内的微型芯片相比,控制器可能更易于升级到新设备和设备类型。

控制器还可以为基础设施任务提供更复杂的逻辑,例如通过提供特定级别的服务来传递消息。例如,MQTT 协议允许三个不同的级别:尝试传递消息一次,重复传递直到至少被看到一次,或者传递一次且仅传递一次。

控制器提供了一个架构上的逻辑位置来整合所有进出通信网关的消息,允许使用外部接口。这意味着您的按钮和手机都可以发送信号,并且规则可以确定允许其中任何一个打开车库门。网关还可以提供安全性。您不必将按钮和车库门放在互联网上;您可以将它们都放在专用隔离网络上,并使用网关来传输信号。控制器还提供单点来备份系统的所有规则。

控制器的缺点是增加了延迟和额外的复杂性。令人惊讶的是,控制器并没有显着增加成本。您可以在 Raspberry Pi 上实现一个控制器,其成本低于一个普通远程可控灯开关的成本。不要仅仅根据成本就打折这个想法。