一、项目概述
1.1 项目目标和用途
本项目旨在设计并实现一个基于Linux的中心网关,配备触控屏可视化界面,能够实时显示各种传感器的数据,并支持用户对网关配置的设置。该项目的目标是为智能家居、环境监测等应用场景提供一个集中控制和数据展示的平台,方便用户对设备进行管理和监控。
1.2 问题与价值
在智能设备越来越普及的今天,用户往往面临不同设备之间无法统一管理的问题。通过本项目,用户可以通过一个友好的界面集中管理多个传感器及其数据,同时可以对网络配置进行设置,大大提高了设备的可用性和用户体验。
二、系统架构
2.1 系统架构设计
系统架构采用客户端-服务器模式,中心网关作为服务器,传感器作为客户端。中心网关通过无线通信模块与传感器进行数据交互,触控屏用于用户操作和数据显示。
2.2 选择的硬件和技术栈
-
单片机: Raspberry Pi 4,作为中心处理单元,运行Linux操作系统,提供强大的处理能力和丰富的接口。
-
触控屏: 7英寸触控显示屏,支持HDMI接口,直接与Raspberry Pi连接。
-
传感器: DHT22(温湿度传感器)、MQ-2(气体传感器)、BH1750(光照传感器)。
-
通信协议: MQTT,用于传感器数据的发布与订阅。
-
无线通信模块: ESP8266,实现Wi-Fi连接,方便与云平台或其他设备的通信。
2.3 系统架构图
以下是系统架构图:
触控操作 显示数据 数据处理 传感器数据 发布/订阅 用户 触控屏 中心网关 传感器模块 MQTT Broker 其他设备/云平台
四、代码实现
4.1 功能模块
本项目主要分为以下几个功能模块:
-
传感器数据采集模块:负责从各类传感器读取数据并进行处理。
-
MQTT通信模块:负责将传感器数据发送至MQTT Broker,并接收来自其他设备的指令。
-
触控界面模块:提供用户友好的界面,展示传感器数据并允许用户进行交互。
-
网关配置模块:用于配置网关的网络参数及其他设置。
4.2 代码实现
4.2.1 传感器数据采集模块
传感器数据采集模块的主要功能是从不同类型的传感器中读取环境数据,并通过MQTT协议将这些数据发送到中心网关。以下是实现该模块的详细代码示例及说明。
代码示例
py
import paho.mqtt.client as mqtt
import Adafruit_DHT
import time
# MQTT配置
broker = "mqtt.eclipse.org" # 替换为你的MQTT Broker地址
port = 1883 # MQTT Broker端口
topic = "sensor/data" # 数据发布的主题
# 初始化DHT22传感器
DHT_SENSOR = Adafruit_DHT.DHT22 # 指定传感器类型
DHT_PIN = 4 # GPIO引脚编号
# MQTT客户端初始化
client = mqtt.Client()
def on_connect(client, userdata, flags, rc):
"""连接成功后的回调函数"""
print(f"Connected with result code {rc}")
def publish_sensor_data():
"""读取传感器数据并发布到MQTT主题"""
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) # 读取温湿度
if humidity is not None and temperature is not None:
# 格式化数据
data = {
"temperature": temperature,
"humidity": humidity
}
# 发布数据到MQTT主题
client.publish(topic, str(data))
print(f"Published: {data}")
else:
print("Failed to retrieve data from humidity sensor")
def main():
"""主函数"""
client.on_connect = on_connect # 绑定连接成功的回调函数
client.connect(broker, port, 60) # 连接MQTT Broker
client.loop_start() # 启动MQTT循环
try:
while True:
publish_sensor_data() # 发布传感器数据
time.sleep(10) # 每10秒读取一次数据
except KeyboardInterrupt:
print("Exiting...")
finally:
client.loop_stop() # 停止MQTT循环
client.disconnect() # 断开MQTT连接
if __name__ == "__main__":
main()
代码说明
-
导入必要的库:
-
paho.mqtt.client
:用于实现MQTT客户端。 -
Adafruit_DHT
:用于与DHT22温湿度传感器交互。 -
time
:用于控制数据采集的时间间隔。
-
-
MQTT配置:
-
broker
:MQTT Broker的地址,通常是运行MQTT服务的IP地址。 -
port
:MQTT Broker的端口,默认为1883。 -
topic
:定义数据发布的主题,其他设备可以订阅这个主题以接收数据。
-
-
传感器初始化:
-
DHT_SENSOR
:指定传感器类型为DHT22。 -
DHT_PIN
:指定GPIO引脚编号,用于连接传感器。
-
-
MQTT客户端初始化:
- 创建MQTT客户端对象,并使用
on_connect
函数处理连接成功的回调。
- 创建MQTT客户端对象,并使用
-
数据发布函数:
publish_sensor_data()
:读取传感器的温度和湿度数据。如果读取成功,将数据格式化为字典,并通过MQTT发布到相应的主题。如果读取失败,则打印错误信息。
-
主函数:
-
在
main()
函数中,首先连接MQTT Broker并启动MQTT循环。 -
进入一个无限循环,每10秒读取一次传感器数据并发布。
-
捕获键盘中断(如Ctrl+C)以优雅退出,停止MQTT循环并断开连接。
-
代码时序图
以下是该模块的代码时序图,展示了传感器数据采集模块的主要功能执行流程:
用户 MQTT客户端 DHT22传感器 MQTT Broker 启动程序 连接到MQTT Broker 设置连接回调 读取温湿度数据 返回温湿度数据 检查数据有效性 发布温湿度数据 打印数据 打印读取失败信息 alt [数据有效] [数据无效] 读取温湿度数据 返回温湿度数据 检查数据有效性 发布温湿度数据 打印数据 打印读取失败信息 alt [数据有效] [数据无效] loop [每10秒] Ctrl+C退出 停止MQTT循环 断开连接 用户 MQTT客户端 DHT22传感器 MQTT Broker
4.2.2 MQTT通信模块
MQTT通信模块的主要功能是处理与MQTT Broker的连接、消息的发布和订阅。它负责将传感器数据发送到Broker,并接收来自客户端的指令或配置更新。
代码示例
py
import paho.mqtt.client as mqtt
# MQTT Broker配置
broker = "mqtt.eclipse.org" # 替换为你的MQTT Broker地址
port = 1883 # MQTT Broker端口
topic = "sensor/data" # 数据发布的主题
command_topic = "gateway/command" # 命令接收的主题
def on_connect(client, userdata, flags, rc):
"""连接成功后的回调函数"""
print(f"Connected to MQTT Broker with result code {rc}")
client.subscribe(command_topic) # 订阅命令主题
def on_message(client, userdata, msg):
"""接收到消息后的回调函数"""
print(f"Received message: {msg.payload.decode()} on topic: {msg.topic}")
# 这里可以添加对接收到命令的处理逻辑
handle_command(msg.payload.decode())
def handle_command(command):
"""处理接收到的命令"""
if command == "restart":
print("Restarting the gateway...")
# 这里可以实现网关重启的逻辑
elif command == "status":
print("Sending status...")
# 发送当前状态的逻辑
def main():
"""主函数"""
client = mqtt.Client()
client.on_connect = on_connect # 设置连接成功的回调函数
client.on_message = on_message # 设置接收消息的回调函数
client.connect(broker, port, 60) # 连接MQTT Broker
client.loop_start() # 启动MQTT循环
try:
while True:
pass # 持续运行,等待消息
except KeyboardInterrupt:
print("Exiting...")
finally:
client.loop_stop() # 停止MQTT循环
client.disconnect() # 断开MQTT连接
if __name__ == "__main__":
main()
代码说明
-
导入MQTT库:
- 使用
paho.mqtt.client
库来实现MQTT客户端。
- 使用
-
MQTT Broker配置:
- 定义MQTT Broker的地址和端口,以及数据和命令的主题。
-
连接成功回调:
on_connect(client, userdata, flags, rc)
:连接成功后打印结果代码,并订阅命令主题。
-
消息接收回调:
on_message(client, userdata, msg)
:接收到消息后,打印消息内容并调用handle_command
函数处理命令。
-
命令处理函数:
handle_command(command)
:根据接收到的命令执行相应的操作,如重启网关或发送状态。
-
主函数:
- 初始化MQTT客户端,设置回调函数,连接MQTT Broker,并启动MQTT循环。
代码时序图
以下是MQTT通信模块的代码时序图,展示了主要功能执行流程:
用户 MQTT客户端 MQTT Broker 启动MQTT客户端 连接到MQTT Broker 订阅命令主题 确认订阅 等待消息 接收到消息 处理接收到的消息 执行相应操作 无需操作 alt [消息是命令] [消息不是命令] loop [等待消息] 用户 MQTT客户端 MQTT Broker
代码说明
-
导入 Kivy 库:
- 导入 Kivy 库中的各个组件,如
App
、BoxLayout
、Label
、Button
和TextInput
。
- 导入 Kivy 库中的各个组件,如
-
MQTT Broker 配置:
- 定义 MQTT Broker 的地址和端口,以及传感器数据的主题。
-
SensorDataApp 类:
-
继承自
App
类,定义了应用程序的主要逻辑。 -
初始化时设置温度和湿度的初始值,并初始化 MQTT 客户端。
-
-
连接成功回调:
on_connect(client, userdata, flags, rc)
:连接成功后打印结果代码,并订阅传感器数据主题。
-
消息接收回调:
on_message(client, userdata, msg)
:接收到消息后,解析数据并调用update_sensor_data
方法更新界面。
-
更新传感器数据:
update_sensor_data(data)
:更新温度和湿度的状态,并调用update_labels
更新界面上的标签。
-
构建 Kivy 界面:
build()
方法创建界面布局,添加用于显示温度和湿度的标签,以及一个刷新按钮。
-
刷新数据按钮回调:
refresh_data(instance)
:当用户点击"刷新数据"按钮时,会输出刷新数据的提示。你可以在这里添加重新请求传感器数据的逻辑(例如,重新订阅MQTT主题,或者直接从传感器获取数据)。
-
应用停止时的清理工作:
on_stop()
:在应用程序停止时,停止MQTT循环并断开与MQTT Broker的连接,以确保资源得到释放。
代码时序图
以下是触控界面模块的代码时序图,展示了主要功能执行流程:
用户 触控界面 MQTT客户端 MQTT Broker 启动应用 连接到MQTT Broker 连接成功 订阅传感器数据主题 确认订阅 等待消息 接收到传感器数据 更新传感器数据 显示温湿度信息 loop [等待消息] 点击刷新按钮 刷新数据请求 更新数据 显示最新温湿度信息 关闭应用 停止MQTT循环 断开连接 用户 触控界面 MQTT客户端 MQTT Broker
4.2.4 网关配置模块
网关配置模块用于设置网关的网络参数和其他配置选项,例如Wi-Fi连接设置、MQTT Broker地址等。用户可以通过触控界面输入这些配置信息,模块会将其保存并应用。
代码示例
py
import json
import os
class Configuration:
"""网关配置类"""
def __init__(self, config_file='config.json'):
self.config_file = config_file
self.load_config()
def load_config(self):
"""加载配置文件"""
if os.path.exists(self.config_file):
with open(self.config_file, 'r') as f:
self.config = json.load(f)
print("Configuration loaded:", self.config)
else:
self.config = {
"mqtt_broker": "mqtt.eclipse.org",
"mqtt_port": 1883,
"wifi_ssid": "",
"wifi_password": ""
}
self.save_config() # 保存默认配置
def save_config(self):
"""保存配置文件"""
with open(self.config_file, 'w') as f:
json.dump(self.config, f, indent=4)
print("Configuration saved:", self.config)
def update_config(self, key, value):
"""更新配置项"""
if key in self.config:
self.config[key] = value
self.save_config()
# 示例使用配置模块
if __name__ == "__main__":
config = Configuration()
config.update_config("wifi_ssid", "MyWiFi")
config.update_config("wifi_password", "mypassword")
print("Updated configuration:", config.config)
代码说明
-
Configuration 类:
- 该类用于管理网关的配置,包括加载、保存和更新配置选项。
-
初始化:
- 在初始化时,类会尝试加载配置文件。如果配置文件不存在,则使用默认配置并保存。
-
加载配置:
load_config()
:检查配置文件是否存在。如果存在,则从文件中加载配置;否则,创建默认配置并保存。
-
保存配置:
save_config()
:将当前配置写入配置文件,使用 JSON 格式存储,便于后续读取和修改。
-
更新配置:
update_config(key, value)
:根据传入的键值对更新配置,并保存到文件。
代码时序图
以下是网关配置模块的代码时序图,展示了主要功能执行流程:
用户 配置模块 配置文件 启动配置模块 检查配置文件是否存在 加载配置 创建默认配置 加载默认配置 alt [配置文件存在] [配置文件不存在] 更新WiFi SSID 更新配置项 保存新配置 显示更新后的配置 更新MQTT Broker地址 更新配置项 保存新配置 显示更新后的配置 用户 配置模块 配置文件
五、项目总结
在本项目中,我们成功设计并实现了一个基于Linux单片机的中心网关,具备以下主要功能和特性:
1. 项目目标与实现
我们的目标是创建一个能够集中管理和监控多种传感器数据的中心网关。通过触控屏可视化界面,用户可以实时查看温度、湿度等环境参数,并对网关配置进行修改。我们使用了Raspberry Pi 4作为中心处理单元,结合DHT22、MQ-2等传感器,实现了数据的采集和处理。
2. 系统模块概述
项目主要分为四个功能模块:
-
传感器数据采集模块:负责从DHT22等传感器读取温度和湿度数据。该模块通过MQTT协议将数据发布到指定主题,确保数据实时性和可靠性。
-
MQTT通信模块:实现了与MQTT Broker的连接、消息的发布和订阅功能。该模块可以接收来自其他设备的命令,响应用户的操作。
-
触控界面模块:利用Kivy库创建了一个用户友好的图形界面,用户可以通过触控屏查看实时数据,并使用刷新按钮获取最新传感器信息。界面直观简单,便于用户交互。
-
网关配置模块:提供了一个简洁的方式让用户配置Wi-Fi、MQTT Broker等参数。所有配置都以JSON格式存储,方便读取和修改,用户可以在应用中轻松管理其网络设置。