温湿传感器(学习笔记下)

接着我们温湿传感器上半部分的学习,现在我们学习接下来的部分,编写GXHTC3驱动程序,也就是给gxhtc3.c文件添加代码,我们要判断gxhtc3芯片是否存在和正常,就要先读取gxhtc3的ID号,根据gxhtc3的数据手册,读取命令为0xEFC8,发送命令后,可以读出16位的ID号和1个CRC字节。CRC字节用来校验判断读取的数据是否正确。

首先,我们需要先写一个校验代码,如下代码所示,

​
#define POLYNOMIAL  0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 00110001,POLYNOMIAL是多项式因子

//CRC校验
uint8_t gxhtc3_calc_crc(uint8_t *crcdata, uint8_t len) //两个参数分别是需要校验的数据和数据长度
{
    uint8_t crc = 0xFF; 
  
    for(uint8_t i = 0; i < len; i++)
    {
        crc ^= (crcdata[i]); //crc初始值是0xFF,crcdata与crc按位与或运算后,把计算后的值赋值给crc,crcdata中位是0的位置会变成1,位是1的位置会变成0,这条语句的作用就是把crcdata的值,1变成0,0变成1,然后赋值给crc
        for(uint8_t j = 8; j > 0; --j) //这里的for循环按位计算,如果位是0,直接左移1位,如果位是1,左移1位后再与多项式按位与或运算
        {
            if(crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
            else           crc = (crc << 1);
        }
    }
    return crc; //返回值是计算好的CRC字节(需要和读出的CRC字节做对比,一致的话正确)
}

​

接下来,我们需要写一个读取ID的代码,

​
// 读取ID
esp_err_t gxhtc3_read_id(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    esp_err_t ret; // 用于存储函数执行过程中返回的错误码
    uint8_t data[3]; //用于存储从传感器读取的3字节数据(包括ID和CRC校验值)

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址(0x70),并设置为写模式
    i2c_master_write_byte(cmd, 0xEF, true); //写入命令字节0xEF,用于选择传感器的ID读取命令
    i2c_master_write_byte(cmd, 0xC8, true); //写入命令字节0xC8,可能是用于配置或确认读取操作
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒
    if (ret != ESP_OK) { //如果执行失败(ret != ESP_OK),则跳转到 end 标签,释放资源并返回错误码
        goto end;
    }
    cmd = i2c_cmd_link_create(); //重新创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_READ, true); //写入I2C设备的地址(0x70),并设置为读模式
    i2c_master_read(cmd, data, 3, I2C_MASTER_LAST_NACK); //读取3字节数据到 data 数组中,最后一个字节读取后发送NACK信号
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒

    if(data[2]!=gxhtc3_calc_crc(data,2)){   //计算前两个字节的CRC校验值  
        ret = ESP_FAIL; //如果计算的CRC值与读取的CRC值不匹配(data[2]),则将 ret 设置为 ESP_FAIL,表示校验失败
    }
end:
    i2c_cmd_link_delete(cmd); //释放I2C命令链资源

    return ret; //表示函数执行的结
}

​

因为函数中用到了i2c的函数,所以给这个文件也添加一个i2c.h头文件。上面的函数中用到了I2C_MASTER_NUM这个宏定义,这个宏定义是在myi2c.h文件中定义的,所以也需要添加myi2c.h头文件

#include "myi2c.h"
#include "driver/i2c.h"

接下来给gxhtc3.h文件中添加读取ID函数的声明

extern esp_err_t gxhtc3_read_id(void);

这里用到了esp_err_t类型,所以也需要调用一下对应的头文件

#include "esp_err.h"

然后我们在main.c文件中调用这个函看能正确读取ID号

void app_main(void)
{
    ESP_ERROR_CHECK(i2c_master_init()); //调用 i2c_master_init() 函数初始化I2C总线,并使用 ESP_ERROR_CHECK 宏检查初始化是否成功。如果初始化失败,程序将停止并打印错误信息
    ESP_LOGI(TAG, "I2C initialized successfully"); //如果I2C初始化成功,使用 ESP_LOGI 宏打印一条信息,表示I2C总线已成功初始化

    esp_err_t ret = gxhtc3_read_id(); //调用 gxhtc3_read_id() 函数读取GXHTC3传感器的ID,并将返回值存储在 ret 变量中
    while(ret != ESP_OK) // 如果读取ID失败(ret != ESP_OK),则进入循环
    {
         ret = gxhtc3_read_id(); //再次尝试读取GXHTC3传感器的ID
         ESP_LOGI(TAG,"GXHTC3 READ ID"); //打印一条信息,表示正在尝试读取GXHTC3传感器的ID
         vTaskDelay(1000 / portTICK_PERIOD_MS); //延迟1000毫秒(1秒),然后再次尝试读取ID
    }
    ESP_LOGI(TAG,"GXHTC3 OK"); //如果成功读取GXHTC3传感器的ID(ret == ESP_OK),打印一条信息,表示读取成功
}

这里使用了vTaskDelay函数,需要在main.c文件中添加freeRTOS相关头文件

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

以上完成之后,我们就可以试着编译一下了。

还没有完,接着,我们继续学习编写读取温湿度数据程序,根据学习,我们再给gxhtc3.c文件中添加读取温湿度的相关函数。根据gxhtc3的数据手册上介绍,每一次读取数据,都需要经过四组命令,按照执行顺序,分别是唤醒、测量、读出、休眠,我们分别写这四个命令的函数,首先,我们要写一下唤醒的代码,以下是我写的

//唤醒
esp_err_t gxhtc3_wake_up(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    int ret; //用于存储函数执行过程中返回的错误码

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址(0x70),并设置为写模式 
    i2c_master_write_byte(cmd, 0x35, true); //写入命令字节0x35,用于唤醒传感器
    i2c_master_write_byte(cmd, 0x17, true); //写入命令字节0x17,可能是用于配置或确认唤醒操作
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒,执行结果存储在 ret 变量中

    i2c_cmd_link_delete(cmd); //释放I2C命令链资源
    return ret; //表示函数执行的结果
}

接着,我们在写一下测量部分的函数

// 测量
esp_err_t gxhtc3_measure(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    int ret; //用于存储函数执行过程中返回的错误码

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址(0x70),并设置为写模式
    i2c_master_write_byte(cmd, 0x7c, true); //写入命令字节0x7c,用于触发传感器进行测量
    i2c_master_write_byte(cmd, 0xa2, true); //写入命令字节0xa2,可能是用于配置或确认测量操作
    i2c_master_stop(cmd); // 发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒

    i2c_cmd_link_delete(cmd); // 释放I2C命令链资源
    return ret; //表示函数执行的结果
}

接着,我们写一下读取温湿数据部分的代码

// 读出温湿度数据
esp_err_t gxhtc3_read_tah(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    int ret; //用于存储函数执行过程中返回的错误码

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_READ, true); //写入I2C设备的地址(0x70),并设置为读模式
    i2c_master_read(cmd, tah_data, 6, I2C_MASTER_LAST_NACK); //从传感器读取6字节数据到 tah_data 数组中,最后一个字节读取后发送NACK信号
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒

    i2c_cmd_link_delete(cmd); //释放I2C命令链资源
    return ret; //表示函数执行的结果
}

以上是读出温湿度数据的函数。读到的数据字节放到tah_data这个数组里面,需要在gxhtc3.c文件的include下面定义tah_data数组。读出函数需要跟在测量函数后使用,一次读取6个字节,分别是2个温度数据+1个温度CRC字节+2个湿度数据+1个湿度CRC字节

接着,我们写休眠部分的函数

// 休眠
esp_err_t gxhtc3_sleep(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    int ret; //用于存储函数执行过程中返回的错误码

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址(0x70),并设置为写模式
    i2c_master_write_byte(cmd, 0xB0, true); //写入命令字节0xB0,用于使传感器进入休眠模式
    i2c_master_write_byte(cmd, 0x98, true); //写入命令字节0x98,可能是用于配置或确认休眠操作
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒

    i2c_cmd_link_delete(cmd); //执行结果存储在 ret 变量中
    return ret; //表示函数执行的结果
}

接下来,我们再写一个函数,把上面的4个命令函数使用上,获取温湿度

uint16_t rawValueTemp, rawValueHumi; //rawValueTemp: 用于存储从传感器读取的原始温度数据。

 // rawValueHumi: 用于存储从传感器读取的原始湿度数据
float temp=0, humi=0; 
uint8_t temp_int, humi_int;
// 获取并计算温湿度数据
esp_err_t gxhtc3_get_tah(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    int ret; //用于存储函数执行过程中返回的错误码

    gxhtc3_wake_up(); //调用 gxhtc3_wake_up() 函数唤醒传感器,使其进入工作状态
    gxhtc3_measure(); //调用 gxhtc3_measure() 函数触发传感器进行温湿度测量
    vTaskDelay(20 / portTICK_PERIOD_MS); //延迟20毫秒,等待传感器完成测量
    gxhtc3_read_tah(); //调用 gxhtc3_read_tah() 函数从传感器读取温湿度数据,并存储在 tah_data 数组中
    gxhtc3_sleep(); //调用 gxhtc3_sleep() 函数使传感器进入休眠模式,以节省功耗

    if((tah_data[2]!=gxhtc3_calc_crc(tah_data,2)|| //gxhtc3_calc_crc(tah_data, 2): 计算前两个字节的CRC校验值
(tah_data[5]!=gxhtc3_calc_crc(&tah_data[3],2)))){      //gxhtc3_calc_crc(&tah_data[3], 2): 计算后两个字节的CRC校验值
        temp = 0; //如果CRC校验失败,将温度和湿度值设为0,并将 ret 设置为 ESP_FAIL
        humi = 0;
        temp_int = 0;
        humi_int = 0;
        ret = ESP_FAIL;
    }
    else{
        rawValueTemp = (tah_data[0]<<8) | tah_data[1]; // 将前两个字节合并为一个16位整数,表示原始温度数据
        rawValueHumi = (tah_data[3]<<8) | tah_data[4]; //将后两个字节合并为一个16位整数,表示原始湿度数据
        temp = (175.0 * (float)rawValueTemp) / 65535.0 - 45.0; //将原始温度数据转换为实际温度值(单位:摄氏度)
        humi = (100.0 * (float)rawValueHumi) / 65535.0; //将原始湿度数据转换为实际湿度值(单位:百分比)
        temp_int = round(temp); //将温度值四舍五入为整数
        humi_int = round(humi);
        ret = ESP_OK;
    }
    return ret;
}

转换整形数据的时候,用到了round函数,需要添加math.h头文件

#include <math.h>

然后我们在gxhtc3.h文件中,添加gxhtc3_get_tah函数声明,因为接下来要在main.c文件中调用

extern esp_err_t gxhtc3_get_tah(void);

因为用到了esp_err_t类型,所以还需要添加esp_err.h头文件

#include "esp_err.h"

现在打开main.c文件,在app_main函数中的while循环读取ID的下面,创建一个gxhtc3_task任务

xTaskCreate(gxhtc3_task, "gxhtc3_task", 4096, NULL, 6, NULL);

然后编写这个任务函数

static void gxhtc3_task(void *args) //该函数接受一个 void * 类型的参数 args,通常用于传递任务参数
{
    esp_err_t ret; //用于存储 gxhtc3_get_tah() 函数返回的错误码

    while(1)
    {
        ret = gxhtc3_get_tah(); //调用 gxhtc3_get_tah() 函数获取温湿度数据,并将返回值存储在 ret 变量中
        if (ret!=ESP_OK) {
            ESP_LOGE(TAG,"GXHTC3 READ TAH ERROR."); //如果 gxhtc3_get_tah() 返回的错误码不是 ESP_OK,则使用 ESP_LOGE 宏打印错误信息,表示读取温湿度数据失败
        }
        else{
            ESP_LOGI(TAG, "TEMP:%.1f HUMI:%.1f", temp, humi); //如果 gxhtc3_get_tah() 返回成功(ESP_OK),则使用 ESP_LOGI 宏打印温湿度数据
            ESP_LOGI(TAG, "TEMP:%d HUMI:%d", temp_int, humi_int); //打印整数格式的温度和湿度值
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS); //调用 vTaskDelay 函数延迟1000毫秒(1秒),然后再次执行循环
    }
}

这其中用到了temp humi temp_int humi_int这几个变量,所以我们需要在函数前面声明一下来自外部文件

extern float temp,humi;
extern uint8_t temp_int,humi_int;

接下来,我们在主函数中调用这个任务函数

void app_main(void)
{
    ESP_ERROR_CHECK(i2c_master_init()); //调用 i2c_master_init() 函数初始化I2C总线,并使用 ESP_ERROR_CHECK 宏检查初始化是否成功。如果初始化失败,程序将停止并打印错误信息
    ESP_LOGI(TAG, "I2C initialized successfully"); //如果I2C初始化成功,使用 ESP_LOGI 宏打印一条信息,表示I2C总线已成功初始化

    esp_err_t ret = gxhtc3_read_id(); //调用 gxhtc3_read_id() 函数读取GXHTC3传感器的ID,并将返回值存储在 ret 变量中
    while(ret != ESP_OK) //如果读取ID失败(ret != ESP_OK),则进入循环
    {
         ret = gxhtc3_read_id(); //再次尝试读取GXHTC3传感器的ID
         ESP_LOGI(TAG,"GXHTC3 READ ID"); //打印一条信息,表示正在尝试读取GXHTC3传感器的ID
         vTaskDelay(1000 / portTICK_PERIOD_MS); //延迟1000毫秒(1秒),然后再次尝试读取ID
    }
    ESP_LOGI(TAG,"GXHTC3 OK"); // 如果成功读取GXHTC3传感器的ID(ret == ESP_OK),打印一条信息,表示读取成功

    xTaskCreate(gxhtc3_task, "gxhtc3_task", 4096, NULL, 6, NULL); // 创建并启动一个任务,用于持续读取GXHTC3传感器的温湿度数据
}

最后,我们就可以进行编译了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Junit 单元测试 | 依赖配置和编译报错解决

问题 为什么在依赖中添加了testImplement在build APK的时候还是会报错&#xff1f;是因为没有识别到test文件夹是test源代码路径吗&#xff1f; 最常见的配置有: implementation - 所有源代码集(包括test源代码集)中都有该依赖库.testImplementation - 依赖关系仅在test源代码…

前端代码分享--爱心

给对象写的&#xff0c;顺便源码给大家分享一下 就是简单的htmlcssjs&#xff0c;不复杂 xin1.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>写你自己的</title> <lin…

buildroot制作自己的软件包(可以理解为应用程序)

以helloworld为例记录使用步骤 一&#xff1a;书写自己的源程序以及Makefile helloworld.c #include <stdio.h>int main(int argc, char **argv) {printf("hello world\r\n");return 0; }Makefile all: helloworldhelloworld: helloworld.o$(CC) -o hellow…

关于嵌入式学习的一些短浅经验

一、写在前面 感谢在 10.23&#xff0c;各位大佬对我进行的模拟面试&#xff0c;我也发现了我对知识的不熟练的部分&#xff0c;比如 IPC 方法和线程同步方法的知识。模拟面试第四期-已经拿到大厂 OFFER 的研究生大佬-LINUX 卷到飞起_哔哩哔哩_bilibili 然后&#xff0c;沈阳…

OpenRTP 传输增加OpenRTPServer

开源地址 最近增加了OpenRTPServer&#xff0c; 已经修改完成一版放在了目录下&#xff0c;window和linux下编译都成功了&#xff0c;不过由于修改代码CMakefile 需要修改&#xff0c;先放放 OpenRTP开源地址 vlc得纠错传输方式 我发现我代码写错以后&#xff0c;vlc 依然能…

重要:民族共同体精品课格式说明

铸牢中华民族共同体意识精品课以微课形式呈现&#xff0c;包括微课 视频、教学设计讲义、课件等。 微课视频 微课视频应采用“教师讲解多媒体大屏”的形式&#xff0c;适当呈现授课教师画面&#xff0c;增强教学的交互性和画面的可视性。单个微课视频时长&#xff1a;高校专题…

【已解决】cannot import name ‘Literal‘ from ‘typing‘

问题描述 在用vscode进行debug的时候&#xff0c;报错cannot import name Literal from typing 解决方法 方法一&#xff1a;升级Python版本到3.8以上 我的python版本是3.7&#xff0c;但由于环境都配好了&#xff0c;升级太麻烦&#xff0c;没采用该方法 方法二&#xff1…

C++和Java该如何进行选择?

曾经的自己与许多C程序员都有着一样的盲目自信&#xff1a;认为掌握了C&#xff0c;在去学习Java上手会容易很多。 到底是谁给了你这种勇气和自信&#xff1f; 很多人经常会说&#xff0c;Java这种通过虚拟机运行的语言&#xff0c;虚拟机本身就是C开发的&#xff0c;根本就没…

Java 多线程(九)—— JUC 常见组件 与 线程安全的集合类

Callable 与 FutureTask Callable 接口和 Runnable 接口是并列关系&#xff0c;都是用来给线程提供任务的&#xff0c;只不过 Callable 接口的任务可以带有返回值。 但是 Callable 接口创建的任务不能直接传入 Thread 里面&#xff0c;这也是为了 解耦合&#xff0c;我们可以使…

pdf合并,这4款好用软件分分钟解决问题!

PDF作为一种跨平台、不易被篡改的文档格式&#xff0c;广泛应用于工作、学习和日常生活中。然而&#xff0c;当面对多个PDF文件需要合并成一个时&#xff0c;繁琐的手动操作往往让人头疼不已。别担心&#xff0c;今天就给大家安利4款超实用的PDF合并软件&#xff0c;它们不仅操…

c++二级指针

如果要通过函数改变一个指针的值&#xff0c;要往函数中传入指针的指针 如果要通过函数改变一个变量的值&#xff0c;那就要往函数中传入这个变量的地址 改变a的值和b的值 #include <iostream>using namespace std;void swap(int* a, int* b) {int temp *a;*a *b;*b …

pyvideotrans 最佳AI翻译软件

文章目录 体验视频翻译配音工具主要用途和功能预打包版本(仅win10/win11可用&#xff0c;MacOS/Linux系统使用源码部署)MacOS源码部署Linux 源码部署Window10/11 源码部署源码部署问题说明使用教程和文档语音识别模型:视频教程(第三方)软件预览截图相关联项目致谢 体验 不错&a…

根据Redis漏洞通知的整改修复过程

一、收到通知&#xff1a; 二、查看本校“宝山商城&#xff08;教学&#xff09;”已安装的Redis版本号 对照影响范围的版本号&#xff0c;在其内&#xff0c;所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中&#xff0c;如果我们需要升级Redis版本&…

C++,STL 048(24.10.25)

内容 set容器对内置数据类型、自定义数据类型指定排序规则。 运行代码 &#xff08;1&#xff09;内置数据类型 #include <iostream> #include <set>using namespace std;// set容器默认排序规则为升序&#xff08;从小到大&#xff09;&#xff0c;可以通过仿函…

若依框架篇-若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)、EasyExcel 框架(实现 Excel 数据批量导入功能)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 实现使用 Excel 文件批量导入 1.1 导入功能的前端具体实现 1.2 导入功能的后端具体实现 1.3 使用 EasyExcel 框架实现 Excel 读、写功能 1.4 将 Easy Excel 集成到…

基于SSM+微信小程序考试的管理系统(考试1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序考试的管理系统实现了管理员及用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;考试资料管理&#xff0c;用户交流管理&#xff0c;试卷管理&#xff…

新能源汽车充电设施在储充电站的应用

0引言 全球能源和环境问题促使新能源汽车受到关注&#xff0c;但其推广受充电设施和能源供应限制。光伏站、储能站和电动汽车充放电站作为可再生能源利用和储存方式&#xff0c;具有巨大潜力。本研究旨在探索新能源汽车充电设施与这些站点的融合模式&#xff0c;以支持新能源汽…

【ROS GitHub使用】

提示&#xff1a;环境配置为Ubuntu20.04&ROS Noetic 文章目录 前言一、创建工作空间目录二、尝试从GitHub上下载一个源码包&#xff0c;对它进行编译&#xff0c;运行这个源码包1.打开script文件夹&#xff0c;右键文件夹空白区域&#xff0c;选择在中端中打开&#xff1b;…

OceanBase 安全体系解析之身份鉴别

本文作者&#xff1a;金长龙爱可生测试工程师&#xff0c;负责 DMP 产品的测试工作。 本文以MySQL为参照&#xff0c;详细阐述了OceanBase 在MySQL模式下的安全体系中&#xff0c;身份鉴别的能力&#xff0c;涵盖了身份鉴别机制、用户名的构成规则、密码的复杂度&#xff0c;以…

ctfshow(66->70)--RCE/命令执行漏洞--禁用命令执行函数

Web66 源代码&#xff1a; if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }代码审计&#xff1a; POST传参c&#xff0c;eval进行代码执行。 思路&#xff1a; 由于题目过滤了命令执行函数&#xff0c;所以使用其他方法进行RCE。 先使用c…