当前位置: 首页 > news >正文

树莓派边缘计算网关搭建:集成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. 更新系统

运行以下命令更新系统:

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代理的功能。接下来,我们需要将此脚本保存并运行。

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

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

import Adafruit_DHTimport paho.mqtt.client as mqttimport time\# 设置传感器类型和GPIO引脚sensor = Adafruit_DHT.DHT11pin = 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)# 发布到MQTTclient.publish(mqtt_topic, message)else:print("Failed to retrieve data from the sensor.")# 每10秒读取一次数据time.sleep(10)
  1. 保存并退出编辑器(在nano中按 CTRL + X,然后按 Y 确认保存)。

  2. 运行Python脚本:

    python3 sensor_data.py
    

2. 创建Web服务模块

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

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

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

from flask import Flask, jsonify
import sqlite3app = Flask(__name__)
# 数据库连接函数
def get_db_connection():conn = sqlite3.connect('sensor_data.db')conn.row_factory = sqlite3.Rowreturn 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 中,添加数据库写入功能:

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)# 发布到MQTTclient.publish(mqtt_topic, message)else:print("Failed to retrieve data from the sensor.")# 每10秒读取一次数据time.sleep(10)

四、代码实现

4. 启动Web服务

在终端中启动Flask Web服务,以便我们可以通过浏览器访问传感器数据。

  1. 运行Flask应用:

    python3 app.py
    
  2. 在浏览器中访问 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客户端订阅传感器数据主题。

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

    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服务,验证了整个系统的功能和数据流的正确性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构初阶最终讲:排序
  • 使用python-pptx代码添加幻灯片:向PPT中插入新的幻灯片页面
  • Openwrt配置ZeroTier,实现公网访问内网中服务器
  • Windows下,C# 通过FastDDS高效通信
  • 碳化硅陶瓷膜过滤设备优异的过滤性能
  • 前端技术 -- 动画效果之GSAP作用与使用示例
  • Apex - Annotation#AuraEnabled
  • go的工厂模式
  • Oracle Flashback Recyclebin从回收站中恢复被删除的对象
  • 使用RabbitMQ死信交换机实现延迟消息
  • MySQL Galera Cluster 部署与介绍
  • 天津教育杂志天津教育杂志社天津教育编辑部2024年第24期目录
  • 【C++】函数的调用
  • 【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
  • 【论文阅读】MobileNetV4 - Universal Models for the Mobile Ecosystem
  • SegmentFault for Android 3.0 发布
  • 【剑指offer】让抽象问题具体化
  • cookie和session
  • create-react-app项目添加less配置
  • java小心机(3)| 浅析finalize()
  • JS+CSS实现数字滚动
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • vue学习系列(二)vue-cli
  • 阿里云Kubernetes容器服务上体验Knative
  • 分布式熔断降级平台aegis
  • 解决iview多表头动态更改列元素发生的错误
  • 两列自适应布局方案整理
  • 前端相关框架总和
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 写代码的正确姿势
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 怎么将电脑中的声音录制成WAV格式
  • 浅谈sql中的in与not in,exists与not exists的区别
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #pragma 指令
  • #QT(串口助手-界面)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (pycharm)安装python库函数Matplotlib步骤
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (三)uboot源码分析
  • (十一)c52学习之旅-动态数码管
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)关于多人操作数据的处理策略
  • ****三次握手和四次挥手
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献