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

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言:在开发过程中,几乎踩便了所有大坑小坑总结出的文章,我是把坑踩满了,帮助更过小白快速上手,如有错误之处,还麻烦各位大佬帮忙指正、

目录

一、ESP-01s介绍

        1、ESP-01s管脚功能:

                模组启动模式说明:

        2、初始配置和验证:

                模块连接:

                基础AT指令:

二、ESP-01s的MQTT固件烧录

        1、登录安信可官网(欢迎 | 安信可科技 (ai-thinker.com)https://docs.ai-thinker.com/),找到ESP8266的AT指令集、对应的MQTT固件包以及烧录工具。

        2、下载烧录工具

        3、硬件接线(笔者在此处踩坑较多!)

4、测试ESP-01s模块

三、链接阿里云

        1、阿里云配置

        (1)账号注册

          (2)进入物联网平台

        (3)产品创建、发布

        (4)设备创建

        2、ESP-01连接阿里云

        (1)发送AT+RESTORE          //重新启动ESP模块

        (2)发送AT+CWMODE=1        //配置WIFI模式

        (3)发送AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"     //进行服务器设置

        (4)发送AT+CWJAP="SSID","SSID_password"     //连接wifi

        (5)发送AT+MQTTUSERCFG=0,1,"NULL","name","password",0,0,""   //设置MQTT属性

        (6)发送AT+MQTTCLIENTID=0,"ClienID"     //设置MQTT ID,注意!!要在ID信息每一个”,“前加”\“进行转义!!!

        (7)发送AT+MQTTCONN=0,"域名",1883,1     //发送MQTT域名,域名获取

        (8)完成以上8个步骤后,刷新设备界面即可看到设备已经激活上线!

        (9)发送AT+MQTTSUB=0,"订阅topic",1      //订阅的主题

        3、阿里云功能定义

        (1)创建物理功能模型

        4、上报下发

        (1)数据下发

        (2)数据上报

        (3)日志查看

四、STM32部分

1、串口部分

2、esp8266初始化部分

3、主函数部分

五、总结


一、ESP-01s介绍

        1、ESP-01s管脚功能:

                不建议使用USB转TTL模块供电,可能因为电压电流不稳定导致模块工作异常!推荐外部供电!!注意所有模块均要公地!!

                模组启动模式说明:

                        可见ESP-01s模块内部,EN引脚默认拉高,RST引脚默认拉高,IO0默认拉高,IO2默认拉高。IO15默认拉低(ESP01不一样!!,ESP01内部没有默认上拉)

        2、初始配置和验证:

                ESP-01s出厂波特率正常是115200。
                注意:AT指令,控制类都要加回车!!

                模块连接:

                基础AT指令:

指令说明示例
AT测试AT启动

RX:AT

TX:OK

AT+GMR返回固件版本信息

RX:AT+GMR

TX:AT version:1.7.4.0(Jul  8 2020 15:53:04)
SDK version:3.0.5-dev(52383f9)
compile time:Aug 28 2020 14:37:33
OK

AT+RST软重启模块

RX:AT+RST

TX:OK

AT+RESTORE恢复出厂设置

RX:AT+RESTORE

TX:OK

                1、初次上电:通过串口输出一串系统开机信息,可能因为电压不稳,导致乱码,以 ready 为准。

                 2、发送AT指令 (以回车结尾)

                3、发送AT+GMR指令(以回车结尾)

二、ESP-01s的MQTT固件烧录

        1、登录安信可官网(欢迎 | 安信可科技 (ai-thinker.com)icon-default.png?t=N7T8https://docs.ai-thinker.com/),找到ESP8266的AT指令集、对应的MQTT固件包以及烧录工具。

下载好压缩包解压可得到烧录bin文件

        2、下载烧录工具

解压后打开exe文件

        3、硬件接线(笔者在此处踩坑较多!)

非常非常重要一点,关掉所有串口设备!!包括刚刚测试使用的XCMO串口软件!!避免烧录串口被占用!

想要进行烧录,首先要把ESP-01s模块配置为下载模式!!所有就回到了文章最开始

因此我们需要把GPIO0引脚拉低!进入下载模式!!拉低的方法也非常简单,直接接入GND即可

因此我们应该如下接线:

依次选择烧录文件,手动输入地址0x00,选择好SPI SPEED 和 SPI MODE,点击START

等待下载完成。

下载完成!!

如果在下载过程中仍有其他问题,为大家推荐一下博客http://【烧录esp8266-01、-01s,错误总结 - CSDN App】http://t.csdnimg.cn/iLTtU

4、测试ESP-01s模块

接线如下:(上一步拔掉IO0引脚接线,内部拉高,使模块进入运行模式)

利用串口工具发送AT指令进行测试:

三、链接阿里云

        1、阿里云配置

        (1)账号注册

阿里云-计算,为了无法计算的价值 (aliyun.com)icon-default.png?t=N7T8https://www.aliyun.com/?utm_content=se_1015277541,进入阿里云网站,右上角有”注册/登录“,进行注册。

          (2)进入物联网平台

        在此处搜索物联网平台

点击进入

        (3)产品创建、发布

发布产品上线

        (4)设备创建

选取刚刚创建的产品,按需求填写名字

返回设备列表即可看到刚刚创建的产品

        2、ESP-01连接阿里云

        本部分均使用串口助手进行发送,TTL模块与ESP-01s连接参考:

具体AT指令具体含义,请参考乐鑫科技AT命令集,笔者不在过多陈述AT 命令集 — ESP-AT 用户指南 文档 (readthedocs-hosted.com)icon-default.png?t=N7T8https://espressif-docs.readthedocs-hosted.com/projects/esp-at/zh-cn/release-v2.2.0.0_esp8266/AT_Command_Set/index.html

每一条指令均要以回车结尾!!!!

        (1)发送AT+RESTORE          //重新启动ESP模块

        (2)发送AT+CWMODE=1        //配置WIFI模式

        (3)发送AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"     //进行服务器设置

        (4)发送AT+CWJAP="SSID","SSID_password"     //连接wifi

例:AT+CWJAP="lsh","123123321"输入自己要连接WiFi名称,密码,不是我的!

建议手机开热点,手机端AP频段建议2.4GHz,5GHz可能连接不上,建议名称以及密码简单一点,否则设计转义字符,配置麻烦

        (5)发送AT+MQTTUSERCFG=0,1,"NULL","name","password",0,0,""   //设置MQTT属性

例:AT+MQTTUSERCFG=0,1,"NULL","esp01s&ioieobDLZef","0afdb0cefa107ab0d6ecc9649f6aea332e3380315550ae0a30b8de63fc66caf2",0,0,""

该处设置自己阿里云端的MQTT属性!实际使用过程中,仅需要修改第四位(用户名),第五位(密码)数据即可!

MQTT属性获取


在发送AT指令后

        (6)发送AT+MQTTCLIENTID=0,"ClienID"     //设置MQTT ID,注意!!要在ID信息每一个”,“前加”\“进行转义!!!

ID获取方式

例:AT+MQTTCLIENTID=0,"ioieobDLZef.esp01-s|securemode=2\,signmethod=hmacsha256\,timestamp=1704945210243|"

        (7)发送AT+MQTTCONN=0,"域名",1883,1     //发送MQTT域名,域名获取

例:AT+MQTTCONN=0,"iot-06z00h7yodidaaj.mqtt.iothub.aliyuncs.com",1883,1

        (8)完成以上8个步骤后,刷新设备界面即可看到设备已经激活上线!

        (9)发送AT+MQTTSUB=0,"订阅topic",1      //订阅的主题

订阅信息获取

可以得到订阅主题信息  /ioieobDLZef/${deviceName}/user/get,我们要在${deviceName}部分填入设备名称

例:AT+MQTTSUB=0,"/ioieobDLZef/esp01-s/user/get",1

成功返回OK后,可以在设备Topic列表下看到订阅主题信息

        至此你的ESP-01s已经成功接入阿里云平台了!!!

        3、阿里云功能定义

        (1)创建物理功能模型

需要先撤销发布,才可以编辑功能定义,添加模型功能

功能信息按需求填写

可以在此处看到我们刚刚定义的功能模型

成功发布后即可在设备中看到物理型数据

        4、上报下发

        (1)数据下发

成功发送后可以在串口助手中看到下发信息

        (2)数据上报

发送AT+MQTTPUB=0,"发布topic","AJson格式内容",1,0    //发布主题

json数据格式,{\"params\":{\"LEDSwitch\":20}},其中LEDSwitch为属性的标识符

发布主题获取

可以的到发布主题信息/sys/ioieobDLZef/${deviceName}/thing/event/property/post   我们需要在${deviceName}部分填写设备名称

例:AT+MQTTPUB=0,"/sys/ioieobDLZef/esp01-s/thing/event/property/post","{\"params\":{\"LEDSwitch\":1}}",1,0

可以在阿里云端物理型数据中看到我们上传的数据

可以看到我们的阿里云物模型数据“开关”已经被我们使用AT指令修改成了开启!!!!!!

        (3)日志查看

四、STM32部分

1、串口部分

有关串口部分的知识笔者不在过多阐述,此处引用正点原子串口实验代码

usart.c

#include "sys.h"
#include "usart.h"	  
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"					//ucos 使用	  
#endif//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif /*使用microLib的方法*//* 
int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	return ch;
}
int GetKey (void)  { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
}
*/#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;
//	NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);	//使能USART1,GPIOA时钟以及复用功能时钟//USART1_TX   PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RX	  PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);  //   //Usart1 NVIC 配置//    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
//	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
//  //USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART1, ENABLE);                    //使能串口 }//void USART1_IRQHandler(void)                	//串口1中断服务程序
//	{
//	u8 Res;
//#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.
//	OSIntEnter();    
//#endif
//	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
//		{
//		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
//		
//		if((USART_RX_STA&0x8000)==0)//接收未完成
//			{
//			if(USART_RX_STA&0x4000)//接收到了0x0d
//				{
//				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//				else USART_RX_STA|=0x8000;	//接收完成了 
//				}
//			else //还没收到0X0D
//				{	
//				if(Res==0x0d)USART_RX_STA|=0x4000;
//				else
//					{
//					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
//					USART_RX_STA++;
//					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
//					}		 
//				}
//			}   		 
//     } 
//#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.
//	OSIntExit();  											 
//#endif
//} 
#endif	

usart.h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "sys.h" 
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
#endif

2、esp8266初始化部分

原理很简单,通过串口利用printf函数进行打印AT指令。

需要注意的是:AT指令中,部分涉及转义字符!!!!例如:“ " ”要换为“ \" ”,“ \ ”要换为“ \\ ”,这里尤为要注意,因为是最容易忽略的地方,笔者在此处踩坑极多!!!所有的AT指令发送都必须加回车换行,既需要在AT指令末尾天界回车换行符”\r\n“。

esp8266.c 

#include "esp8266.h"
#include "usart.h"
#include "stm32f10x_usart.h"
#include "delay.h"
#include <stdio.h>
#include <string.h>
#include "esp8266.h"
void ESP8266_Init(void)
{
//	u16 t;  
//	u16 len;
//	u16 times=0;delay_init();       //延时函数初始化   
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//uart_init(115200); //串口初始化为11520//重启ESPprintf("AT+RESTORE\r\n");delay_ms(1000);delay_ms(1000);//wifi模式设置printf("AT+CWMODE=1\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);//服务器设置printf("AT+CIPSNTPCFG=1,8,\"cn.ntp.org.cn\",\"ntp.sjtu.edu.cn\"\r\n");		delay_ms(1000);delay_ms(1000); delay_ms(1000);//wifi名称,WiFi密码printf("AT+CWJAP=\"lsh\",\"123123321\"\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);//MQTT名称,MQTT密码printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"qOGoHHGwQpSqD4sBgEwA&ioiec5QMWli\",\"ca1a82cf02c1c8b243edeecd82433a2a1784d525c7ccc0abb8f41837bf2afdfe\",0,0,\"\"\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);//MQTTIDprintf("AT+MQTTCLIENTID=0,\"ioiec5QMWli.qOGoHHGwQpSqD4sBgEwA|securemode=2\\,signmethod=hmacsha256\\,timestamp=1702798229653|\"\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);//MQTT域名printf("AT+MQTTCONN=0,\"iot-06z00h7yodidaaj.mqtt.iothub.aliyuncs.com\",1883,1\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);//订阅消息printf("AT+MQTTSUB=0,\"/ioiec5QMWli/qOGoHHGwQpSqD4sBgEwA/user/get\",1\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);
//printf("AT+MQTTPUB=0,\"/a1A4PwdrMWk/ESP8268/user/update\",\"{\\\"LED\\\":1}\",1,0\r\n");
//  while(1)
//	{
//  if(USART_RX_STA&0x8000) //判断接受是否完成{if(strstr((const char*)USART_RX_BUF,"on")) //输入“on”,LED亮起{LED0=0;}if(strstr((const char*)USART_RX_BUF,"off")) //输入“off”,LED熄灭{LED0=1;}memset(USART_RX_BUF,0,500);
USART_RX_STA=0;}
//	}
}//上报温度信息√
void MQTT_TX_temperature(u16 num){
//	float temp;
//	temp = (float)temp/10;printf("AT+MQTTPUB=0,\"/sys/ioiec5QMWli/qOGoHHGwQpSqD4sBgEwA/thing/event/property/post\",\"{\\\"params\\\":{\\\"temperature\\\":%d}}\",1,0\r\n",num);	
}

esp8266.h

#ifndef _ESP8266_H
#define _ESP8266_H
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"void ESP8266_Init(void);void MQTT_TX_temperature(u16 num);
#endif

3、主函数部分

仅需要对串口以及esp8266部分进行初始化即可!

main.c

//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//
//  文 件 名   : main.c
//  版 本 号   : v2.0
//  作    者   : 无尽的苍穹
//  生成日期   : 2023-5-11
//  最近修改   : 
//  功能描述   :演示例程(STM32F103系列)
//******************************************************************************/
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "esp8266.h"int main(void)
{	delay_init();uart_init(115200);  //串口初始化ESP8266_Init();		  //ESP初始化while(1){MQTT_TX_temperature(33);}}

 大家可以根据自己需求进行二开。

五、总结

        从开始决定攻克ESP8266到结束,总计耗时接近两天时间,踩了无数的坑,几乎踩便了每一个坑,写文章的过程中,也在不停的踩坑,通过这篇文章希望能够帮助更多的小白能够少走弯路,加油!!!

相关文章:

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…...

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…...

TCP队头阻塞问题以及QUIC解决方案

TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...

如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例

在当今数据驱动的商业环境中&#xff0c;获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而&#xff0c;像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序&#xff0c;获取eBay商品的销量详情&#xf…...

激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…...

算法基础之八大排序

文章目录 概要1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 希尔排序&#xff08;Shell Sort&#xff09;5. 归并排序&#xff08;Merge Sort&#xff09;6. 快速排…...

通达OA /mysql/index.php 未授权访问漏洞

通达OA /mysql/index.php 未授权访问漏洞 漏洞描述 通达OA 未授权访问phpmyadmin漏洞&#xff0c;攻击者无需帐号密码可直接访问phpmyadmin&#xff0c;造成数据库泄漏。攻击者可操作数据库执行sql语句&#xff0c;执行恶意操作&#xff0c;进行一步攻击。 威胁等级: 高危 …...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

C++类和对象

目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …...

docker常用命令及案例

以下是 Docker 的所有常用命令及其案例说明&#xff0c;按功能分类整理&#xff1a; 1. 镜像管理 1.1 拉取镜像 命令: docker pull <镜像名>:<标签>案例: 拉取官方的 nginx 镜像docker pull nginx:latest1.2 列出本地镜像 命令: docker images案例: 查看本地所有…...

webpack【初体验】使用 webpack 打包一个程序

打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...

初始数据结构☞复杂度与泛式

一.时间复杂度 定义&#xff1a; 算法的时间复杂度是一个数学函数&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度。 O渐进表示方法&#xff1a; 原因&#xff1a; 计算时间复杂度时&#xff0c;我们其实并不一定要计算精确的执行次数&#xff0c;而…...

理解UML中的四种关系:依赖、关联、泛化和实现

在软件工程中&#xff0c;统一建模语言&#xff08;UML&#xff09;是一种广泛使用的工具&#xff0c;用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型&#xff0c;如类图、用例图、序列图等&#xff0c;帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…...

【前端】打造自己的hexo博客_hexo一本通

今日更新完毕&#xff0c;建议关注收藏点赞&#xff01; 目录 打造自己的hexo blog挂载到自己的github主页设计自己的theme 打造自己的hexo blog #需要安装git node.js 这里略#安装hexo npm install -g hexo-cli npm install hexo hexo help#<folder>必须是空的 hexo in…...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...

储能系统-系统架构

已更新系列文章包括104、61850、modbus 、单片机等&#xff0c;欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统&#xff08;BESS&#xff09; 架构 电池储能系统主要包括、电池、pcs、本地控制…...

程序员也可以这样赚钱

最近有朋友和我交流了关于程序员副业的想法&#xff0c;我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐&#xff0c;结合政策合规性、平台口碑及实际操作性整理&#xff0c;覆盖国内外主流选择&#xff1a; 一、国内综合型平台 程序…...

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...

Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗

Elasticsearch 本身并不直接收集目标服务器的日志&#xff0c;它主要用于存储、搜索和分析数据。要收集目标服务器的日志&#xff0c;通常会借助其他工具&#xff0c;并且一般不需要在目标服务器上安装 Elasticsearch 软件&#xff0c;常见的日志收集方案&#xff1a; Filebeat…...

Linux:软硬链接和动静态库

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软硬链接和动静态库》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…...

C# 比较两个List集合内容是否相同

在 C# 中&#xff0c;要比较两个 List<T> 集合的内容是否相同&#xff0c;可以通过以下几种方法&#xff1a; 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法&#xff08;顺序和内容都相等&#xff09; 顺序和内容都相等&#xff1a;使用 SequenceEqual。 usin…...

IDEA中Resolving Maven dependencies卡着不动解决方案

一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现‌。以下是具体步骤: ‌1、找到settings.xml文件‌: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、‌编辑se…...

重生之我要当云原生大师(十一)访问Linux文件系统

目录 一、解释下文件系统、块设备、挂载点、逻辑卷。 二、简述文件系统、块设备、挂载点、逻辑卷之间的关系&#xff1f; 三、如何检查文件系统&#xff1f; 四、挂载和卸载文件系统的流程&#xff1f; 五、find命令都可以根据什么查找文件。 一、解释下文件系统、块设备、…...

驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现

一:概述 动态显存技术(Dynamic Video Memory Technology, DVMT)是一种由 Intel 提出的内存分配技术,主要用于整合显卡(集成显卡)系统中,以便动态地调整显存大小,从而在不同的负载场景下优化内存使用和系统性能。 动态显存技术的核心在于共享系统内存。集成显卡没有独立…...

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…...

HTML5 应用程序缓存

HTML5 应用程序缓存 引言 随着互联网技术的飞速发展,移动设备的普及,用户对于网页的加载速度和离线访问的需求日益增长。HTML5 应用程序缓存(Application Cache,简称AppCache)应运而生,它允许开发者将网页资源存储在本地,从而实现网页的快速加载和离线访问。本文将详细…...

7.PPT:“中国梦”学习实践活动【20】

目录 NO1234​ NO5678​ NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字&#xff1a;复制/挪动→“PPT.pptx”的新演示文稿&#xff08;蓝色、黑色、红色&#xff09; 视图→幻灯片母版→重命名&#xff1a;“中国梦母版1”→背景样…...

利用NestJS构建高效的RESTful API接口

1. 引言 项目背景与目标 随着互联网应用的快速发展,RESTful API已成为前后端分离架构中的重要组成部分。本文将介绍如何使用NestJS构建一个高效且可维护的RESTful API接口。目标是通过NestJS的模块化和依赖注入特性,实现一个易于扩展和维护的API系统。 RESTful API的重要性…...

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…...

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…...

目前推荐的优秀编程学习网站与资源平台,涵盖不同学习方式和受众需求

一、综合教程与互动学习平台 菜鸟教程 特点:适合零基础新手,提供免费编程语言教程(Python、Java、C/C++、前端等),页面简洁且包含大量代码示例,支持快速上手。适用人群:编程入门者、需要快速查阅语法基础的学习者。W3Schools 特点:专注于Web开发技术(HTML、CSS、JavaS…...

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…...

正则表达式的简单介绍 + regex_match使用

正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成&#xff0c;用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。 它的主…...

kafka服务端之延时操作前传--时间轮

文章目录 背景时间轮层级时间轮时间轮降级kafka中的时间轮kafka如何进行时间轮运行 背景 Kafka中存在大量的延时操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能&#xff0c;而是基于时间轮的概念自定义实现…...

鸿蒙harmony 手势密码

1.效果图 2.设置手势页面代码 /*** 手势密码设置页面*/ Entry Component struct SettingGesturePage {/*** PatternLock组件控制器*/private patternLockController: PatternLockController new PatternLockController()/*** 用来保存提示文本信息*/State message: string …...

如何修复WordPress连接超时显示curl-error-28的错误

许多WordPress用户都会遇到这样的问题&#xff1a;网站加载变慢或数据传输失败&#xff0c;后台提示‘cURL错误28&#xff1a;连接超时’。这其实是一个常见的问题&#xff0c;通常是由于数据传输时间过长造成的。虽然这个错误听起来复杂&#xff0c;但解决起来并不算困难。本文…...

CSS 相关知识

1、高度已知&#xff0c;三栏布局&#xff0c;左右宽度 200&#xff0c;中间自适应&#xff0c;如何实现&#xff1f; <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…...

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释&#xff1a; Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单

文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...

【C语言标准库函数】双曲函数:sinh(), cosh(), tanh()

目录 一、头文件 二、函数简介 2.1. 双曲正弦函数 sinh(double x) 2.2. 双曲余弦函数 cosh(double x) 2.3. 双曲正切函数 tanh(double x) 三、函数实现&#xff08;概念性&#xff09; 四、注意事项 4.1. 参数类型 4.2. 计算精度 4.3. 函数返回值 4.4. 环境差异 4.…...

Visual Studio(VS)初始配置环境(scanf异常)

发现问题 当我们第一次安装Visual Studio&#xff08;VS&#xff09;且没有初次环境配置时&#xff0c;用某些函数时会发现报错异常。&#xff08;如下scanf函数为例&#xff09; #include<stdio.h>int main() {int a 0;scanf("%d", &a);printf("%…...

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…...

《图解设计模式》笔记(五)一致性

十一、Composite模式&#xff1a;容器与内容的一致性 像文件夹与文件一样&#xff0c;文件夹中可以放子文件夹与文件&#xff0c;再比如容器中可以放更小的容器和具体内容。 Composite模式&#xff1a;使容器与内容具有一致性&#xff0c;创造出递归结构。 Composite&#x…...

burpsuite抓取html登陆和上传数据包

一、burpsuite抓取html登陆数据包 1、先写一个html格式的登陆页面 <!doctype html> <html lang="en"> <head><meta charset="UTF-8"><title>这是标签</title></head> <body> <hr><!-- 登陆表单…...