树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案

一、项目概述

随着物联网(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. 系统架构图

Cloud 数据采集 消息传递 存储数据 提供数据 HTTP请求 可选数据转发 AWS IoT 传感器设备 MQTT代理 树莓派边缘计算网关 SQLite数据库 Flask Web服务 用户界面

三、环境搭建

1. 安装Raspberry Pi OS

  1. 下载Raspberry Pi Imager并安装。

  2. 使用Raspberry Pi Imager将Raspberry Pi OS写入SD卡。

  3. 将SD卡插入树莓派,连接显示器和电源,启动树莓派。

2. 更新系统

运行以下命令更新系统:

bash 复制代码
sudo apt updatesudo apt upgrade -y

3. 安装Python和依赖库

树莓派通常预装Python,但我们需要安装一些额外的库。

bash 复制代码
sudo apt install python3 python3-pip -ysudo pip3 install paho-mqtt flask

4. 安装并配置Eclipse Mosquitto

bash 复制代码
sudo apt install mosquitto mosquitto-clients -y

启动Mosquitto服务:

bash 复制代码
sudo systemctl start mosquittosudo systemctl enable mosquitto

5. 安装SQLite

bash 复制代码
sudo apt install sqlite3 libsqlite3-dev -y

四、代码实现

1. 数据采集模块

在上面的代码中,我们已经完成了读取DHT11传感器数据并将其发布到MQTT代理的功能。接下来,我们需要将此脚本保存并运行。

保存并运行数据采集脚本
  1. 在树莓派上创建一个Python脚本文件,例如 sensor_data.py

    bash 复制代码
    nano sensor_data.py
  2. 将以下代码粘贴到文件中:

python 复制代码
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)
  1. 保存并退出编辑器(在nano中按 CTRL + X,然后按 Y 确认保存)。

  2. 运行Python脚本:

    bash 复制代码
    python3 sensor_data.py

2. 创建Web服务模块

接下来,我们将创建一个简单的Flask Web服务,用于展示传感器数据。

创建Flask应用
  1. 创建一个新的Python文件,例如 app.py

    bash 复制代码
    nano app.py
  2. 将以下代码粘贴到文件中:

python 复制代码
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)
  1. 保存并退出编辑器。

3. 数据存储模块

为了将传感器数据存储到SQLite数据库中,我们需要在数据采集模块中添加数据库写入的逻辑。

修改数据采集模块以支持SQLite

sensor_data.py 中,添加数据库写入功能:

python 复制代码
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服务,以便我们可以通过浏览器访问传感器数据。

  1. 运行Flask应用:

    bash 复制代码
    python3 app.py
  2. 在浏览器中访问 http://<树莓派的IP地址>:5000/data,你应该能够看到从传感器采集到的温度和湿度数据的JSON格式输出。这些数据是从SQLite数据库中读取的。

    例如,输出可能如下所示:

    bash 复制代码
    [
    {"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客户端订阅传感器数据主题。

  1. 在另一个终端中,使用Mosquitto客户端进行订阅:

    bash 复制代码
    mosquitto_sub -h localhost -t sensor/data
  2. 你应该能够看到来自传感器的数据实时打印在终端中。

五、项目总结

在本项目中,我们成功地使用树莓派构建了一个多协议的边缘计算网关,涉及以下关键步骤:

  1. 硬件和软件环境搭建:我们选择了树莓派4B作为控制单元,并安装了Raspberry Pi OS。通过安装Python及其相关库,确保了系统的正常运行。

  2. 数据采集模块:通过DHT11传感器实时采集温度和湿度数据,并将这些数据通过MQTT协议发送到本地的Mosquitto代理。

  3. 数据存储模块:使用SQLite数据库存储传感器数据,并确保数据持久性。

  4. Web服务模块:通过Flask框架创建Web服务,以便用户可以通过HTTP请求获取传感器的历史数据。

  5. 测试和验证:通过MQTT客户端订阅消息和通过浏览器访问Web服务,验证了整个系统的功能和数据流的正确性。

相关推荐
醉后才知酒浓22 分钟前
图像处理之蒸馏
图像处理·人工智能·深度学习·计算机视觉
合宙Luat1 小时前
合宙LuatOS开发板Core_Air780EP使用说明
单片机·嵌入式硬件·物联网·硬件工程·lua
爱打lan球的程序员1 小时前
redis分布式锁和lua脚本
数据库·redis·分布式
炸弹气旋1 小时前
基于CNN卷积神经网络迁移学习的图像识别实现
人工智能·深度学习·神经网络·计算机视觉·cnn·自动驾驶·迁移学习
python_知世1 小时前
时下改变AI的6大NLP语言模型
人工智能·深度学习·自然语言处理·nlp·大语言模型·ai大模型·大模型应用
愤怒的可乐1 小时前
Sentence-BERT实现文本匹配【CoSENT损失】
人工智能·深度学习·bert
冻感糕人~1 小时前
HRGraph: 利用大型语言模型(LLMs)构建基于信息传播的HR数据知识图谱与职位推荐
人工智能·深度学习·自然语言处理·知识图谱·ai大模型·llms·大模型应用
花生糖@1 小时前
Midjourney即将推出的AI生视频产品:CEO洞见分享
人工智能·ai·aigc·midjourney
小言从不摸鱼1 小时前
【NLP自然语言处理】文本处理的基本方法
人工智能·python·自然语言处理
说书客啊1 小时前
计算机毕业设计 | springboot旅行旅游网站管理系统(附源码)
java·数据库·spring boot·后端·毕业设计·课程设计·旅游