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

ESP32智能设备:蓝牙音箱、AI语音助手、环境监测与调节以及智能控制,基于BLE与MQTT技术(代码详解)

本文将介绍如何实现一个功能丰富的ESP32项目,集成蓝牙音箱、AI语音助手、智能设备控制器、环境监测与调节等功能。通过本项目,您将学习到硬件设计、嵌入式编程、蓝牙技术、音频处理、人工智能与语音识别、物联网平台、数据分析及用户界面构建等技术。

一、项目概述

1.1 项目目标与用途

该项目的目标是构建一个集成多种功能的智能设备,能够在家庭或办公室环境中提供音频播放、语音控制、智能设备管理和环境监测等服务。通过这个项目,用户将能够通过语音命令控制设备、播放音乐、监测环境状况并进行相应调节。

二、系统架构

2.1 系统架构设计

本项目的系统架构包括以下几个部分:

  • ESP32开发板:作为核心控制单元,负责数据处理和设备控制。

  • 麦克风模块:用于接收用户的语音指令。

  • 扬声器:用于播放音频和语音反馈。

  • 传感器:包括温度、湿度、空气质量传感器,用于环境监测。

  • 继电器模块:用于控制智能设备的开关。

  • 蓝牙模块:实现蓝牙音频播放和设备连接。

  • 云服务或本地服务器:用于数据存储和分析。

2.2 技术栈选择

  • 单片机:ESP32开发板

  • 通信协议:BLE(蓝牙低功耗)、MQTT

  • 传感器:DHT11(温度和湿度传感器)、MQ-135(空气质量传感器)

  • 音频库:ESP-ADF(音频开发框架)

2.3 系统架构图

以下是项目的系统架构图:

控制
控制
控制
控制
控制
控制
蓝牙连接
数据传输
ESP32开发板
麦克风模块
扬声器
温度传感器
湿度传感器
空气质量传感器
继电器模块
蓝牙设备
云服务

三、环境搭建

3.1 所需软件与硬件环境

硬件环境
  • ESP32开发板

  • 麦克风模块

  • 扬声器

  • DHT11温湿度传感器

  • MQ-135空气质量传感器

  • 继电器模块

  • 面包板及连接线

软件环境
  • Arduino IDE或PlatformIO

  • ESP-ADF(音频开发框架)

  • MQTT Broker(如Mosquitto)

  • Python(用于数据分析)

3.2 环境安装步骤与配置

  1. 安装Arduino IDE

    • 打开Arduino IDE,进入文件 -> 首选项,在“附加板管理器网址”中添加以下链接:
          https://dl.espressif.com/dl/package\_esp32\_index.json
    
    • 进入工具 -> -> 板管理器,搜索“esp32”并安装。

    • 下载并安装Arduino IDE。

    • 按照以下步骤配置ESP32开发环境:

  2. 安装ESP-ADF

    • 下载并安装ESP-ADF,参考ESP-ADF官方文档进行配置。
  3. 设置MQTT Broker

    • 使用Docker安装Mosquitto:
    docker run -it -p 1883:1883 -p 9001:9001 eclipse-mosquitto
    
  4. 准备Python环境

    • 安装Python及相关库:
    pip install paho-mqtt pandas matplotlib
    
    • paho-mqtt用于MQTT协议的数据传输,pandas用于数据分析,matplotlib用于数据可视化。

3.3 配置示例与注意事项

  • Arduino IDE配置示例:

  • 工具 -> -> ESP32 Dev Module

  • 工具 -> 端口 -> 选择相应的COM端口

  • 在Arduino IDE中选择正确的开发板和端口:

  • 注意事项:

    • 确保所有硬件连接正确,特别是传感器和模块的引脚连接。

    • 在代码中使用适当的库来支持所使用的传感器和模块。

四、代码实现

本项目将分为几个主要的功能模块:环境监测模块、蓝牙音频播放模块、语音助手模块和智能控制模块。以下是每个模块的详细流程、代码示例和代码说明。

4.1 功能模块实现

4.1.1 环境监测模块

1. 流程介绍

环境监测模块的主要功能是使用温湿度传感器(DHT11)和空气质量传感器(MQ-135)来监测环境的温度、湿度和空气质量。模块会定期读取传感器数据并将其显示在串行监视器上。

2. 硬件连接
  • DHT11 温湿度传感器:将数据引脚连接到ESP32的GPIO 4。

  • MQ-135 空气质量传感器:将其模拟输出引脚连接到ESP32的GPIO 34。

3. 代码示例
#include <DHT.h>#define DHTPIN 4           // DHT11数据引脚
#define DHTTYPE DHT11      // 使用DHT11传感器
#define MQ135PIN 34       // MQ-135模拟引脚DHT dht(DHTPIN, DHTTYPE);void setup() {Serial.begin(115200); // 初始化串口通信dht.begin();          // 初始化DHT11传感器
}void loop() {// 读取温度和湿度float h = dht.readHumidity();float t = dht.readTemperature();// 检查读取是否失败if (isnan(h) || isnan(t)) {Serial.println("无法读取传感器数据!");return;}// 读取空气质量(MQ-135)int airQualityValue = analogRead(MQ135PIN);// 输出温度、湿度和空气质量Serial.print("温度: ");Serial.print(t);Serial.print(" °C, 湿度: ");Serial.print(h);Serial.print(" %, 空气质量值: ");Serial.println(airQualityValue);delay(2000); // 每2秒读取一次数据
}
4. 代码说明
  • #include <DHT.h>:引入DHT库,用于与DHT11传感器进行通信。

  • #define:定义引脚编号,方便后续使用。

  • DHT dht(DHTPIN, DHTTYPE);:创建DHT对象,初始化传感器。

  • Serial.begin(115200);:初始化串口通信,设置波特率为115200。

  • dht.begin();:启动DHT11传感器。

  • analogRead(MQ135PIN);:读取MQ-135传感器的模拟值,反映空气质量。

  • delay(2000);:每2秒读取一次数据,避免频繁读取导致传感器不稳定。

4.1.2 蓝牙音频播放模块

1. 流程介绍

蓝牙音频播放模块的功能是通过ESP32的蓝牙功能播放音频文件。使用ESP-ADF库来实现音频解码和播放。

2. 硬件连接
  • 扬声器:连接到ESP32的DAC引脚(GPIO 25或GPIO 26)。
3. 代码示例
#include "Audio.h"void setup() {Serial.begin(115200);Audio.begin(); // 初始化音频系统Audio.setVolume(10); // 设置音量(0-30)// 初始化蓝牙音频Audio.start("Bluetooth"); // 开始蓝牙音频播放
}void loop() {// 播放音频文件if (Audio.isPlaying()) {// 若正在播放,则不再播放return;}Audio.play("/audio.mp3"); // 播放音频文件Serial.println("正在播放音频...");delay(5000); // 播放5秒
}
4. 代码说明
  • #include "Audio.h":引入音频库。

  • Audio.begin();:初始化音频系统。

  • Audio.setVolume(10);:设置音量,范围为0到30。

  • Audio.start("Bluetooth");:初始化蓝牙音频播放。

  • Audio.play("/audio.mp3");:播放存储在文件系统中的音频文件(如SD卡或SPIFFS)。

  • if (Audio.isPlaying()) {...}:检查当前是否正在播放音频,以避免重复播放。

  • delay(5000);:在播放音频后,延迟5秒用于保证音频播放的持续时间。

4.1.3 语音助手模块

1. 流程介绍

语音助手模块通过WiFi连接到语音识别API(例如Google Assistant或其他开源语音助手),并将用户的语音指令转换为可执行的命令。用户可以通过语音控制家庭设备的状态。

2. 硬件连接
  • 麦克风模块:将麦克风模块连接到ESP32的ADC引脚(如GPIO 34)。
3. 代码示例
#include <WiFi.h>
#include <HTTPClient.h>const char* ssid = "YOUR_SSID";        // WiFi SSID
const char* password = "YOUR_PASSWORD"; // WiFi密码void setup() {Serial.begin(115200);WiFi.begin(ssid, password); // 连接到WiFi// 等待WiFi连接while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("连接中...");}Serial.println("WiFi连接成功!");
}void loop() {// 发送音频数据进行语音识别if (WiFi.status() == WL_CONNECTED) {HTTPClient http;http.begin("https://api.example.com/voice"); // 替换为实际的语音识别APIint httpResponseCode = http.GET(); // 发送GET请求if (httpResponseCode > 0) {String response = http.getString();Serial.println("响应: " + response); // 打印响应内容// 根据响应内容执行相应的设备控制handleVoiceCommand(response); // 处理语音命令} else {Serial.println("错误: " + String(httpResponseCode));}http.end();}delay(10000); // 每10秒请求一次
}// 处理语音命令
void handleVoiceCommand(String command) {// 根据识别的命令控制设备if (command.indexOf("开灯") >= 0) {digitalWrite(RELAY_PIN, HIGH); // 打开灯Serial.println("灯已打开");} else if (command.indexOf("关灯") >= 0) {digitalWrite(RELAY_PIN, LOW); // 关闭灯Serial.println("灯已关闭");}
}
4. 代码说明
  • #include <WiFi.h>:引入WiFi库,用于连接WiFi网络。

  • const char* ssidconst char* password:定义WiFi的SSID和密码。

  • WiFi.begin(ssid, password);:连接到指定的WiFi网络。

  • while (WiFi.status() != WL_CONNECTED):在WiFi连接完成之前,保持循环。

  • http.begin("https://api.example.com/voice");:初始化HTTP请求,连接到语音识别API。

  • int httpResponseCode = http.GET();:发送GET请求,获取语音识别的结果。

  • handleVoiceCommand(response);:根据识别的命令执行相应的设备控制。

4.1.4 智能控制模块

1. 流程介绍

智能控制模块通过继电器控制连接的设备(如灯、风扇等),根据用户的指令或传感器的输入自动开关设备。该模块还可以根据环境数据进行智能决策。

2. 硬件连接
  • 继电器模块:将继电器模块的控制引脚连接到ESP32的GPIO 5。
3. 代码示例
#define RELAY_PIN 5 // 继电器控制引脚void setup() {pinMode(RELAY_PIN, OUTPUT); // 设置继电器引脚为输出模式Serial.begin(115200); // 初始化串口通信
}void loop() {// 示例:根据环境数据控制设备if (shouldTurnOnDevice()) {digitalWrite(RELAY_PIN, HIGH); // 打开设备Serial.println("设备已打开");} else {digitalWrite(RELAY_PIN, LOW); // 关闭设备Serial.println("设备已关闭");}delay(10000); // 每10秒检查一次
}// 根据环境数据决定是否打开设备
bool shouldTurnOnDevice() {// 这里可以添加逻辑,例如根据温度或湿度进行判断float temperature = getTemperature(); // 假设有一个获取温度的函数float humidity = getHumidity(); // 假设有一个获取湿度的函数if (temperature > 25.0) {return true; // 温度超过25°C,打开设备} else {return false; // 否则关闭设备}
}// 模拟获取温度的函数
float getTemperature() {// 这里可以调用之前的环境监测代码来获取温度// 假设返回一个模拟值return 26.0; // 示例返回26度
}// 模拟获取湿度的函数
float getHumidity() {// 这里可以调用之前的环境监测代码来获取湿度// 假设返回一个模拟值return 50.0; // 示例返回50%
}
4. 代码说明
  • #define RELAY_PIN 5:定义继电器的控制引脚为GPIO 5。

  • pinMode(RELAY_PIN, OUTPUT);:在setup()函数中将继电器引脚设置为输出模式,以控制设备的开关。

  • digitalWrite(RELAY_PIN, HIGH);:当条件满足时,将继电器引脚设置为高电平,打开连接的设备。

  • digitalWrite(RELAY_PIN, LOW);:当条件不满足时,将继电器引脚设置为低电平,关闭连接的设备。

  • delay(10000);:每10秒检查一次设备状态,确保响应及时。

  • shouldTurnOnDevice():这是一个自定义函数,用于根据环境数据(如温度)决定是否打开设备。

  • getTemperature()getHumidity():这两个函数模拟获取温度和湿度的值。在实际应用中,可以调用环境监测模块中的读取函数。

4.2 整合各个模块

将上述各个功能模块整合到一个主程序中,可以实现更复杂的功能和更好的用户体验。下面是一个简单的整合示例。

整合示例代码

#include <DHT.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include "Audio.h"#define DHTPIN 4           // DHT11数据引脚
#define DHTTYPE DHT11      // 使用DHT11传感器
#define RELAY_PIN 5        // 继电器控制引脚
#define MQ135PIN 34       // MQ-135模拟引脚const char* ssid = "YOUR_SSID";        // WiFi SSID
const char* password = "YOUR_PASSWORD"; // WiFi密码DHT dht(DHTPIN, DHTTYPE);void setup() {Serial.begin(115200);dht.begin();          // 初始化DHT11传感器pinMode(RELAY_PIN, OUTPUT); // 设置继电器引脚为输出模式// 连接WiFiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("连接中...");}Serial.println("WiFi连接成功!");// 初始化音频系统Audio.begin();Audio.setVolume(10); // 设置音量
}void loop() {// 读取环境数据float h = dht.readHumidity(); // 读取湿度float t = dht.readTemperature(); // 读取温度int airQualityValue = analogRead(MQ135PIN); // 读取空气质量// 输出环境数据Serial.print("温度: ");Serial.print(t);Serial.print(", 湿度: ");Serial.print(h);Serial.print(" %, 空气质量值: ");Serial.println(airQualityValue);// 控制设备基于环境数据if (shouldTurnOnDevice(t, h)) {digitalWrite(RELAY_PIN, HIGH); // 打开设备Serial.println("设备已打开");} else {digitalWrite(RELAY_PIN, LOW); // 关闭设备Serial.println("设备已关闭");}// 语音助手功能if (WiFi.status() == WL_CONNECTED) {HTTPClient http;http.begin("https://api.example.com/voice"); // 替换为实际的语音识别APIint httpResponseCode = http.GET(); // 发送GET请求if (httpResponseCode > 0) {String response = http.getString();Serial.println("响应: " + response); // 打印响应内容handleVoiceCommand(response); // 处理语音命令} else {Serial.println("错误: " + String(httpResponseCode));}http.end();}delay(10000); // 每10秒循环一次
}// 根据环境数据决定是否打开设备
bool shouldTurnOnDevice(float temperature, float humidity) {// 逻辑:如果温度大于25°C或湿度大于70%,打开设备if (temperature > 25.0 || humidity > 70.0) {return true; // 打开设备} else {return false; // 关闭设备}
}// 处理语音命令
void handleVoiceCommand(String command) {// 根据识别的命令控制设备if (command.indexOf("开灯") >= 0) {digitalWrite(RELAY_PIN, HIGH); // 打开灯Serial.println("灯已打开");} else if (command.indexOf("关灯") >= 0) {digitalWrite(RELAY_PIN, LOW); // 关闭灯Serial.println("灯已关闭");}
}

代码说明

  • 环境数据读取:在主循环中,程序定期读取温度、湿度和空气质量值,并将其输出到串口监视器。

  • 设备控制逻辑:通过调用shouldTurnOnDevice(float temperature, float humidity)函数,根据读取的温度和湿度值决定是否打开或关闭设备。

  • 语音助手:在连接WiFi后,程序会定期检查语音识别API的响应,并根据识别结果调用handleVoiceCommand(String command)函数来控制设备。

5. 完整项目总结

通过上述模块的实现,您可以构建一个功能丰富的ESP32项目,集成蓝牙音箱、AI语音助手、智能设备控制器、环境监测与调节等功能。整个项目的关键点总结如下:

  • 硬件设计:选择适合的传感器和模块,并正确连接到ESP32开发板。

  • 嵌入式编程:使用C/C++或MicroPython进行ESP32的固件开发,确保代码逻辑清晰、易于理解和维护。

  • 蓝牙技术:实现BLE和经典蓝牙协议的音频播放功能。

  • 人工智能和语音识别:集成语音识别API,实现语音控制。

  • 物联网平台:使用MQTT或HTTP协议进行数据传输和设备控制。

  • 数据分析与大数据:根据环境数据和天气预报调整设备设置。

  • 用户界面:使用Web开发技术构建可视化面板,展示环境数据和设备状态。

相关文章:

ESP32智能设备:蓝牙音箱、AI语音助手、环境监测与调节以及智能控制,基于BLE与MQTT技术(代码详解)

本文将介绍如何实现一个功能丰富的ESP32项目&#xff0c;集成蓝牙音箱、AI语音助手、智能设备控制器、环境监测与调节等功能。通过本项目&#xff0c;您将学习到硬件设计、嵌入式编程、蓝牙技术、音频处理、人工智能与语音识别、物联网平台、数据分析及用户界面构建等技术。 一…...

web渗透测试 学习导图

web渗透学习路线 前言 一、web渗透测试是什么&#xff1f; Web渗透测试分为白盒测试和黑盒测试&#xff0c;白盒测试是指目标网站的源码等信息的情况下对其渗透&#xff0c;相当于代码分析审计。而黑盒测试则是在对该网站系统信息不知情的情况下渗透&#xff0c;以下所说的Web…...

WordPress禁止后台自定义功能

wordpress后台可以彻底禁止主题的自定义菜单功能&#xff0c;下面这段代码添加到functions.php文件中&#xff0c;后台外观菜单中的”自定义”就会消失不见了。 add_filter(map_meta_cap, function($caps, $cap){if($cap customize){return [do_not_allow];}return $caps; },…...

(六)Flink 窗口计算

窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。 目录 时间概念 窗口类型 窗口划分 窗口的生命周期 Window Assigners 窗口函数 Triggers 窗口触发器 Evictor 数据剔除器 Allowed Lateness 旁路输出 时间…...

SQL 布尔盲注 (injection 第六关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&am…...

OpenAI 重回巅峰:ChatGPT-4O 最新模型超越谷歌 Gemini 1.5,多项测试夺冠!

谷歌上周发布的Gemini 1.5 Pro模型&#xff0c;在LMSYS办的聊天机器人竞技场Chatbot Arena中获得第一名。但是&#xff0c;OpenAI迅速反应&#xff0c;推出了最新的chatgpt-4o-latest模型&#xff0c;重新夺回了冠军头衔。 chatgpt-4o-latest模型简介 OpenAI最近推出了名为gpt-…...

软件工程(2)面向对象方法:Booch方法与开发实例

Booch方法&#xff08;Booch Method&#xff09;是由Grady Booch提出的一种面向对象的软件开发方法。它是一种系统分析与设计的框架&#xff0c;主要用于设计和建模面向对象的系统。Booch方法特别关注对象模型的构建&#xff0c;以及类、对象和它们之间的关系。以下是Booch方法…...

高阶面试-concurrentHashMap的整理

算不上死磕&#xff0c;里面太痛苦了&#xff0c;现在很多位移等操作还看不懂&#xff0c;只是先理清大致思路&#xff0c;面试用 concurrentHashMap的实现原理 为啥会用到&#xff1f;并发安全。之前都用的hashtable实现线程安全的map&#xff0c;但是太过笨重&#xff0c;不…...

VSCode系列 - 如何用VSCode搭建C++高效开发环境(1)

VSCode是笔者用过的最好用的开发工具&#xff0c;没有之一。笔者14年的码龄生涯中&#xff0c;先后用过Eclipse、 IntelliJ IDEA、 WebStorm、 PyCharm、 Visual Studio(2010/2013/2015)、 NetBeans、 Sublime Text等&#xff0c;但自从用VSCode之后&#xff0c;就再没换过其他…...

【人工智能】Python融合机器学习、深度学习和微服务的创新之路

1. &#x1f680; 引言1.1 &#x1f680; 人工智能的现状与发展趋势1.2 &#x1f4dc; 机器学习、深度学习和神经网络的基本概念1.3 &#x1f3c6; 微服务架构在人工智能中的作用 2. &#x1f50d; 机器学习的演变与创新2.1 &#x1f31f; 机器学习的历史回顾2.2 &#x1f9e0;…...

Stability AI发布了单目视频转4D模型的新AI模型:Stable Video 4D

开放生成式人工智能初创公司Stability AI在3月发布了Stable Video 3D&#xff0c;是一款可以根据图像中的物体生成出可旋转的3D模型视频工具。Stability AI在7月24日发布了新一代的Stable Video 4D&#xff0c;增添了赋予3D模移动作的功能。 Stable Video 4D能在约40秒内生成8…...

网站如何被Google收录?

想让你的网站快速被Google收录&#xff1f;试试GSI快速收录服务吧&#xff0c;这是通过谷歌爬虫池系统来实现的。这套系统吸引并圈养Google爬虫&#xff0c;提高你网站的抓取频率。每天有大量Google爬虫抓取你的网站页面&#xff0c;大大提高了页面的收录概率&#xff0c;从而增…...

LearnOpenGL——法线贴图、视差贴图学习笔记

LearnOpenGL——法线贴图、视差贴图学习笔记 法线贴图 Normal Mapping一、基本概念二、切线空间1. TBN矩阵2. 切线空间中的法线贴图 三、复杂模型四、小问题 视差贴图 Parallax Mapping一、基本概念二、实现视差贴图三、陡峭视差映射 Steep Parallax Mapping四、视差遮蔽映射 P…...

界面优化 - 绘图

目录 1. 基本概念 2. 绘制各种形状 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 2.5 设置画笔 2.6 设置画刷 3. 绘制图片 3.1 绘制简单图片 3.2 平移图片 3.3 缩放图片 3.4 旋转图片 1. 基本概念 虽然 Qt 已经内置了很多的控件, 但是不能保证现有控件就…...

死锁问题分析和解决——资源回收时

1.描述问题 在完成线程池核心功能功能时&#xff0c;没有遇到太大的问题&#xff08;Any,Result,Semfore的设计&#xff09;&#xff0c;在做线程池资源回收时&#xff0c;遇到了死锁的问题 1、在ThreadPool的资源回收&#xff0c;等待线程池所有线程退出时&#xff…...

【Java】效率工具模板的使用

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 乱码问题4.2 快捷键模板4.3 文件模板 一、前言 提高效率 二、学习内容&am…...

c++指南 -指针和引用

指针和引用 指针的基本概念 指针是存储另一个变量的内存地址的变量。指针变量的声明包括指针类型和星号 (*)。 int* ptr; // ptr 是一个指向 int 类型的指针指针操作 初始化&#xff1a;将指针设置为变量的地址。 int var 10; int* ptr &var; // ptr 现在存储 var 的…...

[CISCN 2023 华北]ez_date

[CISCN 2023 华北]ez_date 点开之后是一串php代码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); class date{public $a;public $b;public $file;public function __wakeup(){if(is_array($this->a)||is_array($this->b)){die(no array);}if( (…...

前端不同项目使用不同的node版本(Volta管理切换)

前端不同项目使用不同的node版本(Volta管理切换) 使用volta自动切换前端项目的node版本&#xff0c; 每个不同的前端项目&#xff0c;可以使用不同的node版本。Volta这个工具&#xff0c;它允许用户方便地安装、切换和管理不同版本的Node.js&#xff0c;避免了为每个项目手动配…...

Ropdump:针对二进制可执行文件的安全检测工具

关于Ropdump Ropdump是一款针对二进制可执行文件的安全检测工具&#xff0c;该工具基于纯Python开发&#xff0c;是一个命令行工具&#xff0c;旨在帮助广大研究人员检测和分析二进制可执行文件中潜在的ROP小工具、缓冲区溢出漏洞和内存泄漏等安全问题。 功能介绍 1、识别二进…...

Quartz - 定时任务框架集成

参考了若依框架&#xff0c;将quartz定时任务框架集成到自己的项目当中。 目录 一、Quartz概述二、库表创建1.Quartz关键表&#xff08;11张&#xff09;表SQL 2.自定义业务表&#xff08;2张&#xff09;表SQL 三、代码示例1.依赖引入2.类文件1&#xff09;定时任务配置类2&am…...

GoModule

GOPATH 最早的就是GOPATH构建模式&#xff0c; go get下载的包都在path中的src目录下 src目录是源代码存放目录。 package mainimport ("net/http""github.com/gorilla/mux" )func main() {r : mux.NewRouter()r.HandleFunc("/hello", func(w h…...

SQL - 数据库管理

保障数据库安全的用户账户和权限问题&#xff0c;当在工作环境中使用MySQL的时候&#xff0c;我们需要创建其他用户账户&#xff0c;并赋予它们特定权限。创建一个用户 create user wolf127.0.0.1 identified by 1234; create user wolf127.0.0.1 identified by 1234;-- 无 …...

密码学之AES算法

文章目录 1. AES简介1.1 AES算法的历史背景1.2 AES算法的应用领域 2. AES加解密流程图2. AES算法原理2.1 AES加密过程2.2 AES解密过程 1. AES简介 1.1 AES算法的历史背景 AES算法&#xff0c;全称为Advanced Encryption Standard&#xff08;高级加密标准&#xff09;&#x…...

GitHub每日最火火火项目(8.20)

项目名称&#xff1a;goauthentik / authentik 项目介绍&#xff1a;authentik 是一款提供认证功能的工具&#xff0c;它就像是一个强大的粘合剂&#xff0c;能够满足您在认证方面的各种需求。无论是在安全验证、用户身份管理还是访问控制等方面&#xff0c;它都能发挥重要作用…...

(五)Flink Sink 数据输出

经过上面的 Transformation 操作之后,最终形成用户所需要的结果数据集。通常情况下,用户希望将结果数据输出到外部存储介质或者传输到下游的消息中间件中,在 Flink 中,将 DataStream 数据输出到外部系统的过程被定义为 Sink 操作。 目录 (一)基本数据输出 (二)第三方…...

Spring 注入、注解及相关概念补充

一、Spring DI 的理解 DI ( Dependency Inject&#xff0c;中文释义&#xff1a;依赖注入)是对 IOC 概念不同角度的描述&#xff0c;是指应用程序在运行时&#xff0c;每一个 bean 对象都依赖 IOC 容器注入到当前 bean 对象所需要的另一个 bean 对象。&#xff08;例如&#xf…...

【Linux多线程】线程安全的单例模式

文章目录 1. 单例模式 与 设计模式1.1 单例模式1.2 设计模式1.3 饿汉实现模式 与 懒汉实现模式1.4 饿汉模式① 饿汉模式的特点② 饿汉式单例模式的实现③ 饿汉式单例模式的优缺点④ 适用场景 1.5 懒汉模式① 懒汉式单例模式的特点② 懒汉式单例模式的实现③ 懒汉式单例模式的优…...

基于jqury和canvas画板技术五子棋游戏设计与实现(论文+源码)_kaic

摘 要 网络五子棋游戏如今面临着一些新的挑战和机遇。一方面&#xff0c;网络游戏需要考虑到网络延迟和带宽等因素&#xff0c;保证游戏的实时性和稳定性。另一方面&#xff0c;网络游戏需要考虑到游戏的可玩性和趣味性&#xff0c;以吸引更多的玩家参与。本文基于HTML5和Canv…...

指针 (四)

一 . 指针的使用和传值调用 &#xff08;1&#xff09;strlen 的模拟实现 库函数 strlen 的功能是求字符串长度&#xff0c;统计的是字符串中 \0 之前的字符个数&#xff0c;函数原格式如下&#xff1a; 我们的参数 str 接收到一个字符串的起始地址&#xff0c;然后开始统计…...