使用 Actian Zen 和 Python 进行嵌入式 IoT 数据库





0/5 (0投票)
我们将探讨如何使用嵌入式数据库 Actian Zen 来存储和处理树莓派上的数据。
引言
过去,嵌入式计算是软件开发领域的一个微小细分市场。硬件昂贵、难以获取,编写软件更是难上加难。幸运的是,这种情况正在改变。随着树莓派等易于使用且价格低廉的嵌入式设备的出现,物联网计算已经进入主流。
虽然不如 Arduino 或 ESP32 设备小巧,但像树莓派这样的微型计算机在尺寸和功耗方面足够小,可以嵌入到气象站等硬件解决方案中。考虑到这一点,我们将探讨如何使用嵌入式数据库 Actian Zen 来存储和处理树莓派上的数据。
为什么需要嵌入式数据库?
像树莓派这样的嵌入式计算机可以连接各种传感器。这些传感器可以测量温度、湿度、风速、光照水平、心率、运动、加速度,甚至氧气和二氧化碳等气体的含量。
持续监测传感器时,嵌入式计算机会生成大量数据。设想一个气象站,它正在测量温度、风速、湿度和气压。如果您每 30 秒读取一次传感器数据,那么您每天将记录数千次测量。
您可以直接设置嵌入式设备,将其所有传感器读数转发到中央服务器进行处理。但您可能不想这样做。像我们假设的气象站这样的嵌入式设备通常运行在偏远地区,使用慢速、不可靠且昂贵的移动互联网连接。
为了确保我们的设备不会占用过多的网络带宽,并且在网络中断时仍然可用,我们需要一种存储和聚合数据的方法。这就是 Actian Zen 的用武之地。让我们看看如何在树莓派上设置 Zen,并用 Python 应用程序从中存储传感器数据。
必备组件
本教程的其余部分将按以下步骤进行
- 您已安装并运行 Raspbian Linux 的树莓派。
- 您能够使用 Linux 终端。您不需要成为专家,因为我会告诉您需要运行的确切命令。
- 您了解基本的SQL命令,如SELECT和INSERT。
安装
要开始,您需要下载 Actian Zen。您可以使用树莓派上的网络浏览器直接下载,或者将 Zen 下载到您的计算机上,然后使用 USB 闪存驱动器将其传输到您的树莓派。
首先加载 Actian 下载页面。在“选择通过产品”下拉框中,选择以下选项
- 产品:Actian Zen 社区版
- 版本:V13 R2 社区版
- 平台:Raspbian ARM 32 位
设置过滤器后,您将在下方看到 Zen Edge v13 R2 社区版。点击它,然后点击蓝色的 HTTP 按钮开始下载。
下载完成后,打开终端。在 Raspbian 上,您可以点击屏幕顶部附近的 图标来执行此操作。
接下来,导航到下载 Actian Zen 的目录。如果您直接在树莓派上下载,请使用以下命令更改到该目录
cd ~/Downloads
运行此命令解压 Zen
sudo tar -C /usr/local -xvf Zen-IoT-Community-Linux-13.30-035.000.armhf.tar.gz
Zen 的安装脚本期望它驻留在/usr/local目录中,因此我们将其解压到那里。接下来,按顺序运行以下命令
sudo apt install unixodbc cd /usr/local/psql/etc sudo ./preinstall.sh sudo ./postinstall.sh
我们首先安装 unixodbc 包。unixodbc 是适用于 Unix 和类 Unix 操作系统的 Open Database Connectivity (ODBC) 驱动程序。ODBC 提供了一种标准的方式供应用程序连接到数据库。我们将使用它从我们的 Python 应用程序访问 Zen。
然后我们更改到解压 Zen 的 psql 目录。最后,我们运行 Zen 的 preinstall 和 postinstall 脚本。Preinstall 检查您的系统是否满足您正在尝试安装的 Zen 版本的要求。如果您下载的是 Raspbian 版本,您不会遇到任何问题。Postinstall 是实现魔法的地方——它创建一个新的 psql 用户,设置 Zen,启动 Zen 守护进程,创建一个 DEMODATA 数据库,然后用示例数据填充演示数据库。
接下来,我们需要以超级用户身份运行更多命令,以使 Zen 可通过 ODBC 访问。请注意:以超级用户身份运行可能很危险——如果我们意外运行删除整个文件系统的命令,Raspbian 会欣然执行。在运行命令之前,请务必仔细检查您输入的命令。
sudo su cd /etc cat /usr/local/psql/etc/odbc.ini >> ./odbc.ini cat /usr/local/psql/etc/odbcinst.ini >> ./odbcinst.ini exit
我们上面所做的一切都是将 Zen 的 ODBC 配置数据附加到我们系统范围的 ODBC 配置文件中。复制配置使得应用程序可以通过 ODBC 定位和连接到 Zen。最后一个退出命令意味着您不再是超级用户。
我们还需要运行一个命令
cat /home/psql/.bashrc >> ~/.bashrc
我们通过将 psql 用户的 Bash 配置文件中的数据附加到我们自己用户的 Bash 配置文件中来完成此操作。这会将 Zen 的共享库添加到我们用户的库加载路径中。没有这一步,我们的 Python 应用程序将无法找到连接到 Zen 所需的库。
Python 应用程序
我们将创建一个 Python 3 应用程序,该应用程序每 15 秒采样一次 CPU 温度数据并将其写入 Zen。我们的应用程序还将演示如何从 Zen 查询聚合数据,这正是您在准备将数据发送到中央服务器时想要做的。
在我们开始编写应用程序之前,我们需要安装一个允许 Python 连接到 ODBC 数据库的包。在您的终端中,运行以下命令
sudo apt install python3-pyodbc
此命令安装 pyodbc 包的预编译版本。完成此操作后,我们就可以编写我们的应用程序了!
首先,打开您选择的文本编辑器。Raspbian 自带 Thonny,这是一个轻量级的 Python IDE。如果您不确定使用什么,Thonny 是一个不错的选择。不过,我不会假定您使用哪种编辑器,因此您可以随意使用其他编辑器。
接下来,为您的新应用程序创建一个目录。我喜欢在我的主目录下创建一个 projects 目录,然后将我的项目保存在其中。您可以通过以下方式做到这一点
mkdir ~/projects mkdir ~/projects/zen-iot cd ~/projects/zen-iot
这些命令会为您的应用程序创建一个新目录,然后将当前目录更改到您的新应用程序目录。请保持此终端窗口打开,因为我们将使用它来运行我们的应用程序。
在您的文本编辑器中,创建一个新文件,并将其保存在您的应用程序目录中,文件名为 setup.py。在其中放入以下代码
import pyodbc conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata" db = pyodbc.connect(conn_str) c = db.cursor() print("Setting up database...") c.execute("DROP TABLE IF EXISTS cpu_data") c.execute("CREATE TABLE cpu_data (id identity, timestamp bigint, temperature real)") c.execute("CREATE INDEX cpu_data_time on cpu_data (timestamp)")
我们首先导入 pyodbc 库。接下来,我们创建一个 ODBC 连接字符串。虽然 ODBC 的完全覆盖超出了本教程的范围,但您可以在此处了解有关 Zen 和 OBDC 的更多信息。
在连接字符串中,您会注意到我们正在使用 Zen 在安装过程中创建的预先存在的 demodata 数据库。在生产应用程序中,您将需要创建一个新数据库。
接下来,我们连接到数据库并发出三个 SQL 命令:一个用于在表已存在时删除表,一个用于创建表,以及一个用于为表添加索引。时间戳上的索引很重要,因为我们将按时间戳查询温度,并且索引确保查找速度很快。
请注意,我们使用 bigint 来存储时间戳,而不是 SQL 日期类型。我们这样做是因为我们将时间戳存储为 Unix 时间。
接下来,在您的应用程序目录中创建一个名为write.py的文件。在其中添加以下代码
import time import sys import subprocess import pyodbc def get_cpu_temperature(): output = subprocess.check_output(["cat","/sys/class/thermal/thermal_zone0/temp"]) temp_value = float(output) / 1000 return temp_value def main(): conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata" db = pyodbc.connect(conn_str) c = db.cursor() insert_command = """INSERT INTO cpu_data VALUES (0, ?, ?)""" while True: current_temp = get_cpu_temperature() print("Saving temperature: {0}".format(current_temp)) timestamp = int(time.time()) c.execute(insert_command, (timestamp, current_temp)) c.commit() c.execute("SELECT COUNT(*) FROM cpu_data") row = c.fetchone() if row: print('Total temperature records:', row[0]) time.sleep(30) return 0 if __name__ == "__main__": sys.exit(main())
我们首先导入 pyodbc 和 Python 标准库的几个部分。
接下来,我们创建一个函数来读取 CPU 温度。由于 Linux 将系统信息暴露为文件系统的一部分,我们将通过 shell 命令执行 cat 命令来读取/sys/class/thermal/thermal_zone0/temp文件。该文件包含以摄氏千分之一度为单位的当前 CPU 温度。要将其转换为度,我们将其除以 1000。
然后,我们进入应用程序的核心部分,即 main 函数。连接字符串和数据库连接与我们在 setup.py 中看到的相同。然后,我们创建一个 SQL 命令,用于将新记录插入数据库。
最后,我们进入一个循环,该循环获取当前温度,将其写入数据库,然后等待 30 秒。这使我们拥有一个可以永远运行并每 30 秒将 CPU 温度记录到数据库的应用程序。在生产物联网 Linux 应用程序中,您通常会将应用程序设置为 systemd 服务。这样可以轻松确保您的应用程序在 IoT 设备启动时自动启动,并在崩溃时自动重启。
我们还有最后一段代码要添加。在您的应用程序目录中,创建一个名为read.py的文件,并在其中输入以下代码
import pyodbc import time conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata" db = pyodbc.connect(conn_str) c = db.cursor() five_mins_ago = int(time.time()) - 300 query = "SELECT AVG (temperature) FROM cpu_data WHERE timestamp > ?" result = c.execute(query, (five_mins_ago,)) row = result.fetchone() if row: print("Average temperature over past 5 minutes: {0}".format(row[0]))
在这里,我们连接到数据库,计算五分钟前的 Unix 时间戳,然后运行一个 SQL 命令来获取过去五分钟内的平均 CPU 温度。然后我们将此值输出到终端。
在实际的物联网应用程序中,您将希望将这些数据发送到云端或私有服务器。如前所述,能够在传输到中央位置之前聚合数据并对其进行任何必要的计算,正是我们希望在物联网应用程序中使用类似 Zen 的数据库的原因。
要运行我们创建的应用程序,请从您的应用程序目录运行以下命令
python3 setup.py python3 write.py
让它运行 5-10 分钟,将一些温度数据保存到 Zen。之后,按键盘上的 CTRL-Z 终止应用程序。
最后,运行
python3 read.py
您将看到您的树莓派在过去五分钟内的平均 CPU 温度。
现在您已经准备就绪,可以考虑使用 Zen 在树莓派上存储和处理更复杂的传感器数据。如果您不确定从哪里开始,树莓派有很多价格实惠的传感器套件。有如此多有趣的传感器可供选择,您一定会想出一些很棒的东西!