树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
随着物联网(IoT)的快速发展,边缘计算的应用越来越广泛。边缘计算可以将数据处理和分析推向离数据源更近的地方,从而降低延迟,提高效率。本文将介绍如何利用树莓派构建一个多协议边缘计算网关,以支持各种传感器和设备的连接和数据传输。该项目的主要目标是实现一个边缘网关,能够通过不同的通信协议(如MQTT、HTTP、CoAP等)采集和处理来自传感器的数据,并将这些数据发送至云端或本地数据库进行存储和分析。
一、项目概述
随着物联网(IoT)的快速发展,边缘计算的应用越来越广泛。边缘计算可以将数据处理和分析推向离数据源更近的地方,从而降低延迟,提高效率。本文将介绍如何利用树莓派构建一个多协议边缘计算网关,以支持各种传感器和设备的连接和数据传输。
该项目的主要目标是实现一个边缘网关,能够通过不同的通信协议(如MQTT、HTTP、CoAP等)采集和处理来自传感器的数据,并将这些数据发送至云端或本地数据库进行存储和分析。
二、系统架构
1. 硬件选型
-
主控单元:树莓派4B
-
传感器:温度传感器(如DHT11)、湿度传感器、运动传感器等
-
其他模块:Wi-Fi和蓝牙模块(树莓派4B内置)
2. 通信协议
-
MQTT:用于轻量级的设备间消息传递。
-
HTTP/HTTPS:用于与云服务或Web应用程序的交互。
-
CoAP:用于低功耗设备的通信。
3. 技术栈
-
操作系统:Raspberry Pi OS
-
编程语言:Python
-
数据库:SQLite(用于本地数据存储)
-
中间件:Eclipse Mosquitto(MQTT代理)
-
云平台:AWS IoT(可选)
4. 系统架构图
三、环境搭建
1. 安装Raspberry Pi OS
-
下载Raspberry Pi Imager并安装。
-
使用Raspberry Pi Imager将Raspberry Pi OS写入SD卡。
-
将SD卡插入树莓派,连接显示器和电源,启动树莓派。
2. 更新系统
运行以下命令更新系统:
sudo apt updatesudo apt upgrade -y
3. 安装Python和依赖库
树莓派通常预装Python,但我们需要安装一些额外的库。
sudo apt install python3 python3-pip -ysudo pip3 install paho-mqtt flask
4. 安装并配置Eclipse Mosquitto
sudo apt install mosquitto mosquitto-clients -y
启动Mosquitto服务:
sudo systemctl start mosquittosudo systemctl enable mosquitto
5. 安装SQLite
sudo apt install sqlite3 libsqlite3-dev -y
四、代码实现
1. 数据采集模块
在上面的代码中,我们已经完成了读取DHT11传感器数据并将其发布到MQTT代理的功能。接下来,我们需要将此脚本保存并运行。
保存并运行数据采集脚本
-
在树莓派上创建一个Python脚本文件,例如
sensor_data.py
。nano sensor_data.py
-
将以下代码粘贴到文件中:
import Adafruit_DHT
import paho.mqtt.client as mqtt
import time
\# 设置传感器类型和GPIO引脚
sensor = Adafruit_DHT.DHT11
pin = 4 # GPIO引脚编号
\# MQTT设置
mqtt_broker = "localhost" # 本地Mosquitto代理
mqtt_topic = "sensor/data"
\# 创建MQTT客户端
client = mqtt.Client()
client.connect(mqtt_broker)
while True:
# 读取传感器数据
humidity, temperature = Adafruit\_DHT.read\_retry(sensor, pin)
if humidity is not None and temperature is not None:
# 构建消息
message = f"Temperature: {temperature}°C, Humidity: {humidity}%"
print(message)
# 发布到MQTT
client.publish(mqtt_topic, message)
else:
print("Failed to retrieve data from the sensor.")
# 每10秒读取一次数据
time.sleep(10)
-
保存并退出编辑器(在nano中按
CTRL + X
,然后按Y
确认保存)。 -
运行Python脚本:
python3 sensor_data.py
2. 创建Web服务模块
接下来,我们将创建一个简单的Flask Web服务,用于展示传感器数据。
创建Flask应用
-
创建一个新的Python文件,例如
app.py
:nano app.py
-
将以下代码粘贴到文件中:
from flask import Flask, jsonify
import sqlite3
app = Flask(__name__)
# 数据库连接函数
def get_db_connection():
conn = sqlite3.connect('sensor_data.db')
conn.row_factory = sqlite3.Row
return conn
@app.route('/data', methods=['GET'])
def get_data():
conn = get_db_connection()
data = conn.execute('SELECT * FROM readings ORDER BY id DESC').fetchall()
conn.close()
return jsonify([dict(row) for row in data])
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
- 保存并退出编辑器。
3. 数据存储模块
为了将传感器数据存储到SQLite数据库中,我们需要在数据采集模块中添加数据库写入的逻辑。
修改数据采集模块以支持SQLite
在 sensor_data.py
中,添加数据库写入功能:
import Adafruit_DHT
import paho.mqtt.client as mqtt
import time
import sqlite3
# 设置传感器类型和GPIO引脚
sensor = Adafruit_DHT.DHT11
pin = 4 # GPIO引脚编号
# MQTT设置
mqtt_broker = "localhost" # 本地Mosquitto代理
mqtt_topic = "sensor/data"
# 创建MQTT客户端
client = mqtt.Client()
client.connect(mqtt_broker)
# 数据库连接函数
def get_db_connection():
conn = sqlite3.connect('sensor_data.db')
return conn
# 创建表(如果不存在)
conn = get_db_connection()
conn.execute('''
CREATE TABLE IF NOT EXISTS readings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
temperature REAL,
humidity REAL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
''')
conn.close()
while True:
# 读取传感器数据
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
# 保存数据到SQLite数据库
conn = get_db_connection()
conn.execute('INSERT INTO readings (temperature, humidity) VALUES (?, ?)',
(temperature, humidity))
conn.commit()
conn.close()
# 构建消息
message = f"Temperature: {temperature}°C, Humidity: {humidity}%"
print(message)
# 发布到MQTT
client.publish(mqtt_topic, message)
else:
print("Failed to retrieve data from the sensor.")
# 每10秒读取一次数据
time.sleep(10)
四、代码实现
4. 启动Web服务
在终端中启动Flask Web服务,以便我们可以通过浏览器访问传感器数据。
-
运行Flask应用:
python3 app.py
-
在浏览器中访问
http://<树莓派的IP地址>:5000/data
,你应该能够看到从传感器采集到的温度和湿度数据的JSON格式输出。这些数据是从SQLite数据库中读取的。例如,输出可能如下所示:
[ {"id": 1, "temperature": 22.0, "humidity": 45.0, "timestamp": "2024-08-04 12:01:22"}, {"id": 2, "temperature": 23.0, "humidity": 50.0, "timestamp": "2024-08-04 12:01:32"}, ... ]
5. 测试MQTT功能
为了验证MQTT功能的正常工作,可以使用MQTT客户端订阅传感器数据主题。
-
在另一个终端中,使用Mosquitto客户端进行订阅:
mosquitto_sub -h localhost -t sensor/data
-
你应该能够看到来自传感器的数据实时打印在终端中。
五、项目总结
在本项目中,我们成功地使用树莓派构建了一个多协议的边缘计算网关,涉及以下关键步骤:
-
硬件和软件环境搭建:我们选择了树莓派4B作为控制单元,并安装了Raspberry Pi OS。通过安装Python及其相关库,确保了系统的正常运行。
-
数据采集模块:通过DHT11传感器实时采集温度和湿度数据,并将这些数据通过MQTT协议发送到本地的Mosquitto代理。
-
数据存储模块:使用SQLite数据库存储传感器数据,并确保数据持久性。
-
Web服务模块:通过Flask框架创建Web服务,以便用户可以通过HTTP请求获取传感器的历史数据。
-
测试和验证:通过MQTT客户端订阅消息和通过浏览器访问Web服务,验证了整个系统的功能和数据流的正确性。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)