STM32外设系列—ESP8266(WIFI)

news2024/11/28 10:51:06

文章目录

  • 一、ESP8266简介
  • 二、固件库烧录
  • 三、常用AT指令
  • 四、访问API
    • 4.1 获取IP地址
    • 4.2 GET天气信息
    • 4.3 访问结果展示
  • 五、实战项目
    • 5.1 串口配置
    • 5.2 检测WIFI模块连接状态
    • 5.3 发送配置指令
    • 5.4 解析天气信息
  • 六、成果展示

一、ESP8266简介

ESP8266是嵌入式和物联网开发中常用的模块,它可以单独作为MCU使用,也可以作为一个简单的WIFI模块。ESP8266可以利用串口与单片机进行通讯。利用ESP8266可以访问一些API,获取天气信息或者完成网络授时,也可以连接云平台进行开发。

二、固件库烧录

有些新买来的ESP01-S并不能支持AT指令,需要我们手动烧录固件库。虽然烧录固件库有许多教程,但是博主烧录过两次,过程都不是特别顺利,这里专门整理一下烧录步骤,也方便后续使用。固件库和烧录软件可以联系卖家索要,这里就不再放链接了。

首先按照下表连接好引脚

引脚连接
3.3V3.3V
RST3.3V
EN3.3V
IO23.3V
GNDGND
IO0GND
TXDRXD
RXDTXD

打开烧写软件,选择ESP8266

ESP8266

按照下图配置

烧写固件配置图

选择串口,点击“START”,烧写完成后关闭即可。

烧写完成

此时,拔掉IO0的接地,重新上电。打开串口调试助手检查烧录情况。打开串口调试助手,发送“AT”,换行加回车,观察返回信息。如果返回“OK”,说明烧录成功。

烧录成功

三、常用AT指令

下面简单介绍一些WIFI模块常用的AT指令

  • AT\r\n
    检查ESP8266模块连接是否正常
  • AT+CWMODE=1\r\n
    配置模块为Sta模式
  • AT+CWJAP=“WIFI名称”,“WIFI密码”\r\n
    连接指定WIFI
  • AT+CIPMUX=0\r\n
    设置成单连接
  • AT+CIPMODE=1\r\n
    开启透传模式
  • AT+CIPSTART=“TCP”,“203.119.175.194”,80\r\n
    创建TCP连接
    如何获取IP地址,后面会有介绍
  • AT+CIPMODE=1\r\n
    进入透传模式
    进入到透传模式后AT指令就会失效,需要退出后才能生效
  • AT+CIPSEND\r\n
    准备向服务器发送请求,前面都成功的前提下发送完这个指令后会出现一个>,此时输入GET信息即可

四、访问API

下面以访问心知天气API为例,介绍一下利用WIFI模块访问API的流程。关于心知天气API的一些介绍,这里就不再赘述了。在开始下面的操作之前,需要先按照上面介绍的AT指令顺序,配置好WIFI模块。

4.1 获取IP地址

电脑win+R,输入ping api.seniverse.com,点击确定就可以获取到IP。

ping心知天气API的返回信息

其中“116.62.81.138”就是IP地址。

4.2 GET天气信息

按照第三小节常用AT指令的输入顺序,连接WIFI,建立TCP连接。最后获取天气信息。获取天气信息时,输入以下内容

GET https://api.seniverse.com/v3/weather/now.json?key=你的密钥&location=beijing&language=zh-Hans&unit=c

4.3 访问结果展示

利用USB转TTL连接WIFI模块,利用串口调试助手发送AT指令,完成对心知天气API的访问。结果如下

心知天气API返回信息

可以看到,虽然一些是乱码,但是能够接收到天气现象代码和温度。关于天气现象代码,心知天气的API文档里有介绍

天气现象代码

后面还有很多,这里就不再列举了,具体可以去看看文档。

五、实战项目

下面就以利用WIFI模块,搭配STM32,访问心知天气API来获取天气和温度为例,展示一下WIFI的程序设计,仅供参考。该项目有以下功能

  • 串口1与WIFI模块通信,能够检测WIFI连接是否正常
  • 利用WIFI模块访问心知天气API,利用串口2将获取到的天气和温度打印到电脑

5.1 串口配置

这里需要用到两个串口。关于串口通信的相关内容这里就不再赘述了,详细可见博主的STM32速成笔记专栏串口通信篇。串口初始化程序如下

/*
 *==============================================================================
 *函数名称:uart_init
 *函数功能:初始化USART
 *输入参数:UARTx:串口几;bound:波特率
 *返回值:无
 *备  注:可以修改成输入初始化哪个USART
 *==============================================================================
 */
void uart_init(UART_TypeDef UARTx,u32 bound)
{
	// 相关结构体定义
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	switch (UARTx)
	{
		case 0:
			// 使能USART1,GPIOA时钟
			RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);	

			// USART1_TX   GPIOA.9
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   // PA.9
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
			GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.9

			// USART1_RX	  GPIOA.10初始化
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   // PA10
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入
			GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.10  

			// 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;   // 串口波特率
			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);   // 初始化串口1
			
			USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   // 开启串口接收中断
			USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);   // 使能空闲中断
			
			USART_Cmd(USART1, ENABLE);   // 使能串口1
			
			break;
			
		case 1:
			// 使能USART2,GPIOA时钟
			RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE);	

			// USART2_TX   GPIOA.2
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   // PA.2
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
			GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.2

			// USART2_RX	  GPIOA.3初始化
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   // PA3
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入
			GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.3 

			// Usart2 NVIC 配置
			NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
			NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;   // 抢占优先级3
			NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   // 子优先级3
			NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // IRQ通道使能
			NVIC_Init(&NVIC_InitStructure);   // 根据指定的参数初始化VIC寄存器

			// USART2 初始化设置
			USART_InitStructure.USART_BaudRate = bound;   // 串口波特率
			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(USART2, &USART_InitStructure);   // 初始化串口2
			
			USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);   // 开启串口接收中断
			USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);   // 使能空闲中断
			
			USART_Cmd(USART2, ENABLE);   // 使能串口2
			
			break;
			
			default:
				break;
	}
}

值得注意的是,串口2挂载在APB2上,开启串口2时钟时需要注意。博主最开始用错了开启时钟的函数,导致PA2引脚一直输出低电平。

printf用于串口1的输出,需要再定义一个串口发送函数

/*
 *==============================================================================
 *函数名称:USART_Send
 *函数功能:串口发送函数
 *输入参数:str:要发送的数据的数组首地址;UARTx:串口几
 *返回值:无
 *备  注:调用前先将需要发送的内容利用sprintf()函数转换成字符串,再进行发送
 *==============================================================================
 */
void USART_Send (UART_TypeDef UARTx,u8 *str)
{
	u8 index = 0;
	
	do
	{
		switch (UARTx)
		{
			case 0:
				USART_SendData(USART1,str[index ++]);
				while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
				break;
			
			case 1:
				USART_SendData(USART2,str[index ++]);
				while (USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
			break;
		}
	}
	while(str[index] != 0);
}

5.2 检测WIFI模块连接状态

检测原理十分简单,只需要利用串口1给WIFI模块发送“AT\r\n”,检测是否接收到“OK”。如果接收到“OK”,说明连接正常。如果没有接收到“OK”,说明连接异常。利用串口2输出连接状态。串口1给WIFI模块发送“AT”程序如下

u8 gOkFlag = 0;   // 配置成功标志位

/*
 *==============================================================================
 *函数名称:Med_Esp8266_CheckLink
 *函数功能:检查ESP8266连接状态
 *输入参数:无
 *返回值:0:未连接;1:连接正常
 *备  注:一直发送AT,直到接收到OK
 *==============================================================================
 */
u8 Med_Esp8266_CheckLink (void)
{
	while (!gOkFlag)
	{
		// 发送AT,检查连接状态
		printf ("AT\r\n");
		delay_ms(100);
		
		return 0;
	}
	
	gOkFlag = 0;   // 清零配置成功变量
	return 1;
}

一直循环发送,直到检测到返回的内容中有“OK”。串口1的接收中断函数和解析函数如下

/*
 *==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}
/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
extern u8 gOkFlag;   // 配置成功标志位

void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	u16 tempVar = 0;   // 临时循环变量
	
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		for (tempVar = 0;tempVar < gReceCount;tempVar ++)
		{
			if (gReceFifo[tempVar] == 'O' && gReceFifo[tempVar + 1] == 'K')
			{
				gOkFlag = 1;   // 成功标志位置1
				break;
			}
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

上电后检查WIFI模块连接状态,串口2返回信息

	u32 checkCunt = 0;   // 检测连接状态计次变量
	
	Med_Mcu_Iint();   // 系统初始化
	
	// 检查ESP8266模块连接状态
	while (!Med_Esp8266_CheckLink())
	{
		checkCunt = checkCunt + 1;   // 检测计数变量加1
		
		// 检测接收内容
		Uart_Rece_Pares();
		
		// 未连接
		if (checkCunt > 1)
		{
			sprintf((char*)gString,"ESP8266未连接!\r\n");
			USART_Send(UART2,gString);
			delay_ms(500);
		}
	}
	sprintf((char*)gString,"ESP8266已连接!\r\n");
	USART_Send(UART2,gString);

5.3 发送配置指令

这里给出一个发送配置指令的函数,串口1给WIFI模块发送指令,串口2观察发送是否成功。

/*
 *==============================================================================
 *函数名称:Med_Esp8266_CheckLink
 *函数功能:检查ESP8266连接状态
 *输入参数:str:要发送的指令
 *返回值:无
 *备  注:调用前先将需要发送的内容利用sprintf()函数转换成字符串
					串口1发送指令,串口2返回信息
 *==============================================================================
 */
u8 gSendCunt = 0;   // 记录发送次数

void Med_Esp8266_SendCmd (u8 *str)
{
	u8 string[100];
	
	while (!gOkFlag)
	{
		// 发送AT指令
		USART_Send(UART1,str);
		delay_ms(1000);
		
		gSendCunt = gSendCunt + 1;   // 发送次数加1
		
		// 检测接收内容
		Uart_Rece_Pares();
		
		if (gSendCunt > 10)
		{
			sprintf((char*)string,"%s指令发送失败!\r\n",str);
			USART_Send(UART2,string);
		}
	}
	
	sprintf((char*)string,"%s指令发送成功!\r\n",str);
	USART_Send(UART2,string);
	gSendCunt = 0;   // 清零发送次数
	gOkFlag = 0;   // 清零配置成功变量
}

配置步骤如下

	// 配置模块为Sta模式
	sprintf((char*)gString,"AT+CWMODE=1\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 连接指定WIFI
	sprintf((char*)gString,"AT+CWJAP=\"ertu\",\"ertu201801101102\"\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 设置成单连接
	sprintf((char*)gString,"AT+CIPMUX=0\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 开启透传模式
	sprintf((char*)gString,"AT+CIPMODE=1\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 创建TCP连接
	sprintf((char*)gString,"AT+CIPSTART=\"TCP\",\"116.62.81.138\",80\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 进入透传模式
	sprintf((char*)gString,"AT+CIPMODE=1\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 准备向服务器发送请求
	sprintf((char*)gString,"AT+CIPSEND\r\n");
	Med_Esp8266_SendCmd(gString);

5.4 解析天气信息

接下来就是向服务器请求天气信息,然后解析。需要修改一下串口接收内容的解析函数,接收到“code”认为天气信息获取成功,解析并返回天气信息。

/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
extern u8 gOkFlag;   // 配置成功标志位

void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	u16 tempVar = 0;   // 临时循环变量
	u8 string[100];   // 串口打印数组
	
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		for (tempVar = 0;tempVar < gReceCount;tempVar ++)
		{
			if (gReceFifo[tempVar] == 'O' && gReceFifo[tempVar + 1] == 'K')
			{
				gOkFlag = 1;   // 成功标志位置1
				break;
			}
			
			// 接收到API返回结果
			// 针对心知天气API
			if (gReceFifo[tempVar] == 'c' && gReceFifo[tempVar + 1] == 'o' && gReceFifo[tempVar + 2] == 'd'
					 && gReceFifo[tempVar + 3] == 'e')
			{
				sprintf((char*)string,"天气信息获取成功\r\n");
				USART_Send(UART2,string);
				
				// 提取天气信息
				sprintf((char*)string,"天气现象代码:%c   温度:%c%c℃\r\n",gReceFifo[tempVar + 7],gReceFifo[tempVar + 25]
																																													,gReceFifo[tempVar + 26]);
				USART_Send(UART2,string);
				break;
			}
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

六、成果展示

成果展示

总结来看,博主对于ESP8266的指令发送函数比较满意,但是由于博主能力有限,这些仅供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js实现用时间戳生成13位随机数

效果如图&#xff1a; methods里面写方法&#xff1a; changeTime(val) {//去掉-var reg new RegExp("-", "g");var a val.replace(reg, "");//去掉空格var regs new RegExp(" ", "g");var b a.replace(regs, "&qu…

MBD stm32开发 脉冲->GPIO

matlab1028b以上 stm32cubemx5.6.0以上 从正点原子下载&#xff0c;百度的可能存在java问题 stm32-mat/target 教程与代码分享 - 知乎 安装好这些后&#xff0c;打开matlab&#xff0c;打开路径STM32-MAT\STM32 打开MATLAB&#xff0c;在设置路径中添加STM32-MAT/TARGET文件…

港联证券|股指预计维持震荡格局 关注汽车、半导体等板块

6月全行业、全部非金融行业景气继续回落&#xff0c;中报或确认1Q23为本轮全A非金融盈利增速底&#xff0c;但价格支撑偏弱→复苏或缺弹性。结合本轮PPI见底时间、历次去库周期时长以及周期底部的合意库存水平&#xff0c;本轮库存周期大约3Q23见底&#xff0c;Q3市场或进入“补…

关于公安部三所开展网络安全产品认证工作的公告

各网络安全产品厂商&#xff1a; 2023年7月3日&#xff0c;国家互联网信息办公室、工业和信息化部、公安部、国家认证认可监督管理委员会发布了《关于调整<网络关键设备和网络安全专用产品目录>的公告》&#xff08;2023年第2号&#xff09;&#xff0c;调整了网络安全专…

最新kali Linux2023.1镜像下载链接

我们一般推荐使用国内镜像下载 kali linux-2023.1下载地址&#xff1a;国内镜像阿里云开源镜像站下载地址&#xff1a;kali-images-kali-2023.1安装包下载_开源镜像站-阿里云 kali linux-2023.1下载地址&#xff1a;国内镜像网易开源镜像站下载地址&#xff1a;http://mirror…

Spring Boot 中的模板引擎是什么,如何使用

Spring Boot 中的模板引擎是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;模板引擎是一种用于动态生成 HTML、XML、JSON 等文档的工具。Spring Boot 内置了多种常见的模板引擎&#xff0c;例如 Thymeleaf、Freemarker、Velocity 等&#xff0c;让我们可以轻松地创建…

赋值CString时导致程序崩溃的一个问题

使用GetWindowTextW将vgj容器内指定结构体的opinion变量赋值 GetDlgItem(IDC_EDIT2)->GetWindowTextW(vgj.at(i).opinion);//将opinion赋值导致程序出现崩溃&#xff0c;通常这种崩溃是由于访问野指针造成的 检查之前的代码有 memset(&vgj.at(i), 0, sizeof(vgj.at(i…

TextFuseNet:具有更丰富融合特征的场景文本检测

计算机视觉 文章目录 计算机视觉摘要1.介绍2.相关工作3.方法3.1框架3.2 多层次特征表示3.3 多路径融合体系结构3.4 弱监督学习 4.实验4.1 数据集4.2 细节4.3消融实验4.4 与最新的形状文本检测方法的比较 5. 结论 论文地址&#xff1a;https://www.ijcai.org/Proceedings/2020/7…

Python教程(2)——开发python常用的IDE

为什么需要IDE 在理解IDE之前&#xff0c;我们先做以下的实验&#xff0c;新建一个文件&#xff0c;输入以下代码 total_sum 0 for x in range(1,101):total_sum x print(total_sum)非常非常简单的一个程序&#xff0c;主要就是计算1加到100的值&#xff0c;我们将它重命名…

阿里云国际站:阿里云究竟是如何胜出的?

标题&#xff1a;阿里云究竟是如何胜出的&#xff1f;   "阿里云究竟是如何胜出的&#xff1f;"这是一个引人入胜的问题&#xff0c;值得我们深挖细究。作为中国市场上引领潮流的云计算服务供应商&#xff0c;阿里云的成功并不是偶发事件&#xff0c;而是其在技术创…

Java语言 - Unicode编码与字符串互转

概述 项目需要Unicode编码与字符串互转&#xff0c;在此做个笔录。 1、code // Press Shift twice to open the Search Everywhere dialog and type show whitespaces, // then press Enter. You can now see whitespace characters in your code. public class Main {public…

一起来看看文档翻译哪个好吧

在繁忙的都市生活中&#xff0c;小玲是一位年轻的职场人士。她的工作经常需要处理各种文档和文件&#xff0c;而其中不乏需要与外国合作伙伴交流的时候。然而&#xff0c;她并不熟悉其他语言&#xff0c;这给她的工作带来了一定的困扰。于是&#xff0c;她开始寻找免费的文档翻…

npm配置淘宝镜像

1.直接配置 npm config set registry https://registry.npmmirror.com/ 2.工具配置 使用nrm配置&#xff0c;镜像地址为&#xff1a;npm registry manager 2.1安装 npm install -g nrm open8.4.2 --save 2.2使用淘宝镜像 nrm use taobao 2.3切换镜像 nrm ls 2.4查看配置项 n…

ssl代理是什么,哪些业务场景可以使用ssl代理?

随着数智化时代的到来&#xff0c;网络安全变得尤为重要。为了保护敏感信息和确保通信的安全性&#xff0c;SSL代理应运而生。SSL代理是一种网络代理服务器&#xff0c;通过解密和重新加密SSL/TLS加密通信&#xff0c;实现对网络通信的监控、分析和保护。今天&#xff0c;我们就…

伦敦金实时走势k线图中的信息

伦敦金实时走势k线图中隐含者很多投资者容易忽略的信息&#xff0c;而且这些信息并不是借助技术指标就能够解读得到得&#xff0c;要通过金价过去和实时走势&#xff0c;去判断未来的走势&#xff0c;投资者需要经历以下的步骤&#xff1a; 首先是要读懂市场的基本结构。很多伦…

Mysql数据库(三) Mysql命令行客户端数据增加、查询、修改、删除;起别名、去重

目录 一、数据增加、查询、修改、删除、起别名、去重 1.0 准备操作 1.1 添加数据 insert 1.1.1 全列添加 1.1.2 部分列插入 1.1.3 插入多行数据 1.2 查询数据 select 1.2.1 查询所有的 列 1.2.2 查询指定的 列 1.3 修改数据 update set 1.4 删除数据 delete 1.5 …

C#(五十三)之线程同步、互锁

无关线程&#xff1a;线程之间没有任何联系&#xff0c;独立运行&#xff0c;互不干扰 相关线程&#xff1a;线程之间有联系&#xff0c;两个线程之间资源共享 临界线程&#xff1a;多个线程共享资源 临界区&#xff1a;访问临界资源代码 同步&#xff1a;两个线程协同工作…

单摆模型(博途PLC和Simulink仿真对比)

单摆模型的详细推导公式可以参看下面文章链接,这篇博客主要给出在博途PLC里如何完成单摆模型的建模, 倒立摆的PLC控制(模型分析+ SCL源代码)_RXXW_Dor的博客-CSDN博客首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆…

自由创新,分享图片编辑工具

在当今社交媒体的流行时代&#xff0c;分享精美照片已成为人们生活中不可或缺的一部分。为了让我们的照片更加与众不同&#xff0c;图片编辑工具成为了必备的利器。这些神奇的工具不仅能帮助我们改善照片的外观和质量&#xff0c;还能增添创意效果&#xff0c;让我们的照片在社…

vue-导入图标iconfont到项目中并使用

阿里巴巴矢量图标库官网&#xff1a; 打开官网-我的素材库 选中要导入的项目-点击下载 下载好一个包 解压后得到 将这些文件全部复制到vue项目的src/assets/icon目录下 在main.js中导入 import /assets/icon/iconfont.css 即可使用 【示例】 在任意一个vue界面的<templa…