树莓派边缘计算网关搭建:集成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. 系统架构图
三、环境搭建
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_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)
-
保存并退出编辑器(在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 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)
- 保存并退出编辑器。
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服务,以便我们可以通过浏览器访问传感器数据。
-
运行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服务,验证了整个系统的功能和数据流的正确性。
相关文章:
树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
一、项目概述 随着物联网(IoT)的快速发展,边缘计算的应用越来越广泛。边缘计算可以将数据处理和分析推向离数据源更近的地方,从而降低延迟,提高效率。本文将介绍如何利用树莓派构建一个多协议边缘计算网关,…...
如何通过GD32 MCU内部ADC参考电压通道提高采样精度?
ADC采样精度受很多因素影响,比如电源波动、参考电压波动、输入信号波动等,GD32 MCU内部提供了一个参考电压通道,理论上可以优化由于电源和参考电压较大波动引入的采样误差。 如下图所示,GD32F303 ADC内部17通道为VREFINT参考电压…...
Centos安装OpenSearch
Centos安装OpenSearch 下载并安装OpenSearch下载OpenSearch RPM包导入公共GNU Privacy Guard(GPG)密钥。此密钥验证您的OpenSearch实例是否已签名安装RPM包安装完设置开机自启动OpenSearch启动OpenSearch验证OpenSearch是否正确启动 测试OpenSearch向服务…...
【pkill pgrep】Centos/Linux pkill命令详细介绍
【pkill & pgrep】Centos/Linux pkill命令详细介绍 简介 基础语法 选项介绍 退出状态 基本用法 注意事项 简介 系统版本:Centos7.6 pkill命令用于杀死一个进程,会根据进程名称和其他属性杀死进程(默认会向进程发送SIGTERM信号&…...
Java如何使用 HTTP 请求下载图片
工具类: public FileInputStream fileDownload(String fileLink) throws Exception {System.out.println("开始下载"fileLink);// 转码中文URL url new URL(encodeURLChinese(fileLink));System.out.println("fileLink:"url);// 开始下载Trust…...
ARM/Linux嵌入式面经(二十):地平线嵌入式开发
一面 1、自己介绍一下项目 一个清晰、结构化的表达能极大地提升你的专业形象。所以一定要养成结构性的回答,真的铁子,信我。 项目介绍示例 项目名称:智能温控系统 项目背景: 该项目旨在开发一款应用于智能家居环境的智能温控系统,通过精准控制室内温度,提高居住舒适度…...
无人机竞速赛
速度与激情的空中盛宴,无人机竞速赛再次点燃我们的肾上腺素! 想象一下,数百架智能飞行器在蓝天下疾驰,如同未来战士穿梭于现实与虚拟的边界,每一次转弯、加速都精准至极,挑战着物理与技术的极限࿰…...
【书生大模型实战营(暑假场)】入门任务二 Git 关卡
入门任务二 Git 关卡 参考: 教程任务 注意: 项目Github链接 1 闯关任务 1.1 使用 Git 完成破冰介绍 本任务将基于开发机实现,重点在于熟悉Git操作。首先要了解 Git操作的常见四部曲,即:舔 Add,提 Co…...
OSPF小实验
根据题目完成下列实验: 拓扑图详细设计如下: 1.基础配置 R1: [R1]interface s4/0/0 [R1-Serial4/0/0]ip address 12.1.1.1 24 [R1]interface LoopBack 0 [R1-LoopBack0]ip address 1.1.1.1 24 R2: [R2]interface s4/0/1 [R2-…...
蛋白质生物学:从序列到结构和疾病 下载并同时打开1LYZ和1H6M的PDB文件(提交图片)。描述这种蛋白质的二级和三级结构。(10分)
Download and open the PDB files of 1LYZ and 1H6M together in one view (submit an image). Describe the secondary and tertiary structure of this protein. (10 marks) 下面给出完整详细的解答: 同时打开1LYZ和1H6M的PDB文件得到: 首先二级结构…...
用VBA在Word中随机打乱单词表,进行分列
一、效果展示(以下是三次随机打乱的结果) 二、代码 Sub 随机分单词到后面的单元格()Dim C1 As CellDim str, str1, aDim shuffledArray() As VariantSet C1 Selection.Range.Tables(1).Cell(1, 1)str C1.Range.textstr mid(str, 3, Len(str) - 4)str…...
UNI-APP_点击,长按,触摸,结束触摸事件
touchstartEventHandle手指触摸动作开始字节跳动小程序不支持touchmoveEventHandle手指触摸后移动字节跳动小程序不支持touchendEventHandle手指触摸动作结束字节跳动小程序不支持touchcancelEventHandle手指触摸动作被打断,如来电提醒,弹窗字节跳动小程…...
【QT】Qt 音视频
Qt 音视频 Qt 音视频1. Qt 音频2. Qt 视频 Qt 音视频 在 Qt 中,音频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只支持播放 wav 格式的音频文件。也就是说如果想要添加音频效果,那么首先需要将非 wav 格式的音频文件转换为 wav 格式。 通…...
CSP-J 复赛 模拟题6
1.大小写字母互换: 题目描述 由输入给定一个字符串,你的任务是将原字符串中的大写字母转换成其对应的小写字母,还要将原字符串中的小写字母转换成对应的大写字母,其余字符不变。 输出转换之后得到的新字符串。 输入格式 一行…...
拷贝函数的三种调用方式
1.使用一个已经创建完成的对象来初始化一个新对象,就比如有参构造接收了一个属性后拷贝构造copy它后可以将获取的值赋值给自己的属性 记得拷贝后还要再进行赋值才行 2.值传递的方式给函数参数 额外声明一点,因为我们知道struct和class很相似,…...
C语言 | Leetcode C语言题解之第327题区间和的个数
题目: 题解: #define FATHER_NODE(i) (0 (i) ? -1 : ((i) - 1 >> 1)) #define LEFT_NODE(i) (((i) << 1) 1) #define RIGHT_NODE(i) (((i) << 1) 2)/* 优先队列(小根堆)。 */ typedef s…...
统计学:条件概率模型
照片由Edge2Edge Media在Unsplash上拍摄 一、介绍 在概率的许多应用中,不可能直接观察实验的结果;而是观察与结果相关的事件。因此,条件概率模型对于考虑和利用从观察到的事件中获得的信息至关重要。此外,条件概率模型与贝叶斯定理…...
前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏
目前已经学习springboot实现了增删改查分页查询,每次修改业财或者是代码重启项目都让我觉得很闹心,现在给出idea2021版本自带热更新操作设置,设置过程分享给大家 总结:以上就是配置的全部过程,祝大家写代码快乐…...
文本rerank与图像rerank
1、文本rerank: 这里介绍的是目前比较流行和通用一套方案:先利用特征检索(这里是特征空间上的相似度),召回相关信息,然后对query与召回的相关信息进行rerank(这里是利用cross-encoder网络做一个…...
Docker 在 Windows 系统下的使用指南:数据卷和数据库
Docker 在 Windows 系统下的使用指南:数据卷和数据库 Docker 提供了强大的功能来创建、管理和持久化数据。数据卷是 Docker 中用于存储和管理数据的机制,使得数据能够在容器的生命周期之外持久化。数据库容器可以利用数据卷来持久化数据库文件ÿ…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
