树莓、智能手机和第三方设备网络的高效服务器和协议结构

物联网 MQTT 联网 树莓派 无线上网 阿杜伊诺
2021-06-12 07:44:24

我是这个论坛和这个领域的新手。我期待着良好的批评和教程/链接/指导建议,以尽可能少的努力构建一个好的系统,同时实现我想要的所有东西。


情况

我现在正在研究具有以下设计的传感器系统: 设计已经可扩展,但仍然是所有内部sensorik 系统。

主要枢纽是树莓派(最新的 v3)。

  • 托管 MQTT-Server 以保存消息传输
  • 托管基于 Python(套接字)的服务器,用于与 arduinos 通信(因此:传感器)
  • 主机数据存储
  • 使用 Kivy 托管 GUI(漂亮整洁)

Arduinos(纳米)直接控制传感器/执行器/等:

  • 通过 I²C 连接
  • 握手协议交换可能的功能
  • 从 Python 服务器接收情况依赖于不同的脚本

raspicam (v2):

  • 提供可以预览或存储的图像流。

项目状态:我从一个更简单的方法开始,没有使用任何服务器。因此,目前只有 1 个主程序 (Kivy-Gui) 具有所有相关代码和接口。我正在使用 Pi-camera 模块,Arduinos 通过 I²C 接口连接到 pi。它运作良好。:)


那么,如果一切基本上都已经在一台机器上运行了,为什么还要这么麻烦呢?

简单地说:我想重新调整整个设置。将有:

  • 多个树莓派,每个树莓派都有自己的一组传感器
  • 用于 GUI/人机交互的外部(智能手机)
  • 外部(网络)存储
  • (可选)第 3 方设备,例如用于进一步感应或 IP 摄像头或...

因此我需要补充:

  • Raspberry #1 上的mQTT 服务器
  • Raspberry #2 上的wifi 集线器
  • 在每个 Raspberry 上托管和执行 Python-(套接字)服务器的脚本
  • 网络流服务器到每个 Raspberry 上的ip-stream Raspicam 视频等到外部 GUI
  • 网络驱动器来存储来自不同系统的数据

最后,我希望仍然有可能将屏幕连接到其中一个树莓上并直接在其上运行 GUI。因此,我将通过外包执行代码来修改我现有的 GUI。有可能直接在选择的 raspi 上运行 GUI 固有地导致新设置的各种问题。仅提及 1:将 Raspicam 数据流式传输到 ip 并使用流式设备读取它可能很慢或不可能。在这里(例如)我正在考虑实施一种解决方法,如果主题订阅者和内容发布者是同一设备,则使用由 MQTT 决定的不同代码。


我的问题:

您如何看待此设置在不同任务方面的速度和效率?你认为我的推理和方法有什么重大错误吗?由于 Arduinos 具有正确使用的 init 例程,因此每个树莓派运行 1 个实例并将所有参数等作为活动对象是很好的。您是否看到比编写自己的 Python 服务器更高效、更稳定、更快速的方法?例如,我阅读了有关为此使用 node.js 的信息,但这可能会导致 arduino 握手问题...

1个回答

查看您的设计图,我假设这就是您正在考虑构建的(注意某些部分已经存在)。我将尝试在此基础上回答。

您如何看待此设置在不同任务方面的速度和效率?可能会好很多。

你看到我的推理和方法有什么重大错误吗?是的。

我注意到的第一件事是您没有充分利用 MQTT。MQTT 是一个消息代理,并且是一个非常好的和快速的代理。考虑将其移动到不同传感器、计算机、服务器、电话等之间所有通信的中心。让一切都在谈论 MQTT。

围绕传感器创建一个主题结构,例如:

house/location/device_type/

其次是输入或输出,输入是设备侦听消息,输出是设备发送消息的地方。这将允许其他事物通过主题通配符方法收听他们感兴趣的内容,例如收听您使用的房子/+/湿度/室外的所有湿度传感器,因此将接收任何湿度读数。

使用此模型,您可以拥有一个监听和记录数据的数据库。一个向灯发送开/关消息的 Web GUI,一个监听温度传感器的空调。它打开了你的选择。请注意,MQTT 代理可以在与数据存储和 gui 相同的 RPi 上运行,但是它们应该通过 MQTT 进行通信

由于 Arduinos 具有正确使用的 init 例程,因此每个树莓派运行 1 个实例并将所有参数等作为活动对象是很好的。您是否看到了比编写自己的 python 服务器更高效、稳定和更快的代码方法?正如上一个问题的答案中所建议的那样,我会让 Arduino(假设它们实际上是 ESP)直接使用 MQTT,而他们非常有能力做到这一点。