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

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言

1.1 项目开发背景

随着现代农业的发展和粮食储存规模的扩大,粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查,效率低下且容易出现疏漏,无法及时发现潜在问题,可能导致粮食受潮、霉变、虫害等损失。尤其在粮仓中,温度、湿度、气体浓度等环境参数对粮食的保存至关重要,科学管理这些参数能够显著提升粮食储存的质量和安全性。

在粮仓的实际运行中,环境温度和湿度的异常变化可能导致粮食发霉或者干燥不足,而二氧化碳和一氧化碳等气体浓度的超标可能暗示粮仓内存在发酵、氧化或其他潜在的危害因素。此外,墙壁和角落的水汽问题,往往是粮仓受潮的主要原因之一,长期积水可能引发霉菌滋生,威胁储粮安全。因此,开发一套集成环境参数监测、智能预警和数据可视化的系统,能够实现粮仓环境的实时监控和远程管理,变得尤为重要。

本项目基于STM32微控制器设计,结合温湿度传感器、气体检测模块、雨滴传感器以及WiFi通信技术,不仅实现对粮仓环境的全面监测,还支持数据上传至云端,通过网页端可视化大屏直观展示关键数据,为管理者提供决策依据。同时,系统具有异常报警功能和风扇控制功能,可以在检测到参数异常时,及时采取通风措施并发出警报,从而降低风险。这种高度集成的监测系统,不仅能够减少人工巡查的工作量,还能大幅提升粮仓管理的智能化水平,为粮食安全储存提供有力保障。

image-20241213233622880

image-20241213231940628

1.2 设计实现的功能

当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘(实时更新项目内容):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

(1) 环境温湿度检测
通过SHT30温湿度传感器,实时采集粮仓内的环境温度和湿度数据,并上传至服务器进行监控。

(2) 二氧化碳浓度检测
系统集成二氧化碳检测功能,可持续监测粮仓内的二氧化碳浓度,及时发现异常情况。

(3) 墙壁水汽检测
使用雨滴传感器安装在粮仓墙壁或角落区域,检测是否存在水汽积聚,防止潮湿导致的霉变风险。

(4) 通风风扇控制
通过继电器控制通风风扇,根据环境参数的变化,自动开启或关闭通风设备,实现有效的空气循环。

(5) 一氧化碳可燃气体检测
采用MQ9气体传感器监测粮仓内的一氧化碳等可燃气体浓度,降低潜在的安全隐患。

(6) 数据上云及可视化大屏显示
通过ESP8266 WiFi模块实现数据上传至服务器,服务器以Python作为后端,将设备端采集的数据传输到网页前端,用户可通过可视化大屏查看所有环境参数。

(7) 异常报警
当检测到环境参数超出预设范围,系统会触发有源蜂鸣器报警,同时在可视化网页上显示警示信息,提醒管理者及时采取措施。

(8) 远程监控与数据管理
支持远程访问功能,管理者可通过网页实时监控粮仓环境数据,历史数据也可追溯查看,便于科学管理和问题分析。

1.3 项目硬件模块组成

(1) 主控模块
STM32F103RCT6作为核心控制器,用于采集传感器数据、执行逻辑控制和数据传输。

(2) 温湿度检测模块
SHT30温湿度传感器,用于监测粮仓内部环境的温度和湿度。

(3) 二氧化碳检测模块
用于检测粮仓内二氧化碳浓度,确保空气质量符合储粮要求。

(4) 水汽检测模块
雨滴传感器安装在墙壁或角落,用于检测是否有水汽或潮湿情况。

(5) 可燃气体检测模块
MQ9传感器用于监测一氧化碳及其他可燃气体浓度,保障粮仓安全。

(6) 通风风扇控制模块
继电器驱动模块控制通风风扇的启停,根据环境监测数据进行智能化通风操作。

(7) WiFi通信模块
ESP8266-WIFI模块实现设备与服务器的无线通信,完成数据上传至云端。

(8) 显示屏模块
采用SPI接口的LCD显示屏,用于本地实时显示粮仓环境参数和状态信息。

(9) 蜂鸣器报警模块
高电平触发的有源蜂鸣器,用于当环境参数异常时发出声响报警。

(10) 电源模块
为各个模块提供稳定的供电,确保系统的持续可靠运行。

1.4 设计思路

本项目设计一套基于STM32的粮仓环境监测系统,通过多种传感器采集粮仓环境的关键参数,实现数据实时监测、异常报警和智能化管理。整个设计思路围绕硬件搭建、数据处理与传输以及用户交互展开。

硬件方面,选用STM32F103RCT6作为主控芯片,借助其丰富的外设接口和较强的处理能力,与SHT30温湿度传感器、MQ9可燃气体传感器、雨滴传感器等模块协同工作,实现粮仓环境温湿度、气体浓度、水汽状态的多维度数据采集。同时,通过继电器模块控制通风风扇,结合蜂鸣器实现环境调节和异常报警的功能。ESP8266 WiFi模块提供无线通信能力,将采集的数据上传至服务器,完成云端数据传输和管理。显示屏模块则用于本地显示关键数据,为管理者提供直观的信息反馈。

数据处理和逻辑控制是设计的核心。在STM32控制器中,通过定时采集传感器数据并执行数据校验,将采集到的环境参数与预设的阈值进行比对。当检测到异常(如温湿度超标、气体浓度超限或水汽检测到问题)时,系统触发蜂鸣器报警,并通过继电器自动启动通风风扇。同时,将报警信息和实时参数通过WiFi模块上传到云端,便于远程管理。

在数据传输与用户交互方面,服务器端采用Python开发后端,接收STM32上传的数据并存储。前端通过网页展示可视化大屏,实时呈现粮仓环境的温湿度、气体浓度及设备状态。当出现异常时,网页上以醒目的警告提示辅助蜂鸣器报警,使管理者能够快速定位问题。

整个设计强调系统的可靠性与扩展性。模块化的硬件设计和合理的软件架构,不仅使系统在粮仓环境监测中具有实用性,还可以根据需求扩展其他监测功能,如虫害监控或视频监控,从而进一步提升粮仓管理的智能化水平。

1.5 系统功能总结

功能类别具体功能描述
环境监测功能环境温度检测使用SHT30传感器实时监测粮仓内部温度。
环境湿度检测使用SHT30传感器实时监测粮仓内部湿度。
二氧化碳浓度检测检测粮仓内二氧化碳浓度,保证空气质量。
一氧化碳及可燃气体检测通过MQ9传感器监测一氧化碳及其他可燃气体浓度,防范安全风险。
水汽检测使用雨滴传感器监测墙壁或角落是否存在水汽积聚,防止潮湿问题。
控制功能通风风扇控制通过继电器模块控制风扇启停,自动调节粮仓空气流通。
报警功能蜂鸣器报警当检测到异常环境参数时,蜂鸣器发出声响警报。
可视化报警数据上传至云端,在网页可视化大屏上显示警告信息。
通信功能数据上云通过ESP8266 WiFi模块将环境参数上传至服务器,支持远程管理。
显示功能本地数据显示使用SPI接口LCD屏显示实时的温湿度、气体浓度及设备状态信息。
远程监控功能数据可视化在网页端以图表形式展示实时数据,用户可随时查看环境参数及设备状态。
异常处理功能自动调节环境参数超标时,系统自动启动风扇等调节设备,并上传异常数据供管理者参考。
历史数据管理数据存储与回溯服务器存储历史数据,用户可回溯查看,分析环境变化趋势并优化管理策略。

1.8 模块的技术详情介绍

【1】ESP8266模块

ESP8266是一款低功耗、低成本的WiFi模块,广泛应用于物联网(IoT)项目中。它集成了WiFi无线通信功能,可以实现设备与互联网的无线连接,具有非常高的性价比。ESP8266模块的设计旨在简化无线网络的配置和连接过程,特别适合嵌入式系统和智能硬件应用。

ESP8266模块基于Tensilica Xtensa架构的32位微处理器,并集成了WiFi协议栈、网络功能以及各种控制和通信接口,能够支持WiFi标准的IEEE 802.11 b/g/n协议。它内置有处理器、存储器、WiFi射频模块以及网络协议栈,支持通过AT命令或通过编程来控制和操作。用户可以通过编程将其嵌入到各种应用中,作为通信桥梁在微控制器和互联网之间进行数据传输。

该模块通常包括多个版本,常见的有ESP-01、ESP-12E等,它们的差异主要体现在引脚数目、外部存储、天线设计等方面。ESP8266具有较强的处理能力,能够支持复杂的通信协议,并能够独立执行部分任务,无需外部微处理器的支持。它的主要功能是将嵌入式设备连接到WiFi网络,通过HTTP、MQTT、WebSocket等协议与云端进行数据交互和控制。

在实际应用中,ESP8266模块通过串口(UART)与其他硬件设备进行通信,且其支持AT命令集,通过这些命令可以配置WiFi参数、控制网络连接、发送和接收数据。对于开发者来说,它的开发环境支持Arduino IDE、NodeMCU、PlatformIO等,极大地简化了开发流程。使用这些开发环境,开发者可以通过编程实现更复杂的功能,如数据采集、远程控制、智能家居应用等。

ESP8266的低功耗特点使得它特别适合于物联网设备的应用。模块的工作电压范围为3.3V,虽然其本身的功耗较低,但在深度休眠模式下,功耗可以进一步降低到微安级别,从而延长电池寿命。这使得ESP8266在需要长期运行的无线传感器网络和便携式设备中具有广泛的应用。

在物联网应用中,ESP8266常常用于实现设备与互联网的互联互通,能够通过WiFi协议将数据上传到云平台,如华为云、AWS、ThingSpeak等,实现数据存储、远程监控、控制和分析。在智能家居、智能农业、环境监控等领域,ESP8266作为通信模块发挥着至关重要的作用。

ESP8266凭借其低成本、高集成度、强大的WiFi连接功能以及良好的开发支持,成为了物联网领域中最受欢迎的无线通信模块之一,尤其适用于需要无线连接的嵌入式设备和智能硬件项目。

二、安装Python环境

2.1 环境介绍

操作系统: win10 64位

python版本: 3.8

IDE: 采用vscode

用到的相关安装包下载地址: https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

2.2 Python版本介绍

因为Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序,放到Linux上也是能够运行的。

要开始学习Python编程,首先就得把Python安装到你的电脑里。安装后,你会得到Python解释器(就是负责运行Python程序的),一个命令行交互环境,还有一个简单的集成开发环境。

目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,后面就选择 3.x版本进行安装。

2.3 在windows下安装Python环境

Python官网下载地址: Download Python | Python.org

img

勾上Add Python 3.8 to PATH,然后点“Install Now”即可完成安装。

img

img

安装完成之后,打开windows的命令行窗口。

img

在命令行运行python,出现下面的提示就表示安装成功。

img

进入终端之后,输入exit()可以退出Python命令行。

img

Python安装成功后,在python交互式环境模式下,可以简单学习一下Python的第一份代码:

C:\Users\11266>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 100+500      #直接输入有效数字进行运算
600  
>>> 300-100
200
>>> print("hello python")    #打印文本
hello python
>>> print('hello python')     #打印文本
hello python 
>>> exit()                #退出交互式命令行C:\Users\11266>

2.4 windows下安装VSCode代码编辑器

下载地址: https://code.visualstudio.com/

安装包下载之后,直接鼠标双击运行。

img

根据自己平台下载:

img

接受协议继续安装。

img

选择一下安装路径。

img

浏览路径。

img

安装。

img

img

img

安装完成。打开的页面。

img

软件安装之后下面设置 Visual Studio 支持中文语言

首先打开 Visual Studio 软件, 再按下 F1 或者 Shift + Ctrl + P:

然后在命令行输入 Configure Display Language

img

选择安装语言选项。

img

img

img

安装之后右下角有提示重启,点击重启即可。

新建文本文件,保存的后缀为.py。

img

img

img

img

img

img

img

修改vscode的颜色主题

下面介绍更改颜色vscode的内置颜色主题方法。

img

img

三、设计后端服务器与前端页面

编写一个后端服务器,使用Python的Flask框架来接受设备通过TCP协议上传的数据,并编写一个HTML网页来展示这些数据。

3.1 编写后端服务器

使用Python的socket模块来创建一个TCP服务器,用于接收设备上传的数据。使用Flask框架来创建一个Web应用,用于展示数据。

import socket
from flask import Flask, render_template, jsonify# 初始化Flask应用
app = Flask(__name__)# 全局变量保存最新上传的数据
data = {"temperature": None,"humidity": None,"co2": None,"water_vapor": None,"fan_status": None,"co_gas": None,"alert": None
}# TCP服务器处理设备端数据上传
def start_tcp_server():host = '0.0.0.0'port = 5005server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(5)print(f"Listening on {host}:{port}")while True:client_socket, addr = server_socket.accept()print(f"Connection from {addr}")try:while True:received_data = client_socket.recv(1024).decode("utf-8").strip()if not received_data:break  # 如果没有数据,退出循环print(f"Raw Data received: {received_data}")# 解析数据try:values = received_data.split(',')if len(values) == 7:global datadata["temperature"] = float(values[0])data["humidity"] = float(values[1])data["co2"] = float(values[2])data["water_vapor"] = "Detected" if int(values[3]) == 1 else "Not Detected"data["fan_status"] = "ON" if int(values[4]) == 1 else "OFF"data["co_gas"] = float(values[5])data["alert"] = "Triggered" if int(values[6]) == 1 else "Normal"# 打印解析后的数据print(f"Parsed Data:")print(f"  Temperature: {data['temperature']} °C")print(f"  Humidity: {data['humidity']} %")print(f"  CO2 Level: {data['co2']} ppm")print(f"  Water Vapor: {data['water_vapor']}")print(f"  Fan Status: {data['fan_status']}")print(f"  CO Gas: {data['co_gas']} ppm")print(f"  Alert: {data['alert']}")except Exception as e:print(f"Error parsing data: {e}")except Exception as e:print(f"Error handling client connection: {e}")finally:client_socket.close()# 启动TCP服务器线程
import threading
threading.Thread(target=start_tcp_server, daemon=True).start()# Web路由
@app.route('/')
def index():return render_template("index.html")@app.route('/api/data')
def get_data():return jsonify(data)if __name__ == "__main__":app.run(host="0.0.0.0", port=8080, debug=True)

3.2 编写HTML网页

使用Bootstrap框架来创建一个网页,用于展示设备上传的数据。

网页命名为: index.html。 放在 templates目录下。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>粮仓环境监测系统</title><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script><style>body {background-color: #121212;color: #fff;}.card {margin-top: 20px;background-color: #222;border: 1px solid #444;}.card-header {background-color: #007BFF;color: #fff;}.card-body {background-color: #fff;color: #000;}.table {margin-bottom: 0;}.table-bordered td, .table-bordered th {border: 1px solid #444;}.table th {background-color: #007BFF;color: #fff;}</style>
</head>
<body><div class="container-fluid"><div class="row"><div class="col-md-6 offset-md-3"><div class="card"><div class="card-header"><h3 class="text-center">粮仓环境监测数据</h3></div><div class="card-body"><table class="table table-bordered"><tbody><tr><td>温度</td><td id="temperature"></td></tr><tr><td>湿度</td><td id="humidity"></td></tr><tr><td>二氧化碳浓度</td><td id="co2"></td></tr><tr><td>水汽检测</td><td id="water_vapor"></td></tr><tr><td>风扇状态</td><td id="fan_status"></td></tr><tr><td>一氧化碳浓度</td><td id="co_gas"></td></tr><tr><td>报警状态</td><td id="alert"></td></tr></tbody></table></div></div></div></div></div><script>// 使用JavaScript获取数据并更新页面function updateData() {$.getJSON('/api/data', function(data) {$('#temperature').text(data.temperature + ' °C');$('#humidity').text(data.humidity + ' %');$('#co2').text(data.co2 + ' ppm');$('#water_vapor').text(data.water_vapor);$('#fan_status').text(data.fan_status);$('#co_gas').text(data.co_gas + ' ppm');$('#alert').text(data.alert);});}// 每秒更新一次数据setInterval(updateData, 1000);</script>
</body>
</html>

3.3 文件摆放目录层次

image-20241213231815892

3.4 运行效果

在VSCODE里调用Python运行服务器代码。

image-20241213230525232

网页运行效果:

image-20241213230905641

四、STM32代码设计

4.1 框架概述

  1. 初始化:初始化所有的硬件和软件组件
  2. 数据采集:从各种传感器(如SHT30、MQ9等)读取数据。
  3. 数据处理:处理采集到的数据,例如转换单位、计算平均值等。
  4. 数据上传:通过WiFi模块(ESP8266)将数据上传到服务器。
  5. 控制逻辑:根据采集到的数据执行相应的控制逻辑,控制风扇、蜂鸣器。

4.2 关键代码

1. 初始化
#include "stm32f10x.h"
#include "sht30.h"
#include "mq9.h"
#include "wifi.h"
#include "buzzer.h"
#include "fan.h"
#include "rain_sensor.h"int main(void)
{// 初始化所有模块GPIO_Init();UART_Init();SPI_Init();I2C_Init();SHT30_Init();MQ9_Init();WIFI_Init();Buzzer_Init();Fan_Init();RainSensor_Init();// 主循环while (1){// 数据采集float temperature = SHT30_GetTemperature();float humidity = SHT30_GetHumidity();float co2 = MQ9_GetCO2();int water_vapor = RainSensor_GetStatus();int fan_status = Fan_GetStatus();float co_gas = MQ9_GetCO();int alert = GetAlertStatus(temperature, humidity, co2, water_vapor, fan_status, co_gas);// 数据处理// ...// 数据上传char data_str[100];sprintf(data_str, "%.2f,%.2f,%.2f,%d,%d,%.2f,%d", temperature, humidity, co2, water_vapor, fan_status, co_gas, alert);WIFI_SendData(data_str);// 控制逻辑// ...}
}
2. 数据采集
// 从SHT30读取温度和湿度
float SHT30_GetTemperature()
{// 发送测量命令SHT30_SendCommand(SHT30_MEASURE_HIGHREP);// 等待测量完成Delay_ms(50);// 读取数据uint16_t raw_data = SHT30_ReadData();// 转换为温度值float temperature = SHT30_CalculateTemperature(raw_data);return temperature;
}float SHT30_GetHumidity()
{// 发送测量命令SHT30_SendCommand(SHT30_MEASURE_HIGHREP);// 等待测量完成Delay_ms(50);// 读取数据uint16_t raw_data = SHT30_ReadData();// 转换为湿度值float humidity = SHT30_CalculateHumidity(raw_data);return humidity;
}// 从MQ9读取CO2浓度
float MQ9_GetCO2()
{// 读取ADC值uint16_t adc_value = ADC_GetValue(MQ9_CHANNEL);// 转换为CO2浓度float co2 = MQ9_CalculateCO2(adc_value);return co2;
}// 从雨滴传感器读取状态
int RainSensor_GetStatus()
{// 读取GPIO状态int status = GPIO_ReadInputDataBit(RAIN_SENSOR_PIN);return status;
}
3. 数据处理
// 根据采集到的数据计算报警状态
int GetAlertStatus(float temperature, float humidity, float co2, int water_vapor, int fan_status, float co_gas)
{// 报警条件if (temperature > 30 || humidity > 70 || co2 > 1000 || water_vapor == 1 || fan_status == 0 || co_gas > 50){return 1; // 报警}else{return 0; // 正常}
}
4. 数据上传
// 通过WiFi模块发送数据
void WIFI_SendData(char *data)
{// 发送数据// ...
}
5. 控制逻辑
// 根据报警状态控制蜂鸣器
void ControlBuzzer(int alert)
{if (alert){Buzzer_On();}else{Buzzer_Off();}
}// 根据报警状态控制风扇
void ControlFan(int alert)
{if (alert){Fan_Off();}else{Fan_On();}
}

五、总结

本项目设计一个基于STM32的粮食仓库环境监测系统,以实现对仓库内环境参数的实时监测和控制。通过多种传感器(如SHT30、MQ9等)采集环境数据,并通过WiFi模块将数据上传至服务器,最终在可视化网页上展示数据。系统支持多种功能,包括环境温度、湿度检测,二氧化碳浓度检测,墙壁水汽检测,通风风扇控制,一氧化碳可燃气体检测,数据上云以及可视化大屏显示等。

主要功能
  1. 环境监测
    • 实时监测环境温度、湿度、二氧化碳浓度、水汽检测、一氧化碳浓度等参数。
    • 通过SHT30传感器获取温度和湿度数据。
    • 通过MQ9传感器检测二氧化碳和一氧化碳浓度。
    • 通过雨滴传感器检测墙壁水汽。
  2. 数据上传
    • 设备端的数据通过WiFi连接服务器上传数据。
    • 使用ESP8266-WIFI模块实现数据传输。
  3. 可视化展示
    • 通过网页可视化大屏进行展示数据。
    • 使用Flask作为后端服务器,接收设备端上传的数据,并在网页上展示。
  4. 控制逻辑
    • 根据采集到的数据执行相应的控制逻辑,例如控制风扇、蜂鸣器等。
    • 当环境参数不符合要求时,通过蜂鸣器报警,并在可视化页面上展示提示。
硬件选型
  • 主控芯片:STM32F103RCT6
  • 温湿度传感器:SHT30
  • 可燃气体检测模块:MQ9
  • 通风风扇控制:继电器
  • WiFi模块:ESP8266-WIFI模块
  • 显示屏:SPI接口的LCD显示屏
  • 水汽检测:雨滴传感器
  • 蜂鸣器:高电平触发的有源蜂鸣器
软件设计
  • 使用C语言编写STM32代码,实现数据采集、处理和上传。
  • 使用Python编写服务器端代码,接收设备端上传的数据,并在网页上展示。
  • 使用Flask框架搭建Web服务器,提供HTTP接口供前端页面访问。

相关文章:

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大&#xff0c;粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查&#xff0c;效率低下且容易出现疏漏&#xff0c;无法及时发现潜在问题&#xff0c;可能导致粮食受潮、霉变…...

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制

目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程&#xff08;核心精品专栏&#xff0c;订阅量已达600多个&#xff0c;欢迎订阅&#xff0c;持续更新…...

44.ComboBox的数据绑定 C#例子 WPF例子

固定最简步骤&#xff0c;包括 XAML&#xff1a; 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性&#xff0c;block则绑定和combobox一样的选择属性 C#&#xff1a; 通知的类&#xff0c;及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...

SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)

文章目录 1. 定义2. 为什么要遵循接口隔离原则&#xff1f;3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 接口隔离原则是面向对象设计中的五大原则&#xff08;SOLID&#…...

Spring Boot Web技术栈(官网文档解读)

摘要 Spring Boot框架既支持传统的Servlet技术栈&#xff0c;也支持新兴的响应式&#xff08;Reactive&#xff09;技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建&#xff0c;它依赖于传统的阻塞I/O模型&…...

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…...

计算机网络之---TCP报文段

TCP报文段 TCP报文段是TCP协议中传输数据的基本单位。TCP协议基于流控制、顺序控制和错误校验等机制&#xff0c;以确保数据的可靠传输。TCP报文段结构由多个字段组成&#xff0c;每个字段在TCP的工作中都有特定的作用 一个典型的TCP报文段由两部分组成&#xff1a; TCP头部&a…...

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来&#xff0c;个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中&#xff0c;角色定义&#xff1a; the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver)&#xff0c;负责与 …...

C#读写ini配置文件保存设置参数

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...

Linux---history查看命令历史记录命令

history命令是Linux系统中用于显示和管理用户之前执行过的命令列表的实用工具。以下是history命令的详细教程&#xff1a; 一、基本功能 history命令能够显示用户在当前shell会话或之前会话中执行过的所有命令。这对于回顾之前的操作、复制某个命令进行修改再次执行等场景非常…...

CANopen 学习笔记(2)

PDO通讯参数 异步传输 发送类型设置为0xFE或0xFF 修改映射参数后执行sendPDOevent(&CanFestival_Master_Data); /* 发送PDO事件 */则会触发PDO传输 还有一直就是定时器异步发送&#xff0c;配置发送类型为0xFE&#xff0c;定时器发送时间为0x64,则会以100ms的周期发送P…...

《鸿蒙Next旅游应用:人工智能赋能个性化与智能导览新体验》

随着鸿蒙Next的推出&#xff0c;旅游应用迎来了全新的发展机遇&#xff0c;借助人工智能技术能为用户带来更出色的个性化推荐和智能导览服务。 鸿蒙Next与人工智能融合优势 鸿蒙Next拥有强大的分布式能力和原生智能体验。其能打破设备界限&#xff0c;实现多设备协同&#xf…...

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…...

Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250114

逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/18YtQiLnt06cPQP1nRXor0g?pwd4k3h 提取码: 4k3h Level2逐笔成交逐笔委托数据分享下载 基于Level2的逐笔成交和逐笔委托数据&#xff0c;这种毫秒级别的记录能分析出许多关键信息&#xff0c;如庄家意图、虚假动作&#…...

探索Java(适合小白)

探索Java&#xff1a;推动数字世界的语言 Java&#xff0c;这一编程语言在信息技术的海洋中如同明珠般闪耀&#xff0c;吸引着无数程序员的关注与热爱。在今天的博客中&#xff0c;我们将深入了解Java的定义、学习的重要性&#xff0c;并详细探讨Java EE的概念。无论你是编程新…...

Java Web开发高级——Spring Boot与微服务架构

微服务架构&#xff08;Microservices Architecture&#xff09;已经成为现代软件开发中的主流架构之一。它通过将单一的、庞大的应用程序拆分成多个小的、独立部署的服务&#xff0c;使得开发、维护和扩展变得更加灵活、可控。Spring Boot 提供了一种简单且高效的方式来构建微…...

IMX6U Qt 开发环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…...

【计算机网络】lab5 ARP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…...

【C】初阶数据结构3 -- 单链表

之前在顺序表那一篇文章中&#xff0c;提到顺序表具有的缺点&#xff0c;比如头插&#xff0c;头删时间复杂度为O(n)&#xff0c;realloc增容有消耗等。而在链表中&#xff0c;这些问题将得到解决。所以在这一篇文章里&#xff0c;我们将会讲解链表的定义与性质&#xff0c;以及…...

STM32 FreeRTOS 基础知识

多任务处理 内核是操作系统的核心组件。诸如 Linux 这样的操作系统采用的内核&#xff0c; 看似允许用户同时访问计算机。很明显&#xff0c;多个用户可以同时执行多个程序。 每个执行程序都是受操作系统控制的任务&#xff08;或线程&#xff09;。如果一个操作系统能够以这…...

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK&#xff08;Acknowledge&#xff09; 2. NACK&#xff08;Not Acknowledge&#xff09; IO口模拟II2C协议 发送起始信号&#xff1a; 发送停止信号&#xff1a; 检测应答信号&#xff1a; 发送应答信号&#x…...

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里&#xff0c;视觉内容无处不在&#xff0c;而创建和编辑这些内容的能力已经成为许多行业的核心技能…...

当comfyui-reactor-node 安装失败urllib.error.HTTPError: HTTP Error 403: Forbidden解决方法

comfyUI 节点comfyui-reactor-node 安装 python install 时 报错 urllib.error.HTTPError: HTTP Error 403: Forbidden 如下&#xff1a; (xxx) xxxxxxx:~/sdb/Q/ComfyUI/custom_nodes/comfyui-reactor-node$ python install.py Traceback (most recent call last): File …...

01基本介绍篇(D2_多线程问题)

目录 一、线程的上下文切换问题 1. 基本介绍 2. 多线程一定比单线程快&#xff1f; 3. 如何减少上下文切换 二、线程安全问题 1. 什么是线程安全&#xff1f; 2. java语言中的线程安全 2.1. 不可变 2.2. 绝对线程安全 2.3. 相对线程安全 2.4. 线程兼容 2.5. 线程对立…...

如何保证光谱相机的稳定性和可靠性

光学系统设计与制造 高质量光学元件&#xff1a;采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差&#xff0c;确保光线准确聚焦&#xff1b;高质量的镀膜能够提高光学元件的透光率&#xff0c;降低反射损失&#xff0c;并且增强对不同波段光…...

基于springboot+vue的洪涝灾害应急信息管理系统设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

登录、注册、忘记密码、首页HTML模板

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…...

HTML文章翻页功能

效果展示&#xff1a; 效果原理&#xff1a; 1、引入CDN 2、绘制文章翻页样式&#xff0c;以及自动分段 3、获取窗口宽高&#xff0c;计算出当前文章总分段&#xff0c;并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…...

JAVA安全编码规范

1. 数据校验 对外部输入进行校验入参的合法性&#xff0c; 防止内存越界&#xff0c;命令注入&#xff0c;SQL注入&#xff0c;格式化字符串漏洞 校验长度&#xff0c;范围&#xff0c;输入校验采用白名单形式 校验前做归一化处理&#xff0c;使用java.text.Normalizer的n…...

OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)

运行效果 工程说明 源码 vertex.glsl...

爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验

此分享只用于学习用途&#xff0c;不作商业用途&#xff0c;若有冒犯&#xff0c;请联系处理 Akamai 3.0反爬分析与sensor-data算法逆向经验 Akamai开始正题前须知站点信息接口分析反爬点反爬点定位_abck定位结果 逆向前准备工作sensor_data生成位置本地替换文件 请求体sensor…...

java项目启动时,执行某方法

1. J2EE项目 在Servlet类中重写init()方法&#xff0c;这个方法会在Servlet实例化时调用&#xff0c;即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...

学会使用开源软件jclasslib 字节码文件的组成 详解

应用场景 1 应用场景 2 学习路线 以正确的姿势打开文件 字节码文件的组成 玩转字节码常用工具 以正确的姿势打开文件 开源软件 jclasslib github 地址 https://github.com/ingokegel/jclasslib 工具使用 字节码文件的组成 基本信息 常量池 字段 方法 属性 详解 魔数 主副版…...

Flask表单处理与验证

Flask是一个轻量级的Python框架&#xff0c;它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库&#xff0c;用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑&#xff0c;使得表单处理更为简洁和优雅。下面&#xff0c;我们…...

如何通俗易懂的理解 html js css

HTML、CSS 和 JavaScript 是构建网页的三大核心技术。为了通俗易懂地理解它们&#xff0c;我们可以用一个简单的比喻&#xff1a;**盖房子**。 --- ### 1. **HTML&#xff1a;房子的结构** HTML&#xff08;HyperText Markup Language&#xff09;就像房子的**骨架**。它定义…...

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日&#xff0c;深交所官网显示&#xff0c;浙江信凯科技集团股份有限公司&#xff08;以下简称“信凯科技”&#xff09;主板IPO提交注册。 自2022年递交上市申请&#xff0c;信凯科技的IPO之路已走过两年光景&#xff0c;尽管提交注册&#xff0…...

蓝牙BT04-A的使用与相关AT指令

一、AT指令没有返回的问题及解决方案 检查指令格式&#xff1a; 确认指令格式是否正确&#xff0c;包括特定的命令和结尾的回车换行符&#xff08;n&#xff09;。 检查TX/RX连接&#xff1a; 确认TX&#xff08;发送&#xff09;和RX&#xff08;接收&#xff09;线是否连接正…...

新手如何练习SQL?|掌握

对于新手想要练习SQL语句&#xff0c;可以从以下几个方面入手&#xff1a; 1. 建立理论基础 首先深入理解数据库的核心组件&#xff0c;包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型&#xff08;如字符串、整型、日期等&#xff09;&#xff0c;以及数据库…...

JavaScript宝典下

小哆啦闭关修炼已久&#xff0c;潜心攻读专业秘技&#xff0c;方才下山考研本欲大展宏图&#xff0c;怎奈山河虽壮志难酬&#xff0c;终是觉察考研无望。思来想去&#xff0c;不若弃考研之念&#xff0c;重拾敲代码之道&#xff0c;复盘前端奇术&#xff0c;以备闯荡职场江湖。…...

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…...

Spring Boot 动态表操作服务实现

Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…...

62_Redis服务器集群优化

Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…...

Nacos: 一个动态服务发现与配置管理平台

Nacos: 一个动态服务发现与配置管理平台 引言 在微服务架构日益普及的今天&#xff0c;服务之间的调用和配置管理变得越来越复杂。为了简化这一过程并提高开发效率&#xff0c;阿里巴巴推出了Nacos——一个易于使用的动态服务发现、配置管理和服务管理平台。 Nacos是什么&am…...

SpringBoot + 事务钩子函数

一、案例背景 拿支付系统相关的业务来举例。在支付系统中&#xff0c;我们需要记录每个账户的资金流水&#xff08;记录用户A因为哪个操作扣了钱&#xff0c;因为哪个操作加了钱&#xff09;&#xff0c;这样我们才能对每个账户的账做到心中有数&#xff0c;对于支付系统而言&…...

OpenCV相机标定与3D重建(56)估计物体姿态(即旋转和平移)的函数solvePnPRansac()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用RANSAC方案从3D-2D点对应关系中找到物体的姿态。 cv::solvePnPRansac 是 OpenCV 中用于估计物体姿态&#xff08;即旋转和平移&#xff09;的…...

【JVM中的三色标记法是什么?】

JVM中的三色标记法是什么? 一、基本概念二、标记过程三、优势与问题四、漏标与多标的解决方案三色标记法(Tri-color Marking Algorithm)是Java虚拟机(JVM)中一种用于追踪对象存活状态的垃圾回收算法。 它基于William D. Hana和Mark S. McCulleghan在1976年提出的两色标记法…...

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...