将数据从处理和发布中提取出来

物联网 树莓派 传感器
2021-06-21 08:15:54

我正在做一个涉及树莓派和加速度计传感器 ADXL355 的项目。树莓派的职责是从传感器获取数据,仅过滤有用的数据并将其发布到云上的 thingsboard.io 实例。所有不同的设备都由电池供电,由太阳能电池板充电并由 Raspberry 监控。

到目前为止,这是我的设置:

当前设置

此设置工作正常,但我想增加获取数据的可靠性。获取和处理每个数据点对我来说至关重要。这种设置不允许我在 linux 操作系统上安全操作而不可能干扰获取数据的过程。我希望能够在不丢失数据的情况下重新启动树莓派。

传感器提供先进先出缓冲功能:它将在内部缓冲区中保存多达 32 (xyz) 个数据点,但考虑到采样率可能高达 1KHz,这给我留下了 32 毫秒的缓冲区,这远远不够以维持可能的新固件部署或 Raspberry 操作系统的重启。

有时(即使我应用了RT 补丁)并将获取数据的程序的优先级设置为尽可能高,我看到在程序获取其上下文之前最多 18 毫秒的时间间隔(我假设来自某些内核中断例程?),我担心可能会发生间隔变得大于我拥有的 32 毫秒缓冲区并可能丢失数据的情况。


我想知道的是,将数据提取与所述数据的传输和处理分离的最佳实践是什么?

我想到的是将传感器移动到专用的 Arduino 板中,该板运行裸机固件,尽可能少地负责获取数据、分配时间戳、保存数据。

可能的方法

使用这种方法,我不知道在不干扰获取数据的程序的情况下访问缓冲区。是否有任何特定组件可以解决我的问题?就像某种可以被不同“用户”同时访问的内存组件?该缓冲区应该能够保存至少 1GB 的数据,以弥补可能的 24 小时停机时间窗口。

2个回答

我想您当前的数据获取是在用户空间进程中,但是如果您看到调度问题,您可以考虑通过在 C 中为您的传感器实现内核驱动程序将数据获取移动到内核空间。该驱动程序可以实现比传感器本身提供。

最重要的是,可以有一个用户空间应用程序可以执行对时间不敏感的处理,并且如果上行链路连接不可用,它可以执行数据备份。在这里也可以使用文件系统存储 1 GB 的数据。

关于 Raspberry Pi 上的重启和操作系统更新,同时从传感器获取数据是一项艰巨的任务。在这种情况下,您肯定需要带有微控制器的额外硬件,它仍然可以读取传感器并存储数据并充当缓冲区。不需要第三个缓冲模块,微控制器应该是缓冲器。根据重新启动时间,您可能需要向微控制器添加额外的内存容量才能覆盖整个持续时间。

另一方面,在这里存储 1 GB 数据是一个不同的级别,因此该单元仅用于覆盖 Raspberry 的重启时间,仅此而已。如果没有上行链路,Raspberry Pi 仍应自行存储数据,然后可以在连接恢复时发送。

就我个人而言,我认为您不应该涵盖重新启动和操作系统升级,因为当应用程序最终确定和部署时,这些不应该经常发生。(在开发过程中,我认为丢失一些数据应该无关紧要。)应该记录定期更新和重启,这些操作会影响流量,应该作为维护任务执行。期间系统无法运行。但如果这是要求,那么这就是要求。我明白,那么它是额外的硬件,但您不必考虑编写内核驱动程序。

我也同意@jstola 的观点,即最简单的方法是获取支持 WiFi 的模块并将其与传感器连接,从而消除 RPi 的复杂性和笨重性。OTA(无线)编程通常由开发平台的公司支持,您可以从中选择。使用 Arduino 的 ESP 也有 OTA 编程支持,因此您将有很多 CI/CD 选择。根据您迄今为止分享的有关您的应用程序的信息,我认为您甚至不需要在操作系统上。

也许您可以让 arduino 处于两种模式之一。

  • 默认的直通模式,它只是发送它从传感器获得的信息

  • 一种聚合模式,它采用加速度计输入并计算净位移(或您需要的任何最终结果)。

当 pi 想要重启时,它可以在重启期间将 arduino 置于聚合模式。

为了解决偶尔丢失值的问题,可以在arduino中实现一个循环缓冲区并用序列号标记读数。也许 0-127 的 seq 范围就足够了?你的 arduino 只有 8k RAM 吗?