STM32案例学习 GY-39环境监测传感器模块

news2024/10/7 6:39:37

STM32案例学习 GY-39环境监测传感器模块

硬件平台

  1. 野火STM32F1系列开发板
  2. 正点STM32F1系列开发板
  3. STM32F103ZET6核心板
  4. GY-39环境监测传感器模块
    STM32产品
    在这里插入图片描述

在这里插入图片描述

GY-39环境监测传感器模块

  1. GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v,功耗小,安装方便。
  2. 其工作原理是,MCU 收集各种传感器数据,统一处理,直接输出计算后的结果。此模块,有两种方式读取数据,即**串口 UART(TTL 电平)**或者 IIC(2 线)。串口的波特率有 9600bps 与 115200bps,可配置,有连续,询问输出两种方式,可掉电保存设置。可适应不同的工作环境,与单片机及电脑连接。
  3. 模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU 不参与数据处理工作
  4. 参考资料网站 https://www.gysensor.cn/air-gy39/
    在这里插入图片描述

技术参数(传感器精度请参考芯片手册)

在这里插入图片描述

模块引脚声明

Pin1VCC电源+ (3v-5v)
Pin2CT串口UART_TX / IIC_SCL
Pin3DR串口UART_RX / IIC_SDA
Pin4GND电源地
Pin5NC保留,不要连接
Pin6INTmax44009光强芯片中断 S1=0(接GND时启用)
Pin7SDA芯片数据线S1=0(接GND时启用)
Pin8SCL芯片时钟线S1=0(接GND时启用)
PinAS0串口/MCU_IIC模式选择,接地为MCU_IIC模式
PinBS1仅使用传感器芯片选择

模块通信协议描述

  1. 串口通信
    (1) 串口通信参数(默认波特率值 9600bps,可通过软件设定)
    波特率:9600 bps 校验位:N 数据位:8 停止位:1
    波特率:115200 bps 校验位:N 数据位:8 停止位:1
    (2) 模块输出格式,每帧包含 8-13 个字节(十六进制):
    ① .Byte0: 0x5A 帧头标志
    ②. Byte1: 0x5A 帧头标志
    ③. Byte2: 0x15 本帧数据类型(参考含义说明)
    ④. Byte3: 0x04 数据量
    ⑤. Byte4: 0x00~0xFF 数据前高 8 位
    ⑤. Byte5: 0x00~0xFF 数据前低 8 位
    ⑥. Byte6: 0x00~0xFF 数据后高 8 位
    ⑦. Byte7: 0x00~0xFF 数据后低 8 位
    ⑧. Byte8: 0x00~0xFF 校验和(前面数据累加和,仅留低 8 位)

    (3) Byte2 代表的含义说明

    Byte20x150x450x55
    说明光照强度温度,湿度,气压,海拔IIC地址

    (4) 数据计算方法
    ①光照强度计算方法(当 Byte2=0x15 时,数据:Byte4~Byte7) :
    Lux=(前高8位<<24) | (前低8位<<16) | (后高8位<<8) | 后低8位 单位lux
    例:一帧数据

    	<5A- 5A- 15 -04- 00 -00- FE- 40- 0B >
    

    Lux=(0x00<<24)|(0x00<<16)|(0xFE<<8)|0x40
    Lux=Lux/100 =650.88 (lux)
    ②温度、气压、湿度、海拔,计算方法(当 Byte2=0x45 时):
    温度:Byte4~Byte5
    T=(高 8 位<<8)|低 8 位
    T=T/100 单位℃

    气压:Byte6~Byte9
    P=(前高 8 位<<24) | (前低 8 位<<16) | (后高 8 位<<8) | 后低 8 位
    P=P/100 单位 pa

    湿度:Byte10~Byte11
    Hum=(高 8 位<<8)|低 8 位
    Hum=Hum/100 百分制

    海拔:Byte12~Byte13
    H=(高 8 位<<8)|低 8 位 单位 m
    例:一帧数据

     < 5A -5A -45 -0A -0B -2D -00 -97 -C4 -3F -12- 77 -00- 9C- FA >
    

    T=(0x0B<<8)|0x2D=2861
    温度 T=2861/100=28.61 (℃)
    P=(0x00<<24)|(0x97<<16)|(C4<<8)|3F=9946175
    气压 P=9946175/100=99461.75 (pa)
    Hum=(0x12<<8)| 77=4727
    湿度 Hum=4727/100=47.27 (%)
    海拔 H=(0x00<<8)|0x9c=156 (m)

(5) 命令字节,由外部控制器发送至 GY-39 模块(十六进制)
在这里插入图片描述
在这里插入图片描述
2. IIC通信
在这里插入图片描述

硬件测试

接线示意图

在这里插入图片描述

代码

#include "main.h"
 void I2C_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
		/* 使能与 I2C有关的时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );  

	 /* PC3-I2C_SCL、PC5-I2C_SDA*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 
	GPIO_Init(GPIOB, &GPIO_InitStructure); 
	SCL_H;
	SDA_H;
}
void delay_1us(uint8_t x)//粗略延时,iic_40K
{
	uint8_t i=20;
	x=i*x;
	while(x--);
}
IIC起始函数//
/*
IIC起始:当SCL处于高电平期间,SDA由高电平变成低电平出现一个下降沿,然后SCL拉低
*/
uint8_t I2C_Start(void)
{
		SDA_H; 
		delay_1us(5);	//延时保证时钟频率低于40K,以便从机识别
		SCL_H;
		delay_1us(5);//延时保证时钟频率低于40K,以便从机识别
		if(!SDA_read) return 0;//SDA线为低电平则总线忙,退出
		SDA_L;   //SCL处于高电平的时候,SDA拉低
		delay_1us(5);
	  if(SDA_read) return 0;//SDA线为高电平则总线出错,退出
		SCL_L;
	  delay_1us(5);
	  return 1;
}
//**************************************
//IIC停止信号
/*
IIC停止:当SCL处于高电平期间,SDA由低电平变成高电平出现一个上升沿
*/
//**************************************
void I2C_Stop(void)
{
    SDA_L;
		SCL_L;
		delay_1us(5);
		SCL_H;
		delay_1us(5);
		SDA_H;//当SCL处于高电平期间,SDA由低电平变成高电平             //延时
}
//**************************************
//IIC发送应答信号
//入口参数:ack (0:ACK 1:NAK)
/*
应答:当从机接收到数据后,向主机发送一个低电平信号
先准备好SDA电平状态,在SCL高电平时,主机采样SDA
*/
//**************************************
void I2C_SendACK(uint8_t i)
{
    if(1==i)
			SDA_H;	             //准备好SDA电平状态,不应答
    else 
			SDA_L;  						//准备好SDA电平状态,应答 	
	  SCL_H;                    //拉高时钟线
    delay_1us(5);                 //延时
    SCL_L ;                  //拉低时钟线
    delay_1us(5);    
} 
///等待从机应答
/*
当本机(主机)发送了一个数据后,等待从机应答
先释放SDA,让从机使用,然后采集SDA状态
*/
/
uint8_t I2C_WaitAck(void) 	 //返回为:=1有ACK,=0无ACK
{
	uint16_t i=0;
	SDA_H;	        //释放SDA
	SCL_H;         //SCL拉高进行采样
	while(SDA_read)//等待SDA拉低
	{
		i++;      //等待计数
		if(i==500)//超时跳出循环
		break;
	}
	if(SDA_read)//再次判断SDA是否拉低
	{
		SCL_L; 
		return RESET;//从机应答失败,返回0
	}
  delay_1us(5);//延时保证时钟频率低于40K,
	SCL_L;
	delay_1us(5); //延时保证时钟频率低于40K,
	return SET;//从机应答成功,返回1
}
//**************************************
//向IIC总线发送一个字节数据
/*
一个字节8bit,当SCL低电平时,准备好SDA,SCL高电平时,从机采样SDA
*/
//**************************************
void I2C_SendByte(uint8_t dat)
{
  uint8_t i;
	SCL_L;//SCL拉低,给SDA准备
  for (i=0; i<8; i++)         //8位计数器
  {
		if(dat&0x80)//SDA准备
		SDA_H;  
		else 
		SDA_L;
    SCL_H;                //拉高时钟,给从机采样
    delay_1us(5);        //延时保持IIC时钟频率,也是给从机采样有充足时间
    SCL_L;                //拉低时钟,给SDA准备
    delay_1us(5); 		  //延时保持IIC时钟频率
		dat <<= 1;          //移出数据的最高位  
  }					 
}
//**************************************
//从IIC总线接收一个字节数据
//**************************************
uint8_t I2C_RecvByte()
{
    uint8_t i;
    uint8_t dat = 0;
    SDA_H;//释放SDA,给从机使用
    delay_1us(1);         //延时给从机准备SDA时间            
    for (i=0; i<8; i++)         //8位计数器
    { 
		  dat <<= 1;
			
      SCL_H;                //拉高时钟线,采样从机SDA
     
		  if(SDA_read) //读数据    
		   dat |=0x01;      
       delay_1us(5);     //延时保持IIC时钟频率		
       SCL_L;           //拉低时钟线,处理接收到的数据
       delay_1us(5);   //延时给从机准备SDA时间
    } 
    return dat;
}
//**************************************
//向IIC设备写入一个字节数据
//**************************************
uint8_t Single_WriteI2C_byte(uint8_t Slave_Address,uint8_t REG_Address,uint8_t data)
{
	  if(I2C_Start()==0)  //起始信号
		{I2C_Stop(); return RESET;}           

    I2C_SendByte(Slave_Address);   //发送设备地址+写信号
 	  if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
   
		I2C_SendByte(REG_Address);    //内部寄存器地址,
 	  if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
   
		I2C_SendByte(data);       //内部寄存器数据,
	  if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
		
		I2C_Stop();   //发送停止信号
		
		return SET;
}
//**************************************
//从IIC设备读取一个字节数据
//**************************************
uint8_t Single_ReadI2C(uint8_t Slave_Address,uint8_t REG_Address,uint8_t *REG_data,uint8_t length)
{
 if(I2C_Start()==0)  //起始信号
		{I2C_Stop(); return RESET;}          
	 
	I2C_SendByte(Slave_Address);    //发送设备地址+写信号
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;} 
	
	I2C_SendByte(REG_Address);     //发送存储单元地址
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;} 
	
	if(I2C_Start()==0)  //起始信号
			{I2C_Stop(); return RESET;}            

	I2C_SendByte(Slave_Address+1);  //发送设备地址+读信号
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
	
	while(length-1)
	{
		*REG_data++=I2C_RecvByte();       //读出寄存器数据
		I2C_SendACK(0);               //应答
		length--;
	}
	*REG_data=I2C_RecvByte();  
	I2C_SendACK(1);     //发送停止传输信号
	I2C_Stop();                    //停止信号
	return SET;
}

#ifndef _GY39_H
#define _GY39_H	 
#include "main.h"

#define SCL_H         GPIOB->BSRR = GPIO_Pin_6
#define SCL_L         GPIOB->BRR  = GPIO_Pin_6
   
#define SDA_H         GPIOB->BSRR = GPIO_Pin_7
#define SDA_L         GPIOB->BRR  = GPIO_Pin_7

#define SCL_read      GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)
#define SDA_read      GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)

void I2C_GPIO_Config(void);
void I2C_Stop(void);
uint8_t Single_WriteI2C_byte(uint8_t Slave_Address,uint8_t REG_Address,uint8_t data);
uint8_t Single_ReadI2C(uint8_t Slave_Address,uint8_t REG_Address,uint8_t *REG_data,uint8_t length);

#endif

/**
  ************************************* Copyright ****************************** 
  *    
  * FileName   : main.c   
  * Version    : v5.0		
  * Author     : dele			
  * Date       : 2023-07-19   
******************************************************************************
 */
/*
STLink 连接 SWDIO PA13 SWCLK PA14 不要使用这两个端口
*/
//--------------------------------------------------------------------------------------------------
//  包含头文件    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
#include "main.h"

//--------------------------------------------------------------------------------------------------
//  定义引用变量    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
float gy_temp,gy_hum;
float aht_temp,aht_hum;//温湿度  


//==================================================================================================
//  实现功能: 硬件初始化配置
//  函数说明: Hareware_Iint
//  函数备注: 
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
void Hareware_Iint(void)
{
    delay_init();//延时函数初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	USART1_Config(115200);//串口初始化波特率为115200 
    USART2_Config(115200);//ESP8266 通讯串口2  波特率为115200 
    printf("串口1配置			[OK] \r\n");
    printf("串口2配置			[OK] \r\n");
 	LED_Init();//LED端口初始化
    printf("LED_Init			[OK] \r\n");
    Beep_Init();//蜂鸣器初始化
    printf("Beep_Init			[OK] \r\n");
    KEY_Init();	//按键初始化
    printf("KEY_Init			[OK] \r\n");
	LCD_Init();  //液晶屏初始化
    printf("LCD_Init			[OK] \r\n");
    I2C_GPIO_Config();
    AHT_I2C_UserConfig();
    printf("AHT_I2C_UserConfig			[OK] \r\n");
    //TIM1_Int_Init(1999,35999);//定时1s
    //printf("TIM1_Int_Init			[OK] \r\n");
    W25QXX_Init();//W25QXX初始化
    printf("W25QXX初始化			[OK] \r\n");
    POINT_COLOR=RED; 
    GBK_Lib_Init();   
    printf("硬件GBK字库初始化			[OK] \r\n");    
    //硬件GBK字库初始化--(如果使用不带字库的液晶屏版本,此处可以屏蔽,不做字库初始化) 	
 	tp_dev.init();//触摸屏初始化
    printf("触摸屏初始化			[OK] \r\n");
    
}
//==================================================================================================
//  实现功能: 传感器数据采集
//  函数说明: SensorGet_Data
//  函数备注: 
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//================================================================================================== 
typedef struct
{
    uint32_t Press;
    uint16_t Temperature;
    uint16_t Humidity;
    uint16_t Altitude;
} gy_module;

gy_module Bme={0,0,0,0};
//==================================================================================================
//  实现功能: 主函数
//  函数说明: main
//  函数备注: 
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//================================================================================================== 
int main(void)
{	   
	Hareware_Iint();
    printf("Hareware_Iint  [OK] \r\n");
    uint8_t  raw_data[13]={0};
	uint16_t data_16[2]={0};
	uint32_t Lux;

    while(1)
    {
        if(Single_ReadI2C(0xb6,0x04,raw_data,10))
		{
			Bme.Temperature=(raw_data[0]<<8)|raw_data[1];
			data_16[0]=(((uint16_t)raw_data[2])<<8)|raw_data[3];
			data_16[1]=(((uint16_t)raw_data[4])<<8)|raw_data[5];
			Bme.Press=(((uint32_t)data_16[0])<<16)|data_16[1];
			Bme.Humidity=(raw_data[6]<<8)|raw_data[7];
			Bme.Altitude=(raw_data[8]<<8)|raw_data[9];
		}
		if(Single_ReadI2C(0xb6,0x00,raw_data,4))
			data_16[0]=(((uint16_t)raw_data[0])<<8)|raw_data[1];
			data_16[1]=(((uint16_t)raw_data[2])<<8)|raw_data[3];
			Lux=(((uint32_t)data_16[0])<<16)|data_16[1];
			
            gy_temp = Bme.Temperature/100;
            gy_hum  = Bme.Humidity/100;
            
            printf("Temperature:%.2fDegC \r\n  ",(float)Bme.Temperature/100);
            printf("Prees:%.2fPa  \r\n",(float)Bme.Press/100);
            printf("Humidity: %.2f     \r\n ",(float)Bme.Humidity/100);
            printf("Altitude: %.2f m   \r\n ",(float)Bme.Altitude);
			printf("LightLux: %.2f lux \r\n ",(float)Lux/100);  
			delay_ms(200);
        
    }


}

测试效果

代码参考链接
在这里插入图片描述

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

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

相关文章

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码 3…

京东自动化功能之商品信息监控是否有库存

这里有两个参数,分别是area和skuids area是地区编码,我这里统计了全国各个区县的area编码,用户可以根据实际地址进行构造skuids是商品的信息ID填写好这两个商品之后,会显示两种状态,判断有货或者无货状态,详情如下图所示 简单编写下python代码,比如我们的地址是北京市…

Kaggle:树叶分类(使用Jupyter)

竞赛网址&#xff1a;https://www.kaggle.com/c/classify-leaves # 首先导入包 import torch import torch.nn as nn import pandas as pd import numpy as np from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image i…

uniapp 小程序 实时拍照(仅拍照)限制上传5张 可预览 可删除

效果图&#xff1a; common.js /*** 预览图片*/ const previewImage (current,list)>{// 预览图片uni.previewImage({current: current,urls: list}); } /*** 删除图片*/ const removeImage (current,list)>{var photoFilesList list;photoFilesList.splice(curren…

AJAX:宏任务与微任务

异步任务划分为了 宏任务&#xff1a;由浏览器环境执行的异步代码 微任务&#xff1a;由 JS 引擎环境执行的异步代码 宏任务和微任务具体划分&#xff1a; 左边表格是宏任务&#xff0c;右边是微任务 事件循环模型 /*** 目标&#xff1a;阅读并回答打印的执行顺序 */ console…

国内软件外包公司开发流程

当企业发展到一定阶段后&#xff0c;现有市场上通用型的软件往往无法满足自身的业务需求&#xff0c;这就需要企业定制化开发软件系统来满足自身独特的需求。而传统企业往往没有自己的软件研发队伍&#xff0c;在开发软件系统时快速新建团队风险比较高&#xff0c;可以采用外包…

Docker 网络模型:多角度分析容器网络的原理与应用

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

FPGA adrv9002 4收4发板卡,支持NVME SATA EMMC 光口 FMC

板卡采用ADI 射频直采芯片ADRV9002 &#xff0c;支持4收4发支持外部本振 跳频 同时支持4X 10G光口对外传输&#xff0c;FMC扩展 。同时支持4X NVME接口&#xff0c;可以实时流盘&#xff0c;备份一路SAT A接口&#xff0c;板卡同时预留了EMMC&#xff0c;可以PS PL选通访问&…

【Java基础教程】Java学习路线攻略导图 · 上篇 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01;得益于各位朋友的支持和关注&#xff0c;我的专栏《Java基础教程》 至今已经更新近半&…

浅谈无人机遥感图像拼接与处理方法

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…

mysal数据库的日志恢复

目录 一 物理冷备份 二 mysqldump 备份与恢复&#xff08;温备份&#xff09; 三 mgsql中的增量备份需要借助mysql日志的二进制来恢复 小结 一 物理冷备份 systemctl stop mysqld yum -y install xz 压缩备份 tar Jcvf /opt/mysql_all_$(date %F).tar.xz /usr/local/mysql/…

文件上传前前端通过魔数(magic number)去限制上传文件类型

问题 最近项目需求文件上传前判断文件类型&#xff0c;有的同学会说用文件后缀判断不就好啦。其一&#xff0c;文件后缀可以修改&#xff0c;正确性待考究&#xff1b;其二&#xff0c;有些文件并没有文件后缀。这就需要我们动动脑筋啦&#xff0c;其实我们可以根据文件的头信…

4个顶级WooCommerce商城多站点库存同步WordPress插件

经营几家网上商店是令人兴奋的。但是&#xff0c;这也是一项艰巨的工作&#xff0c;尤其是当您意识到需要同步这些商店的库存时。好消息是&#xff0c;有 WooCommerce 多站点库存同步插件和选项可以加快速度。 WooCommerce 多站点网络可让您将所有在线商店无缝地安置在一个屋檐…

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于KELM-Adaboo…

三菱q以太网简单cpu通讯

产品概述 捷米特JM-ETH-QnA是一款经济型的以太网通讯处理器&#xff0c;是为满足日益增多的工厂设备信息化需求&#xff08;设备网络监控和生产管理&#xff09;而设计&#xff0c;用于三菱Q2A/Q2AS1/Q3A/Q4A等多个QnA系列PLC的以太网数据采集&#xff0c;非常方便构建生产管理…

Mysql+ETLCloud CDC+StarRocks实时数仓同步实战

一、业务需求及其痛点 大型企业需要对各种业务系统中的销售及营销数据进行实时同步分析&#xff0c;例如库存信息、对帐信号、会员信息、广告投放信息&#xff0c;生产进度信息等等&#xff0c;这些统计分析信息可以实时同步到StarRocks中进行分析和统计&#xff0c;StarRocks…

性能测试学习阶段性总结

目录 1.前言 2.概念部分 2.1不同角度看软件性能 2.2关键词 2.3测试的方法 2.4应用领域 3.性能测试过程模型&#xff08;PTGM&#xff09; 2.1测试前期准备 2.2测试工具引入 2.3测试计划 2.4测试设计与开发 2.5测试执行和管理 2.6测试分析 总结&#xff1a; 1.前言…

干货!3个技巧让你轻松增强客户实时聊天的体验感

在当今竞争激烈的商业环境中&#xff0c;提供出色的客户服务成为企业成功的关键要素之一。尤其是在实时聊天平台上&#xff0c;为客户提供优质的体验感&#xff0c;对于建立良好的客户关系和提高销售转化率至关重要。如果你还在苦恼如何增强用户体验感&#xff0c;苦恼如何增加…

zabbix-server监控mysql数据库及httpd服务、监控apache、监控ftp

目录 一、监控mysql数据库及httpd服务 1、为server.Zabbix.com添加服务模板 2、server.zabbix.com服务端 操作 3、编辑chk_mysql.sh脚本 4、server.zabbix.com测试 二、监控apache 1、获取键值 2、服务器操作 3、zabbix监控web端导入监控模板 4、server.zabbix.com添加…

B072-项目实战-用户模块--前台登录 三方登录

目录 前台登录-账号登录前端完成左上角显示用户信息配置前置拦截器、后置拦截器和不受限资源拦截器 三方登录-微信登录概述流程图用法代码实现步骤分析:实现准备代码前端login.htmlcallback.html 后端LoginController-微信登录LoginServiceImpl-微信登录解决回调域名不能跨域绑…