智慧牧场数据 7

1 体征数据采集

需求:获取奶牛记步信息

 

三轴加速度测量:加速度测量计反应的加速向量与当前的受力方向是相反,单位为g 

陀螺仪,是用来测量角速度的,单位为度每秒(deg/s) 2000deg/s 相当于1秒钟多少转 

1.1 原理图

IIC的地址最后一1位 

一键还原原理图d1、d2连接在核心板底座的con1和con2

同时,这两个引脚pb7、8可以直接使用IIC

1.2 驱动流程

陀螺仪测量范围是+-2000,加速度测量范围是+-2G,读取初始值是为了便于校准。每次读取到xyz要减去这个值

获取两个字节数据 

 

1.3 修改cubmx工程

I2C使能 pb7和pb8引脚配置

IIC标准工程 

 

 建立sensor文件夹,用于放置传感器相关文件

查看芯片手册

采样频率参考MPU-6050寄存器映射 

1.4 修改工程代码

使用i2c的阅读函数HAL_I2C_Mem_Read()、write

#include "mpu6050.h"#include "string.h"
#include "stdio.h"#include "i2c.h"
int16_t Accx,Accy,Accz;//**********************************//
//函数名称:  InitMpu6050 
//函数描述:   初始化MPU6050
//函数参数:   无
//返回值:     无
//*******************************//void InitMpu6050(void)
{uint8_t WriteCmd = 0;//解除休眠状态WriteCmd = 0x00;HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, PWR_MGMT_1, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);//时钟速率0x06(1Khz)陀螺仪采样率0x07(125Hz)WriteCmd = 0x07;HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, SMPLRT_DIV, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);      WriteCmd = 0x06;HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);//不自检,2000deg/sWriteCmd = 0x18;HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, GYRO_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);//(不自检,2G,5Hz)WriteCmd = 0x01;HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, ACCEL_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);HAL_Delay(10);mpu6050_verify(&Accx, &Accy, &Accz); //读取第一次的值}//**********************************//
//函数名称:   mpu6050_verify
//函数描述:   MPU6050校验
//函数参数:   int16_t *x, int16_t *y, int16_t *z
//返回值:     无
//*******************************//void  mpu6050_verify(int16_t *x, int16_t *y, int16_t *z)
{uint8_t ReadBuffer[10] = {0};HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  *x = (ReadBuffer[1]<<8)+ReadBuffer[0] ;HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  *y = (ReadBuffer[1]<<8)+ReadBuffer[0] ;HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  *z = (ReadBuffer[1]<<8)+ReadBuffer[0] ;}//**********************************//
//函数名称:   mpu6050_ReadData
//函数描述:   MPU6060获取三轴数据
//函数参数:   int16_t *x, int16_t *y, int16_t *z
//返回值:     无
//*******************************//void  mpu6050_ReadData(float *Mx, float *My, float *Mz)
{int16_t x,y,z;uint8_t ReadBuffer[10] = {0};HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  x = (ReadBuffer[1]<<8)+ReadBuffer[0] ;x -= Accx;*Mx = ((float)x)/16384;HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  y = (ReadBuffer[1]<<8)+ReadBuffer[0] ;y -= Accy;*My = ((float)y)/16384;HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  z = (ReadBuffer[1]<<8)+ReadBuffer[0] ;z -= Accz;*Mz = ((float)z)/16384;}

三轴数据读取,减去初始值校准 

主程序中定义全局变量的xyz坐标

初始化I2C
初始化mpu6050 

 

while(1)之前又写了一个while(1) 

 

2 饲养环境采集

lora中集成温湿度传感器 

 

2.1 原理图 

D2连接到核心板con2  

D2就是pb8

 2.2 驱动分析 

 

获取数据。
如果继续拉高就是70us说明时1,否则是0.
读取5个字节,获取稳定数据、湿度数据和校验码 

2.3 修改工程代码

dh11.c

#include "stdint.h"
#include "tim.h"
#include "gpio.h"
#include "dht11.h"
#include "delay.h"//温湿度定义uint8_t ucharT_data_H=0,ucharT_data_L=0,ucharRH_data_H=0,ucharRH_data_L=0,ucharcheckdata=0;void DHT11_TEST(void)   //温湿传感启动
{uint8_t ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_humidity,ucharRH_data_L_humidity,ucharcheckdata_temp;uint8_t ucharFLAG = 0,uchartemp=0;uint8_t ucharcomdata;uint8_t i;  {D2_OUT_GPIO_Init();                                  //根据时序图配置为输出模式,拉低等待18毫秒HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);HAL_Delay_ms(18);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);    //拉高,配置为输入模式,等待40usD2_IN_GPIO_Init();HAL_Delay_10us(4);         }if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))              //如果响应信号是低电平 ,是否应答____{ucharFLAG=2;                                                //无符号char型,超时保护,最多255,再+到0,如果=1设置为超时判断while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);  //__--80us等待拉高ucharFLAG=2;while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);     //--__80us等待拉低for(i=0;i<8;i++)                                             //读取数据{ucharFLAG=2; while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);     //判断是否拉高HAL_Delay_10us(3);                                             //如果拉高延时30us等待磐石是否拉低uchartemp=0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;          //如果还是高,代表1,否则代表0ucharFLAG=2;while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);       //判断是否拉低,或者超时if(ucharFLAG==1)break;                                        //无符号char型,超时保护,最多255,再+到0,如果=1设置为超时判断ucharcomdata<<=1;                                             //左移1位ucharcomdata|=uchartemp; }ucharRH_data_H_humidity = ucharcomdata;                      //赋值给湿度高8位for(i=0;i<8;i++)    {ucharFLAG=2; while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);HAL_Delay_10us(3);uchartemp=0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;ucharFLAG=2;while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);   if(ucharFLAG==1)break;    ucharcomdata<<=1;ucharcomdata|=uchartemp; }ucharRH_data_L_humidity = ucharcomdata;                     //赋值给湿度低8位for(i=0;i<8;i++)    {ucharFLAG=2; while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);HAL_Delay_10us(3);uchartemp=0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;ucharFLAG=2;while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   if(ucharFLAG==1)break;    ucharcomdata<<=1;ucharcomdata|=uchartemp; }ucharT_data_H_temp      = ucharcomdata;                   //赋值给温度高8位for(i=0;i<8;i++)    {ucharFLAG=2; while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);HAL_Delay_10us(3);uchartemp=0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;ucharFLAG=2;while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   if(ucharFLAG==1)break;    ucharcomdata<<=1;ucharcomdata|=uchartemp; }ucharT_data_L_temp      = ucharcomdata;                 //赋值给温度低8位for(i=0;i<8;i++)    {ucharFLAG=2; while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);HAL_Delay_10us(3);uchartemp=0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;ucharFLAG=2;while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   if(ucharFLAG==1)break;    ucharcomdata<<=1;ucharcomdata|=uchartemp; }ucharcheckdata_temp     = ucharcomdata;                            //读取校验和
//            humiture=1; uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_humidity+ucharRH_data_L_humidity);if(uchartemp==ucharcheckdata_temp)                    //判断校验和是否和读取的数据相同{          ucharT_data_H  = ucharT_data_H_temp;          //进去赋值ucharT_data_L  = ucharT_data_L_temp;ucharRH_data_H = ucharRH_data_H_humidity;ucharRH_data_L = ucharRH_data_L_humidity;ucharcheckdata = ucharcheckdata_temp;                    } } else //没用成功读取,返回0                              {ucharT_data_H  = 0;ucharT_data_L  = 0;ucharRH_data_H = 0;ucharRH_data_L = 0; } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);          //重新调用systick的config,因为用到的延时毫秒和微妙都是systick,用完后要恢复}

delay.c

#include "stm32f0xx_hal.h"
#include "delay.h"/*** @}*/
void HAL_Delay_10us(__IO uint32_t Delay)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);uint32_t temp;uint8_t fac_us=60;	        SysTick->LOAD=Delay*fac_us; //时间加载	  		 SysTick->VAL=0x00;        //清空计数器SysTick->CTRL=0x01 ;      //开始倒数 	 do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   SysTick->CTRL=0x00;       //关闭计数器SysTick->VAL =0X00;       //清空计数器	
}
/*** @}*/
void HAL_Delay_ms(__IO uint32_t Delay)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);uint32_t temp;uint16_t fac_ms=6000;	        SysTick->LOAD=Delay*fac_ms; //时间加载	  		 SysTick->VAL=0x00;        //清空计数器SysTick->CTRL=0x01 ;      //开始倒数 	 do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   SysTick->CTRL=0x00;       //关闭计数器SysTick->VAL =0X00;       //清空计数器	
}
/*** @}*/
void HAL_Delay_us(__IO uint32_t Delay)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);uint32_t temp;uint8_t fac_us=6;	        SysTick->LOAD=Delay*fac_us; //时间加载	  		 SysTick->VAL=0x00;        //清空计数器SysTick->CTRL=0x01 ;      //开始倒数 	 do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   SysTick->CTRL=0x00;       //关闭计数器SysTick->VAL =0X00;       //清空计数器	
}

 

 

 

3 饲养环境控制

通过5v  二次回路AC驱动380风扇。试验里面采用了5v微型风扇 

3.1 修改工程代码

gpio D1初始化

 

#include "gpio.h"
#include "fan.h"
#include <stdbool.h>static uint8_t FanStaus = false;//**********************************//
//函数名称:   FanOn
//函数描述:   开启风扇
//函数参数:   无
//返回值:     无
//*******************************//void FanOn(void)
{HAL_GPIO_WritePin( FAN_GPIO_PORT, FAN_PIN, FAN_ON );FanStaus = true;
}//**********************************//
//函数名称:   FanOff
//函数描述:   关闭风扇
//函数参数:   无
//返回值:     无
//*******************************//void FanOff(void)
{HAL_GPIO_WritePin( FAN_GPIO_PORT, FAN_PIN, FAN_OFF ); FanStaus = false;
}//**********************************//
//函数名称:   FanReadStaus
//函数描述:   读取风扇状态
//函数参数:   无
//返回值:     无
//*******************************//uint8_t FanReadStaus( void )
{return FanStaus;
}

 主程序

 

SLCD_SHOW 

 

4 项目集成开发

定时采集上传数据

修改RTC文件

因为IIC,重新使用了cubmx,把IIC初始化更改了,要重新恢复
修改数据处理任务
       传感器定时上传函数

把之前rtc文件复制过来 

 

上传节点传感器函数,可以通过main函数查找,因为开发了3个设备的传感器,要进行区分。之前放在main函数的while1中
根据协议文件,修改数据包 

修改上传代码

//**********************************//
//函数名称:   SendSensorDataUP
//函数描述:   上传节点传感器数据
//函数参数:   无
//返回值:     无
//*******************************//void SendSensorDataUP(void)
{printf("SendSensorDataUP\n");//传感器类型6050
#if defined(MPU6050)mpu6050_ReadData(&Mx,&My,&Mz);printf("Mx = %.3f\n",Mx);printf("My = %3f\n",My);printf("Mz = %3f\n",Mz);DataPacke_t.netmsgHead = 'N';DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);DataPacke_t.msgHead = 0x21;DataPacke_t.dataLength = 0x08;    //不含包头DataPacke_t.dataType = 0x00;DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);DataPacke_t.sensorType  = 0x3;DataPacke_t.buff[0]  = int8_t(Mx*10)   //-127 128DataPacke_t.buff[1]  = int8_t(My*10)DataPacke_t.buff[2]  = int8_t(Mz*10)//校验码DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);//发送数据包Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);//传感器类型dht11
#if defined(DHT11)DHT11_TEST();printf("TEMP = %d\n",ucharT_data_H);printf("HUM = %d\n",ucharRH_data_H);DataPacke_t.netmsgHead = 'N';DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);DataPacke_t.msgHead = 0x21;DataPacke_t.dataLength = 0x07;    //不含包头DataPacke_t.dataType = 0x00;DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);DataPacke_t.sensorType  = 0x1;DataPacke_t.buff[0]  = int8_t(ucharT_data_H)   //-127 128DataPacke_t.buff[1]  = int8_t(ucharRH_data_H)//校验码DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);//发送数据包Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);//传感器类型FAN
#if defined(FAN)FanStaus = FanReadStaus();DataPacke_t.netmsgHead = 'N';DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);DataPacke_t.msgHead = 0x21;DataPacke_t.dataLength = 0x06;    //不含包头DataPacke_t.dataType = 0x01;DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);DataPacke_t.sensorType  = 0x3;DataPacke_t.buff[0]  = int8_t(FanStaus)   //校验码DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);//发送数据包Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);#endif   }

 修改解析代码

//**********************************//
//
//函数名称:   SlaveProtocolAnalysis
//
//函数描述:   从机协议解析
//
//函数参数:   uint8_t *buff,uint8_t len
//
//返回值:     uint8_t
//
//*******************************//uint8_t SlaveProtocolAnalysis(uint8_t *buff,uint8_t len)
{uint8_t Crc8Data;printf("SlaveProtocolAnalysis\n");for (int i = 0; i < len; i++){printf("0x%x  ",buff[i]);}printf("\n");if (buff[0] == NETDATA){if (buff[1] == HI_UINT16(PAN_ID) && buff[2] == LO_UINT16(PAN_ID)){Crc8Data = crc8(&buff[0], len - 1);if (Crc8Data != buff[len - 1]){memset(buff, 0, len);return 0;}if (buff[3] == 0x21){printf("Slave_NETDATA\n");if( buff[5] == 0x01){if(buff[6] == HI_UINT16(ADDR) && buff[7] == LO_UINT16(ADDR)){if(buff[8] == 0x03){
#if defined(FAN)if(buff[9] == true){FanON();}else{FanOff();}
#endif  }}}}return 0;}}else if((buff[0] == 0x3C) && (buff[2] == 'A')){if (DataCrcVerify(buff, len) == 0){return 0;}if (buff[3] == HI_UINT16(PAN_ID) && buff[4] == LO_UINT16(PAN_ID)){if (buff[5] == jionPacke_t.deviceAddr[0] && buff[6] == jionPacke_t.deviceAddr[1]){slaveNativeInfo_t.deviceId = buff[7];printf("Slave_ACK\n");return 0xFF;}}}else if((buff[0] == 0x3C) && (buff[2] == 'T')){if (DataCrcVerify(buff, len) == 0){return 0;}if (buff[3] == HI_UINT16(PAN_ID) && buff[4] == LO_UINT16(PAN_ID)){uint32_t alarmTime = 0;startUpTimeHours = buff[5];startUpTimeMinute = buff[6];startUpTimeSeconds = buff[7];startUpTimeSubSeconds = buff[8] <<8 | buff[9];printf("Slave_CLOCK\n");printf("H:%d,M:%d,S:%d,SUB:%d\n", startUpTimeHours, startUpTimeMinute, startUpTimeSeconds, startUpTimeSubSeconds);alarmTime = ((DataUpTimeHours * 60 + DataUpTimeMinute) * 60 + DataUpTimeSeconds) * 1000 + (DataUpTimeSubSeconds / 2) + DataUpTime;GetTimeHMS(alarmTime, &DataUpTimeHours, &DataUpTimeMinute, &DataUpTimeSeconds, &DataUpTimeSubSeconds);printf("DataUpTime->H:%d,M:%d,S:%d,SUB:%d\n", DataUpTimeHours, DataUpTimeMinute, DataUpTimeSeconds, DataUpTimeSubSeconds);//使能RTCMX_RTC_Init();return 0xFF;}}return 1;
}

CRC借用工具

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果终止电车项目后大裁员,押注家用机器人,这会是Next Big Thing吗?

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 新的出路&#xff0c;苹果能让我们耳目一新吗&#xff1f; 苹果公司压力山大&#xff0c;何以…

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统&#xff08;https://github.com/netcccyun/dnsmgr&#xff09;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Day:004(1) | Python爬虫:高效数据抓取的编程技术(数据解析)

数据解析-正则表达式 在前面我们已经搞定了怎样获取页面的内容&#xff0c;不过还差一步&#xff0c;这么多杂乱的代码夹杂文字我们怎样 把它提取出来整理呢&#xff1f;下面就开始介绍一个十分强大的工具&#xff0c;正则表达式&#xff01; 正则表达式是对字符串操作的一种…

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

不同设备使用同一个Git账号

想要在公司和家里的电脑上用同一个git账号来pull, push代码 1. 查看原设备的用户名和邮箱 第1种方法&#xff0c; 依次输入 git config user.name git config user.email第2种方法&#xff0c; 输入 cat ~/.gitconfig2. 配置新设备的用户名和邮箱 用户名和邮箱与原设备保持…

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全&#xff0c;如下所示&#xff1a; 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示&#xff1a; 这里只演示Vue3版本代码&#xff0c;Vue2版本不再演示 区别就在插槽使用上Vue3使用&#xff1a;#default“”&#xff1b;Vu…

网络安全教学

如今&#xff0c;组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故&#xff0c;以及来自黑客或竞争对手攻击等防御和恢复能力。而后者包…

clickhouse MPPDB数据库--新特性使用示例

clickhouse 新特性&#xff1a; 从clickhouse 22.3至最新的版本24.3.2.23&#xff0c;clickhouse在快速发展中&#xff0c;每个版本都增加了一些新的特性&#xff0c;在数据写入、查询方面都有性能加速。 本文根据clickhouse blog中的clickhouse release blog中&#xff0c;学…

C++数据结构与算法——二叉树的修改与构造

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Redis Desktop Manager可视化工具

可视化工具 Redis https://www.alipan.com/s/uHSbg14XmsL 提取码: 38cl 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 官网下载&#xff08;不推荐&#xff09;&#xff1a;http…

SALESFORCE MODEL 简单记录

SALESFORCE MODEL 简单记录&#xff0c;在以下地址可以看到一些salesforce的模型资料 https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htmhttps://architect.salesforce.com/diagrams#framework

2024054期传足14场胜负前瞻

2024054期售止时间为4月7日&#xff08;周日&#xff09;20点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率6场&#xff0c;其他场次是平半盘、平盘。本期14场难度中等。以下为基础盘前瞻&#xff0c;大家可根据自身判断…

Spring Cloud介绍

一、SpringCloud总体概述 Cloud Foundry Service Broker&#xff1a;通用service集成进入Cloud Foundry Cluster&#xff1a;服务集群 Consul&#xff1a;注册中心 Security&#xff1a;安全认证 Stream&#xff1a;消息队列 Stream App Starters&#xff1a;Spring Cloud Stre…

记第一次eudsrc拿到RCE(下)

目录 前言 个人介绍 挖洞公式 漏洞介绍 信息泄露漏洞 任意文件读取漏洞 远程命令执行&#xff08;RCE&#xff09;漏洞 漏洞详情 漏洞点1 漏洞点2 漏洞点3 修复建议 总结 前言 免责声明 以下漏洞均已经上报漏洞平台。请勿利用文章内的相关技术从事非法测试。若因…

基于python爬虫与数据分析系统设计

**单片机设计介绍&#xff0c;基于python爬虫与数据分析系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于Python爬虫与数据分析系统的设计是一个结合了网络数据抓取、清洗、存储和数据分析的综合项目。这样的系统通常…

【javaWeb Maven高级】Maven高级学习

Maven高级学习 分模块设计继承与聚合继承版本锁定聚合 私服资源的上传与下载本地私服配置 分模块设计 为什么需要进行分模块设计&#xff1f; 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护&#xff0c;扩展&#xff0c;也方便模块间的相互调用&#xff0c…

vue 打包 插槽 inject reactive draggable 动画 foreach pinia状态管理

在Vue项目中&#xff0c;当涉及到打包、插槽&#xff08;Slots&#xff09;、inject/reactive、draggable、transition、foreach以及pinia时&#xff0c;这些都是Vue框架的不同特性和库&#xff0c;它们各自在Vue应用中有不同的用途。下面我将逐一解释这些概念&#xff0c;并说…

vue2项目安装(使用vue-cli脚手架)

使用npm安装 安装镜像&#xff08;使npm创建项目更快&#xff09;&#xff1a;镜像可更换 npm config set registry https://registry.npmmirror.com1.全局安装vue-cli&#xff08;一次&#xff09; npm install -g vue/cli 2. 查看vue-cli 版本 vue --version 3. 创建项目…

HTTP详解及代码实现

HTTP详解及代码实现 HTTP超文本传输协议 URL简述状态码常见的状态码 请求方法请求报文响应报文HTTP常见的HeaderHTTP服务器代码 HTTP HTTP的也称为超文本传输协议。解释HTTP我们可以将其分为三个部分来解释&#xff1a;超文本&#xff0c;传输&#xff0c;协议。 超文本 加粗样…