STM32---DHT11温湿度传感器与BH1750FVI光照传感器(HAL库、含源码)

写在前面:本节我们学习使用两个常见的传感器模块,分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用,因为其使用简单方便,所以经常被用于STM32的项目之中。今天将使用分享给大家,希望对大家有一些帮助。

一、认识DHT11

1.1基本定义

        DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。DHT11 虽然也是采用单总线协议,但是该协议与 DS18B20 的单总线协议稍微有些不同之处。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。

常见的DHT11模块,其中左边为3引脚的,右图为4引脚,具体 的引脚说明在下文进行讲解;

1.2技术参数

电压范围

3.3V-5.5V

工作电流

0.5mA

输出单总线数字信号
测量范围

温度:0-50℃;

湿度:20-90%RH

精度

温度:±2℃;

湿度:±5%RH

分辨率

温度:1℃

湿度:1%RH

1.3引脚说明

PIN名称说明
1VDD

供电3.3-5.5V

2GND接地,电源负极
3DATA数据线,单总线
4NC空脚,悬空即可

         根据上述表格可知为什么有两种样子的模块,如果是4引脚的,则说明吧NC印出来了,如果是3引脚的则说明已经模块已经帮助浮空了。 

1.4协议与数据格式

        DHT11仅有一根数据线,所以单片机与其进行数据传输时,采用的是单总线的传输方式,单总线的详细说明可以看我之前的博客;51单片机---DS1802温度传感器(含源码,小白可入)_ds18b20负温度显示代码-CSDN博客

        虽然 DHT11 与 DS18B20 类似,都是单总线访问,但是 DHT11 的访问,相对 DS18B20 来
说简单很多。下面我们先来看看 DHT11 的数据结构。

        DHT11 数字温湿度传感器采用单总线数据格式。即单个数据引脚端口完成输入输出双向传输。其数据包由 5byte(40bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先处。DHT11 的数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数部分+8bit 校验和。其中校验和数据为前面四个字节相加。

温湿度计算方法:

湿度:byte4.byte3=45.0%RH

温度:byte2.byte1=28.0℃ 

校验:byte4+byte3+byte2+byte1=73

传输时序图:

              首先主机发送开始信号,即:拉低数据线,保持 t1(至少 18ms)时间,然后拉高数据线 t2(10~35us)时间,然后读取 DHT11 的响应,正常的话,DHT11 会拉低数据线,保持 t3(78~88us)时间,作为响应信号,然后 DHT11 拉高数据线,保持 t4(80~92us)时间后,开始输出数据。

        DHT11 输出数字‘0’和‘1’时序,一开始都是 DHT11 拉低数据线 54us,后面拉高数据
线保持的时间就不一样,数字‘0’就是 23~27us,而数字‘1’就是 68~74us

 二、认识BH1750FVI     

 2.1基本定义

        BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

2.2 技术参数

供电电压3v-5v兼容
输出方式IIC通信协议
测量范围1-65535lx
误差变动± 20%。
工作电流

>200uA

工作温度-40-80℃

2.3引脚说明

PIN引脚说明
1VCC

供电电压3-5V

2SCLIIC时钟线
3SDAIIC数据线
4ADDR设备IIC的地址线
5GND电源地

2.4协议与数据格式

2.4.1BH1750的指令

常见指令有:

断电:0000_0000

通电:0000_0001

连续H分辨模式:0001_0000//分辨率为1lx,测量时间120ms;

连续H分辨模式2:0001_0001//分辨率为0lx,测量时间120ms;

连续L分辨模式:0001_0011//分辨率为4lx,测量时间16ms; 

一次H分辨模式:0010_0000//分辨率为1lx,测量时间120ms,测量后设置为断电模式;

一次H分辨模式2:0010_0001//分辨率为0lx,测量时间120ms,测量后设置为断电模式;

一次L分辨模式:0010_0011//分辨率为4lx,测量时间16ms,测量后设置为断电模式; 

2.4.2 设备地址

        在BH1750FVI的芯片说明中,模块的从地址有两种形式,由ADDR端口决定:

即:如果ADDR=1(高电平),其从地址为1011100;

        如果ADDR=0(低电平),其从地址为0100011;

2.4.3工作过程

芯片供电--断电--通电--测量指令(设置测试模式)--进行测量

ADDR=0(低电平):

 ADDR=1(高电平):

数据格式:

         接收完两个字节还不算完成,因为这个数据还不是测量出来的光照强度值,我们还需要进行计算,计算公式是:光照强度 =(寄存器值[15:0] * 分辨率) / 1.2 (单位:勒克斯lx)

 例如:我们读出来的第1个字节是(10000011),第2个字节是(10010000),那么合并之后就是(1000 0011 1001 0000),换算为( 2^15 + 2^9 + 2^8 + 2^7 + 2^4 ) / 1.2 =28067 [ lx ],最后等于28067 lx。

三、编程教学

3.1DHT11

1、使能DHT11数据线的GPIO时钟

2、设置GPIO的工作模式

        此处采用开漏输出,并且需要进行上拉;

3、编写信号代码

        复位:拉低数据线,至少保持18ms,然后拉高10-35us;

        应答:等待DHT11拉低,保持78-88us;

        读取:0/1,DHT11 拉低数据线延时 54us,然后拉高数据线延时一定时间,主机通过判断高电平时间得到 0 或者 1。

4、编写DHT11读函数,在读1bit的基础上,读取1字节数据;

3.2BH1750

1、初始化IIC

        IIC引脚,功能模式,起始信号,停止信号,发送一个字节,接收一个字节,应答信号,非应答信号,等待应答;

2、通电

通过IIC协议发送通电指令;

3、设置工作模式

通过IIC协议发送对应工作模式指令;

4、读取数据

通过IIC协议读取接收的数据;

四、代码

链接:https://pan.baidu.com/s/1fOfkPlrrwuya5g5AXyOEjw 
提取码:1022

下面为主要的一些代码,全部文件在百度网盘中查看。

4.1 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/DHT/dht11.h"
#include "./BSP/BH1705/BH1705.h"
uint8_t t,h;
int main(void)        
{float light;HAL_Init();                              /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */delay_init(72);                          /* 延时初始化 */usart_init(115200);                      /* 串口初始化,波特率:115200 */LED_init();                              /* LED初始化 */dht11_init();                            /* dht11初始化 */init_BH1750();                           /* BH1750初始化 */while(1){   light= light_intensity();printf("光照强度:%4.2f LX\r\n", light); dht11_read_data(&t,&h);printf("温度:%d℃ 湿度:%d %\r\n",t,h);delay_ms(500);}
}

4.2 dht11.c

#include "./BSP/DHT/dht11.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
/**
* @brief dht11初始化函数
* @param  无
* @retval 返回检查的结果
*/
uint8_t dht11_init(void)
{__HAL_RCC_GPIOG_CLK_ENABLE();/* 使能时钟此次dht11数据线采用PG11引脚 */GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.Mode=GPIO_MODE_OUTPUT_OD;/* 设置为开漏模式 */gpio_init_struct.Pin=GPIO_PIN_11;/* 定义引脚 */gpio_init_struct.Pull=GPIO_PULLUP;/* 定义上拉 */gpio_init_struct.Speed=GPIO_SPEED_FREQ_HIGH ;/*高速输出 */HAL_GPIO_Init(GPIOG, &gpio_init_struct);dht11_rest();/* 复位 */return  dht11_check();    
}static void dht11_rest(void)
{dht11_write_out(0);delay_ms(20);dht11_write_out(1);delay_us(30);
}
/**
* @brief dht11检查函数
* @param  无
* @retval 返回检查的结果
*/
uint8_t dht11_check(void)
{uint8_t time=0;uint8_t backdata=0;while(dht11_read && time<100){  time++;delay_us(1); }if(time>=100){backdata=1;      }else{time=0;while(!dht11_read && time<100){time++;delay_us(1); }    if(time>=100){backdata=1;}       }return backdata;
}/**
* @brief dht11读取结果函数1bit
* @param  无
* @retval 返回读取的结果
*/
uint8_t  dht11_read_bit(void)
{uint8_t time=0;while(dht11_read && time<100){time++;delay_us(1); }time=0;while(!dht11_read && time<100) {time++;delay_us(1); }  delay_us(40);if(dht11_read) return 1;elsereturn 0;
}
/**
* @brief dht11读取结果函数1bety
* @param  无
* @retval 返回读取的结果
*/
uint8_t dht11_read_bety(void)
{uint8_t i,data=0;for(i=0;i<8;i++)/* 循环8次,读取8个bit数据 */{data<<=1;/* 先读取高位,逐渐左移 */data|=dht11_read_bit();}return data;}
/**
* @brief dht11整理读取结果函数
* @param  温度地址, 湿度地址
* @retval 无
*/
void dht11_read_data(uint8_t *temp,uint8_t *humi)
{uint8_t arr[5]={0};/* 定义5个字节数组,且初始值为0 */uint8_t i;dht11_rest();  if(dht11_check()==0)/* 判断是否与DHT11连接上 */{for(i=0;i<5;i++)/* 循环5次,读取5个字节数据 */arr[i]=dht11_read_bety();     if( arr[4]==(arr[0]+arr[3]+arr[2]+arr[1]))/* 进行5个字节数据检验 */{  *temp=arr[2];/* 温度的整数部分 */*humi=arr[0];/* 湿度的整数部分 */      }        }
}

4.3 bh1705.c

#include "./BSP/BH1705/BH1705.h"
#include "./SYSTEM/delay/delay.h"
/**
* @brief 初始化IIC
* @param无
* @retval无
*/
void iic_init()
{__HAL_RCC_GPIOB_CLK_ENABLE(); /* 使能时钟此次IIC采用PB6,PB7引脚 */GPIO_InitTypeDef gpio_init_struct; /* 定义对应结构体 *//* 设置IIC中SCL引脚 */gpio_init_struct.Mode=GPIO_MODE_OUTPUT_PP;/* 推挽输出工作模式 */gpio_init_struct.Pin=GPIO_PIN_6;/*定义引脚 */gpio_init_struct.Speed=GPIO_SPEED_FREQ_LOW;/* 输出速度 */gpio_init_struct.Pull=GPIO_PULLUP; /* 上拉模式 */HAL_GPIO_Init(GPIOB, &gpio_init_struct);gpio_init_struct.Mode=GPIO_MODE_OUTPUT_OD;/* 开漏输出工作模式 */gpio_init_struct.Pin=GPIO_PIN_7;/*定义引脚 */gpio_init_struct.Speed=GPIO_SPEED_FREQ_LOW;/* 输出速度 */HAL_GPIO_Init(GPIOB, &gpio_init_struct);}
static void iic_delay(void)
{delay_us(2);/* 2us 的延时, 读写速度在 250Khz 以内 */
}/**
* @brief IIC起始信号
* @param无
* @retval无
*/
void icc_start()
{IIC_SCL(1);/*拉高时钟线*/IIC_SDA(1);/*拉高数据线*/iic_delay();/*延时*/IIC_SDA(0);/*拉低数据线*/iic_delay();/*延时*/IIC_SCL(0);/*拉低时钟线*/iic_delay();/*延时*/
}
/**
* @brief IIC停止信号
* @param 无
* @retval 无
*/
void icc_stop()
{  IIC_SDA(0);/*拉低数据线*/iic_delay();/*延时*/IIC_SCL(1);/*拉高时钟线*/iic_delay();/*延时*/IIC_SDA(1);/*拉高数据线*/iic_delay();/*延时*/
}/**
* @brief IIC发送一个字节
* @param  发送的数据
* @retval无
*/
void iic_send_byte(uint8_t data)
{uint8_t i;for (i=0;i<8;i++)/*每次发送一位*/{IIC_SDA((data&0x80)>>7);/*高位在前*/iic_delay();IIC_SCL(1);/*产生一个时钟脉冲*/iic_delay();IIC_SCL(0);iic_delay();data<<=1;/*左移,用于下次发送*/}IIC_SDA(1);/*释放数据*/}/**
* @brief IIC接收一个字节
* @param  是否发送接收应答
* @retval 接收到的数据
*/
uint8_t icc_recive_byte(uint8_t ack)
{uint8_t i,recive;for(i=0;i<8;i++) /* 接收 1 个字节数据 */{recive<<=1; /* 高位先输出,所以先收到的数据位要左移 */IIC_SCL(1);/*产生一个时钟脉冲*/iic_delay();if(IIC_READ_SDA)/*判断数据是0还是1*/{recive++; }  IIC_SCL(0);iic_delay();      }if(ack==1){iic_ack();/* 发送应答 */}else{iic_nack();/* 发送非应答 */}return recive;/* 返回接受的数据 */}
/**
* @brief IIC等待接收应答函数
* @param  无
* @retval 接收应答情况,return0应答,return1非应答
*/
uint8_t icc_wait_ack(void)
{uint8_t wattime=0;uint8_t rack=0;IIC_SDA(1);/* 释放数据线 */iic_delay();IIC_SCL(1);/* 产生一个时钟信号 */iic_delay();while(IIC_READ_SDA)/* 等待应答 */{wattime++;if(wattime>250)/* 没有应答 */{icc_stop();rack=1;break; }}IIC_SCL(0);/* 拉低时钟线 */iic_delay();return rack;
}/**
* @brief IIC发送应答信号
* @param 无
* @retval 无
*/
void iic_ack(void)
{IIC_SDA(0);/*拉低数据线*/iic_delay();/*延时*/IIC_SCL(1);/*拉高时钟线,产生一个时钟脉冲*/iic_delay();/*延时*/IIC_SCL(0);/*拉低时钟线*/iic_delay();/*延时*/IIC_SDA(1);/*释放数据线*/iic_delay();/*延时*/}
/**
* @brief IIC发送非应答信号
* @param 无
* @retval 无
*/
void iic_nack(void)
{IIC_SDA(1);/*拉高数据线*/iic_delay();/*延时*/IIC_SCL(1);/*产生时钟信号*/iic_delay();/*延时*/IIC_SCL(0);iic_delay();/*延时*/
}/**
* @brief BH1750单总线发送函数
* @param 发送的指令
* @retval 无
*/
void single_write_BH1750(uint8_t adress)
{icc_start();//起始信号iic_send_byte(SlaverAddress);//发送设备地址+写信号while(icc_wait_ack()==1);    iic_send_byte(adress);//发送指令while(icc_wait_ack()==1);icc_stop();}
/**
* @brief BH1750读取一个字节数据
* @param 无
* @retval 接收的指令
*/
uint16_t read_data_BH1750()
{uint8_t H_data;/*定义变量-存放高字节数据*/uint8_t L_data;/*定义变量-存放低字节数据*/uint16_t data;/*定义变量-整理数据*/icc_start();iic_send_byte(SlaverAddress+1);/*发送设备地址+读信号*/H_data=icc_recive_byte(1);/*读取高字节数据,并回应答信号,能够继续接受数据*/L_data=icc_recive_byte(0);/*读取低字节数据,并回非应答信号,不再接受数据*/icc_stop();data=((uint16_t)H_data<<8)+L_data;/*整理数据*/return data;    /*返回数据*/
}/**
* @brief BH1750初始化函数
* @param 无
* @retval 无
*/
void init_BH1750(void)
{iic_init();delay_ms(100);single_write_BH1750(0x01);/*通电*/}
/**
* @brief BH1750检测数据函数
* @param 无
* @retval 返回检测的数据
*/
float light_intensity(void)
{  float i;single_write_BH1750(0x01);/*通电*/single_write_BH1750(0x10);/*设置BH1750工作模式*/delay_ms(180);/*延时180ms,给检测留够充足的时间*/i=(float)(read_data_BH1750()) / 1.2 ;/*数据进行转换*/return i;
}

五、实验现象

      

dht11+bh1750

   如果用的是最小系统或者其他开发板只要保证DHT11的数据位,已经BH1750的SDA、SCK位与代码中一致即可。

总结:本节我们学习了两个常见模块DHT11温湿度传感器与BH1750光照传感器,利用STM32进行数据采集以及利用串口显示在电脑屏幕。为后面的学习制作单片机的项目具有十分重要的参照作用。大家可以进行自己的练习。。 

创作不易,还请大家多多点赞支持!!!

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

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

相关文章

QGIS编译(跨平台编译)057:FastCGI编译(Windows、Linux、MacOS环境下编译)

文章目录 1、FastCGI介绍2、FastCGI下载3、Windows下编译4、linux下编译5、MacOS下编译1、FastCGI介绍 FCGI 是 FastCGI 的缩写,是一种用于改善 CGI(Common Gateway Interface)性能的协议。在传统的 CGI 中,每次请求都需要启动一个新的进程来处理,这导致了较高的资源消耗和…

【测试思考】设计测试用例时,你在想什么

突然想写这篇文章是因为&#xff0c;前两天看到一篇文章【像用户一样测试】 然后想起事儿 .. 想到在2020年上海爆发疫情后&#xff0c;开始频繁使用买菜软件&#xff0c;在一个深夜从某团紧急挑选加购商品&#xff0c;看到提醒自己账户还有一张满减优惠券&#xff0c;挺高兴的…

claude3国内怎么用

你是否苦恼没有渠道接触最牛的AI——Claude3&#xff0c;这个已经被媒体刷屏的彻底吊打了ChatGPT-4的地表最强AI。 最近&#xff0c;一个国内的claude3镜像站出现了&#xff0c;国内的小伙伴也可以体验了。 无论你用它写文案、做PPT、写代码、调bug、还是画图&#xff0c;都不…

【Linux】调试器-gdb的安装与使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 GDB的安装 在开始之前&#xff0c;确保已经安装了GDB。如果没有安…

Android 观察者模式

在Android中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…

HTML5和CSS3笔记

一&#xff1a;网页结构(html)&#xff1a; 1.1&#xff1a;页面结构&#xff1a; 1.2&#xff1a;标签类型&#xff1a; 1.2.1&#xff1a;块标签&#xff1a; 1.2.2&#xff1a;行内标签&#xff1a; 1.2.3&#xff1a;行内块标签&#xff1a; 1.2.4&#xff1a;块标签与行…

独孤思维:流量暴涨,却惨遭违规

最近独孤操作虚拟资料短视频&#xff0c;有个很深的感悟。 每天发10条短视频&#xff0c;积累到20天左右&#xff0c;播放量和粉丝数开始暴涨。 虽然很多牛比的比我数据好&#xff0c;但是对于刚做短视频的独孤来说&#xff0c;我已经满足了。 但是又发了10来天&#xff0c;…

如何用VSCode和Clangd与Clang-Format插件高效阅读Linux内核源码及写驱动

一、如何高效阅读Linux源码&#xff1a;基于clangd uboot/busybox等都可以用这种方式&#xff0c;理论上说所有基于Make和Cmake的源码工程都可以用这套方案 阅读Linux源码最大问题在于调用链太复杂&#xff0c;一个函数或变量引用太多&#xff0c;source insight和cscope等基于…

Pink老师Echarts教学笔记

可视化面板介绍 ​ 应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。 01-使用技术 完成该项目需…

阿里云服务器(Ubuntu22)上的MySQL8数据库下载,安装和远程连接

最近阿里云centos主机到期了改为使用Ubuntu操作系统&#xff0c;在上面安装mysql并远程连接出现了一系列问题并解决。 之前在centos系统上下载mysql8的教程如下&#xff1a; 阿里云服务器&#xff08;centos7&#xff09;上的MySQL8数据库下载&#xff0c;安装和远程连接 主机操…

rollup打包起手式

使用Rollup打包JavaScript rollup是一款小巧的javascript模块打包工具&#xff0c;更适合于库应用的构建工具;可以将小块代码编译成大块复杂的代码&#xff0c;基于ES6 modules,它可以让你的 bundle 最小化&#xff0c;有效减少文件请求大小,vue在开发的时候用的是webpack,但是…

【小沐学Python】Python实现Web图表功能(Lux)

文章目录 1、简介2、安装3、测试3.1 入门示例3.2 入门示例2 结语 1、简介 https://github.com/lux-org/lux 用于智能可视化发现的 Python API Lux 是一个 Python 库&#xff0c;通过自动化可视化和数据分析过程来促进快速简便的数据探索。通过简单地在 Jupyter 笔记本中打印出…

招聘自媒体编辑岗位的人才测评方案

人才测评工具在招聘入职的方案&#xff0c;在线工具网根据自媒体岗位的特性和需求来分析&#xff0c;并制定自媒体主编的测评方案。 自媒体作为互联网时代的产物&#xff0c;自然也为我们带来了很多的福利&#xff0c;例如&#xff1a;海量的信息、快捷的传媒方式&#xff0c;那…

百度网盘联盟申请盘主的方法

在百度网盘联盟目前有3种赚钱方式&#xff0c;第一种是自己售卡赚佣金&#xff1b;第二种是外链分享&#xff08;分销联盟&#xff09;&#xff1b;第三种是邀请好友加盟&#xff0c;好友售卡&#xff0c;自己得提成收入&#xff0c;需要申请盘主后即可开始 申请盘主&#xff1…

3个Tips,用“AI”开启新生活

相信最近&#xff0c;很多朋友们都回归到了忙碌的生活节奏中。生活模式的切换&#xff0c;或多或少会带来身体或情绪状况的起伏。新技术正在为人们生活的方方面面带来便利。3个小Tips或许能让你也从新技术中获益&#xff0c;从身到心&#xff0c;用“AI”开启新生活。 关”A…

RAPTOR:树结构的索引和检索系统的递归抽象处理

论文地址&#xff1a;https://arxiv.org/pdf/2401.18059.pdf 摘 要 增强型检索语言模型能够更好地适应世界状态的变化&#xff0c;并整合长尾知识&#xff0c;然而现有大多数方法仅能从检索语料库中检索到较短的连续文本片段&#xff0c;这限制了对整个文档上下文的整体理解。…

强化学习之父Richard Sutton:通往AGI的另一种可能

2019年&#xff0c;强化学习之父、阿尔伯塔大学教授Richard Sutton发表了后来被AI领域奉为经典的The Bitter lesson&#xff0c;这也是OpenAI研究员的必读文章。 在这篇文章中&#xff0c;Richard指出&#xff0c;过去 70 年来&#xff0c;AI 研究的一大教训是过于重视人类既有…

mysql 索引相关操

1、创建索引 第一种方式&#xff1a;在执行 CREATE TABLE 时创建索引&#xff0c;例如&#xff1a; CREATE TABLE test( id INT auto_increment PRIMARY KEY, name VARCHAR (16), last_name VARCHAR (16), id_card VARCHAR…

文件包含一-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

演示案例&#xff1a; 文件包含-原理&分类&利用&修复黑盒利用-VULWEB-有无包含文件白盒利用-CTFSHOW-伪协议玩法 #文件包含-原理&分类&利用&修复 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c…

Webman全局异常捕获处理

最近在使用webman这个框架做项目开发&#xff0c;涉及到需要统一处理异常捕获。由于官网给的并不详细&#xff0c;于是自己实现了一下全局异常处理类。 一、配置效果 例如&#xff1a;我要在项目中统一返回json 格式数据&#xff0c;并不想在业务层写try,catch逻辑。 或者在业务…