语音播报加入预警系统

news2024/11/15 23:47:49

语音播报加入预警系统

引言

引入语音警报

我们前一章, 已经把jq8900-16p模块, 单独进行了测试, 可以通过发送命令, 让模块播报设定好的声音。那么语音播报, 在预警系统中, 也必不可少, 我们现在有了led灯光警报,如果主人在睡觉, 是不能及时的进行得知的. 所以语音播报, 可以从声音层面进行预警,提高家居安全性

先调试单独解耦(点击跳转)
本博客调试完成的工程:
https://wwyz.lanzoul.com/ijIUb27fhu2j
点击下载

讲解方式和目的

其实单独解耦, 就说明, 我们可以调用底层命令, 然后进行语音播报就可以了。那也意味着我们可以忽略语音播报的底层, 专注在预警系统中, 特定的时间, 去调用播报语音就行了。

所以我们这里注重讲解, 如何对预警系统中, 所需语音进行配置分析, 以及在什么时候去报警, 报警情况的分析。

报警情况分析

(1)分析预警情况

通过分析ararm_monitor 函数,得知, 我们分成了四种情况

① //(1)温度正常, 湿度异常 result = 1;

② //(2)温度异常,湿度正常 result = 2;

③ //(3)温度,湿度都异常 result = 3;

④ //(4)温度,湿度都正常 result = 0;

(2)分析报警语音

①温度正常, 湿度异常 result = 1:

湿度异常,开启电机除湿,蓝灯警报

② 温度异常,湿度正常 result = 2:

温度异常,开启电机降温,红灯警报

③ 温度,湿度都异常 result = 3:

温湿度均异常, 开启电机降温除湿,红蓝灯警报

④ 环境正常的情况下(result == 0):

环境恢复正常,警报解除

(3)调用语音

预警系统调用语音
回去(ctrl 加鼠标左键,快速跳转)

我们分别对这四种情况, 在预警处理的函数里面, 进行对应的播报

alarm_voice_Set(status_normal);	//环境正常
alarm_voice_Set(humidity_high);//只有湿度异常
alarm_voice_Set(temperature_high);//只有温度异常
alarm_voice_Set(both_high);//温湿度都异常

函数内调用语音播报

image-20240814115130317

void ararm_deal(int alarm_mode)
{
    switch(alarm_mode)
    {
        case 0: 
				humi_led_Set(blue_led_OFF);
				temp_led_Set(red_led_OFF);
				Fun_Set(FUN_OFF);
				alarm_voice_Set(status_normal);
				break;
        case 1: 
				humi_led_Set(blue_led_ON);
				temp_led_Set(red_led_OFF);
				Fun_Set(FUN_ON);
				alarm_voice_Set(humidity_high);
				break;
        case 2: 
				temp_led_Set(red_led_ON);
				humi_led_Set(blue_led_OFF);
				Fun_Set(FUN_ON);
				alarm_voice_Set(temperature_high);
				break;            
        case 3: 
				humi_led_Set(blue_led_ON);
				temp_led_Set(red_led_ON);
				Fun_Set(FUN_ON);
				alarm_voice_Set(both_high);
				break;            
        default: break;    
    }       
} 

(4)调用语音, 底层思考

结合我们led灯调用和fun调用, 我们为了保证实时性,其实是在一直刷新然后调用器件控制函数的. 如果我们直截了当的, 直接调用器件底层, 发送播放命令, 就会一直重复启动。

我们之前的处理办法都是, 先判断一下器件的状态,如何和我们所需设置的状态是一致的, 那么我们就无需操作了。不仅保证了实时性,也可以不用重复启动了。

只是我们不同的是, led灯何fun只有两种状态, 开或者关, 我们语音播报, 有4种状态, 之前我们都是用布尔状态, 来表示开关,这次, 我们要拓展语音播报的状态了。

预警系统状态结构体
回去
我们直接来看代码

image-20240814092225943

typedef enum {

	status_normal = 0,   	// 温度和湿度恢复正常 0 
	humidity_high = 1, 		// 湿度异常     	1
	temperature_high = 2,	// 温度异常   	2
	both_high = 3			// 都异常 		3

}VoiceStatus;

typedef struct {
    VoiceStatus voice_status;
} AlarmVoiceInfo;

利用枚举 , 我们的状态不仅可以确定, 还可以直接传入, 避免错乱, 增强了可读性. 对于枚举不熟悉的小伙伴, 请看洋桃电子的枚举视频

秒懂C语言枚举–单片机编程开发中枚举变量的定义和使用–洋桃电子大百科P003_哔哩哔哩_bilibili

(5)传入预警状态, 调用底层语音播报

设置语音播报状态
回去(ctrl 加鼠标左键,快速跳转)

我们在预警的时候, 调用了 void alarm_voice_Set(int status);

我们还是那句话, 先判断所需状态, 是否和当前状态一致, 意思就是,我们要播放的语音, 是否刚才已经赋值播放了。

再直白的说,每一次时间段, 都是上面的四种情况, 我们是在每分每秒的检测, 然后调用语音播报的,如果直接发送指令, 就会重复陷入启动器件的循环之中, 但是我们每分每秒检测是为了保证实时性, 所以是不可缺少了, 那么我们就要从为了避免重复启动入手, 也就是我们不能直接反复调用发送指令, 其实我们每个预警情况的时间段, 只需要调用一次语音就行了。

所以当我们切换状态的时候, 再播放就可以了, 所以当传入的状态和之前播报的状态不一致的时候, 再进行播报所需状态就可以了, 同时, 我们记得把对应的状态更新。

image-20240814114411092

对应的语音设置函数代码:

void alarm_voice_Set(int status)
{
	//当切换状态的时候, 播放
	if(status != alarmInfo.voice_status)
	{
		switch(status)
		{
			case 0: 	//环境恢复正常,警报解除
				SendData(0x0a);
				SendData(0x01);
				SendData(0x0b);
				alarmInfo.voice_status = status_normal;
				break;
			case 1: 	//湿度异常,开启电机除湿,蓝灯警报
				SendData(0x0a);
				SendData(0x02);
				SendData(0x0b);				
				alarmInfo.voice_status = humidity_high;
				break;
			case 2: //温度异常,开启电机降温,红灯警报
				SendData(0x0a);
				SendData(0x03);
				SendData(0x0b);				
				alarmInfo.voice_status = temperature_high;
				break;
			case 3: 
				SendData(0x0a);	  //温湿度均异常, 开启电机降温除湿,红蓝灯警报
				SendData(0x04);
				SendData(0x0b);				
				alarmInfo.voice_status = both_high;
				break;
			default: break;
		}	
	}
}	

工程代码实操

在原有工程上加入jq8900文件, 以及在预警处理地方调用播放语音播报

jq8900单独解耦工程:

https://wwyz.lanzoul.com/iHJhs27d9a2j

预警系统工程:

https://wwyz.lanzoul.com/ieFtH277kble

(1)首先分别打开这两个工程, 然后直接开启复制黏贴

image-20240814171927318

(2)把jq8900-16p的 Source_code里面的jq8900文件夹, 复制进入预警系统里面

image-20240814172042089

(3)然后我们接着把这个文件夹里面的代码,再加入工程

image-20240814172214064

(4)把文件夹加入环境变量

image-20240814172430021

(5)接着我们开始构建预警系统的语音播报

右键jq8900文件夹, 然后添加 alarm_voice.c 和 alarm_voice.h文件

image-20240814172846202

(6)然后我们开始逐步构建语音播报预警文件

其实也很简单, 就是模仿 led和fun的状态设置, 只不过这次我们状态不止两种, 而是四种, 所以我们状态设置, 使用的枚举结构体

预警系统状态结构体(ctrl 加鼠标左键,快速跳转)

回来了

<1>结构体配置

alarm_voice.h结构体代码

typedef enum {

	status_normal = 0,   	// 温度和湿度恢复正常 0 
	humidity_high = 1, 		// 湿度异常     	1
	temperature_high = 2,	// 温度异常   	2
	both_high = 3			// 都异常 		3

}VoiceStatus;

typedef struct {
    VoiceStatus voice_status;
} AlarmVoiceInfo;

<2>初始化

我们配置一下初始化, 因为毕竟是利用jq8900的底层, 在alarm_vice.c里面包含一下JQ8900.h, 然后调用一下jq8900的初始化函数, 同时也可以设置一下音量, 同时我们设置一下默认情况, 一般是正常情况(这里我们要考虑一下初始的阈值,保证器件稳定后, 能正常运行即可)

image-20240814173735207

注意这里调用的是枚举里面的变量, 所以可以直接使用, 为了保证可读性和安全性

#include "alarm_voice.h"
#include "JQ8900.h"

AlarmVoiceInfo alarmInfo;

void alarm_voice_Init(void)
{
	Init_One_line_Uart();
	//设置音量
	SendData(0x0a);
	SendData(0x02);
	SendData(0x00);
	SendData(0x0c);
	alarmInfo.voice_status = status_normal;	//初始情况, 默认正常
	
}

<3> 语音警报设置

设置语音播报(ctrl 加鼠标左键,快速跳转)
回来了

void alarm_voice_Set(int status)
{
	//当切换状态的时候, 播放
	if(status != alarmInfo.voice_status)
	{
		switch(status)
		{
			case 0: 	//环境恢复正常,警报解除
				SendData(0x0a);
				SendData(0x01);
				SendData(0x0b);
				alarmInfo.voice_status = status_normal;
				break;
			case 1: 	//湿度异常,开启电机除湿,蓝灯警报
				SendData(0x0a);
				SendData(0x02);
				SendData(0x0b);				
				alarmInfo.voice_status = humidity_high;
				break;
			case 2: //温度异常,开启电机降温,红灯警报
				SendData(0x0a);
				SendData(0x03);
				SendData(0x0b);				
				alarmInfo.voice_status = temperature_high;
				break;
			case 3: 
				SendData(0x0a);	  //温湿度均异常, 开启电机降温除湿,红蓝灯警报
				SendData(0x04);
				SendData(0x0b);				
				alarmInfo.voice_status = both_high;
				break;
			default: break;
		}	
	}
}	

<4>头文件包含子函数,以及声明状态变量

extern  AlarmVoiceInfo alarmInfo;

void alarm_voice_Init(void);
void alarm_voice_Set(int status);

image-20240814180035901

<5>alarm_voice.c 和 alarm_voice.h 代码备份

alarm_voice.c
#include "alarm_voice.h"
#include "JQ8900.h"


AlarmVoiceInfo alarmInfo;

void alarm_voice_Init(void)
{
	Init_One_line_Uart();
	//设置音量
	SendData(0x0a);
	SendData(0x02);
	SendData(0x00);
	SendData(0x0c);
	alarmInfo.voice_status = status_normal;	//初始情况, 默认正常
	
}


void alarm_voice_Set(int status)
{
	//当切换状态的时候, 播放
	if(status != alarmInfo.voice_status)
	{
		switch(status)
		{
			case 0: 	//环境恢复正常,警报解除
				SendData(0x0a);
				SendData(0x01);
				SendData(0x0b);
				alarmInfo.voice_status = status_normal;
				break;
			case 1: 	//湿度异常,开启电机除湿,蓝灯警报
				SendData(0x0a);
				SendData(0x02);
				SendData(0x0b);				
				alarmInfo.voice_status = humidity_high;
				break;
			case 2: //温度异常,开启电机降温,红灯警报
				SendData(0x0a);
				SendData(0x03);
				SendData(0x0b);				
				alarmInfo.voice_status = temperature_high;
				break;
			case 3: 
				SendData(0x0a);	  //温湿度均异常, 开启电机降温除湿,红蓝灯警报
				SendData(0x04);
				SendData(0x0b);				
				alarmInfo.voice_status = both_high;
				break;
			default: break;
		}	
	}
}	

alarm_voice.h
#ifndef _ALARM_VOICE_H
#define _ALARM_VOICE_H
#include "stm32f10x.h"


typedef enum {

	status_normal = 0,   	// 温度和湿度恢复正常 0 
	humidity_high = 1, 		// 湿度异常     	1
	temperature_high = 2,	// 温度异常   	2
	both_high = 3			// 都异常 		3

}VoiceStatus;

typedef struct {
    VoiceStatus voice_status;
} AlarmVoiceInfo;

extern  AlarmVoiceInfo alarmInfo;

void alarm_voice_Init(void);
void alarm_voice_Set(int status);

#endif

<5>预警系统调用语音

① 先包含预警系统头文件

#include "alarm_voice.h"

② main函数内初始化语音文件

alarm_voice_Init();

image-20240814180411492

③ 然后我们只需在预警的时候调用就可以了

预警系统调用语音(ctrl 加鼠标左键,快速跳转)
回来了

main.c代码备份:

#include "stm32f10x.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "OLED.h"

#include "humi_led.h"
#include "temp_led.h"

//联网配置文件
#include "uart.h"
#include "esp8266.h"
#include "onenet.h"

#include "fun.h"

#include "alarm_voice.h"


#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"mqtts.heclouds.com\",1883\r\n"

uint8_t temp;	//读取的环境温度
uint8_t humi;	//读取的环境湿度

uint8_t temp_th;	//设置的温度阈值
uint8_t humi_th;	//设置的湿度阈值


_Bool set_limit;	//管理员是否设置阈值


led小灯初始化
//void led_init(void);

int deal_mode;

unsigned short timeCount = 0;	//发送间隔变量

int ararm_monitor(uint8_t temp,uint8_t humi,uint8_t temp_th, uint8_t humi_th);

void ararm_deal(int alarm_mode);


unsigned short timeCount;	//发送间隔变量
	
int8_t Speed;		//定义速度变量 

//调试变量
int result;


int main()
{
	unsigned char *dataPtr = NULL;	//标志位, 是否接受到onenet发送的数据

    //手动设置环境温度(模拟上帝)
	temp = 0;	//温度是28度
	humi = 0;	//湿度是60%	
    //手动设置阈值(代替远程)
    temp_th = 80;	//温度阈值是30度
	humi_th = 80;		//湿度阈值是60%
	//测试变量: 管理设置阈值符号位
	set_limit = 1;
	//滴答定时器
	Delay_Init();
	//dht11初始化
	while(DHT11_Init())
	{
//		printf("DHT11 Error \r\n");
		OLED_ShowString(0,48, "DHT11 Error", 8);
		OLED_Update();	
		DelayMs(2000);
	}

	uart1_init(115200);//串口1,波特率115200,调试用
	uart2_init(115200);	//串口2,驱动ESP8266用
	
	alarm_voice_Init();
	
	
	ESP8266_Init();//wifi初始化
	
	while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
		DelayXms(500);
	
	while(OneNet_DevLink())			//接入OneNET
		DelayXms(500);	
	
	OneNET_Subscribe();				//解析onenet下发指令

	
	//oled初始化
	OLED_Init();
	Fun_Init();
	Speed = 20;
	humi_led_Init();
	temp_led_Init();
	
	while(1)
	{
		//(2)读取环境信息 (手动输入代替器件读取)
		//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担
		if(++timeCount >= 100)
		{
			DHT11_Read_Data(&temp,&humi);
			
			OLED_ShowChinese(0, 0, "温度");
			OLED_ShowChinese(0, 24, "湿度:");
			OLED_Printf(48,0,OLED_8X16,"%2d",temp);
			OLED_Printf(48,24,OLED_8X16,"%2d",humi);	
			OLED_ShowChinese(80,0 , "℃");
			OLED_ShowChinese(80,24 , "%");		
			
			OLED_Printf(48,48,OLED_8X16,"%2d",result);	
			
			
			OLED_Update();	

			//联网上传
			OneNet_SendData();	
			timeCount = 0;
			ESP8266_Clear();
		}
		
		//检测是否有下发信息
		dataPtr = ESP8266_GetIPD(0);
		if(dataPtr != NULL)
		{
			OneNet_RevPro(dataPtr);
//			UsartPrintf(USART_DEBUG, "6666666666\r\n");	
		}
		
		delay(0xAFC80);//延时10ms
		
		
		//后面跟 1ms的延时, 我们一切从简,先留着
		
		
		
		//(3)每时每刻判断环境信息是否异常
		//判断预警处理
		deal_mode =  ararm_monitor(temp,humi,temp_th,humi_th);
		//根据器件预警信息, 进行应急操作
		ararm_deal(deal_mode);
		
		


	}	

}



int ararm_monitor(uint8_t temp,uint8_t humi,uint8_t temp_th, uint8_t humi_th)
{

	//(1)温度正常, 湿度异常
	if(temp < temp_th && humi >= humi_th)
	{
		result = 1;
	}
	else	//(2)温度异常,湿度正常
	if(temp >= temp_th && humi < humi_th)
	{
		result = 2;
	}
	else	//(3)温度,湿度都异常
	if(temp >= temp_th && humi >= humi_th)
	{
		result = 3;
	}
	else	//(4)温度,湿度都正常
	if(temp < temp_th && humi < humi_th)
	{
		result = 0;
	}
	return result;
}	

void ararm_deal(int alarm_mode)
{
    switch(alarm_mode)
    {
        case 0: 
				humi_led_Set(blue_led_OFF);
				temp_led_Set(red_led_OFF);
				Fun_Set(FUN_OFF);
				alarm_voice_Set(status_normal);
				break;
        case 1: 
				humi_led_Set(blue_led_ON);
				temp_led_Set(red_led_OFF);
				Fun_Set(FUN_ON);
				alarm_voice_Set(humidity_high);
				break;
        case 2: 
				temp_led_Set(red_led_ON);
				humi_led_Set(blue_led_OFF);
				Fun_Set(FUN_ON);
				alarm_voice_Set(temperature_high);
				break;            
        case 3: 
				humi_led_Set(blue_led_ON);
				temp_led_Set(red_led_ON);
				Fun_Set(FUN_ON);
				alarm_voice_Set(both_high);
				break;            
        default: break;    
    }       
} 

工程演示:

https://www.bilibili.com/video/BV1ZkeneeEWd/?spm_id_from=333.999.0.0

点击跳转播放

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

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

相关文章

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

排序算法——插入排序

一、插入排序概念 直接插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插…

ubuntu、cpolar、api开启映射之路

1.国内cpolar安装 curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash或 cpolar短链接安装方式&#xff1a;(国外使用&#xff09; curl -sL https://git.io/cpolar | sudo bash2.查看版本号&#xff0c;正常显示即为安装成功 cpolar …

HR系统怎么选?2024年10大热门工具评测

本文中介绍的工具有&#xff1a;Moka、名才MCHR、HiHR、华天动力HRM、红海eHR、易路eRoad、宏景HJSOFT、Gusto、Zenefits、BambooHR。 在当今竞争激烈的商业环境中&#xff0c;找到一个适合企业的HR系统可能是一个令人头疼的问题。市面上的HR工具琳琅满目&#xff0c;各有千秋&…

Django 自定义用户 VS 用户资料

Django是一个流行的Web框架&#xff0c;它提供了一套完整的用户认证系统&#xff0c;其中包括内置的User模型用于存储基本的用户信息&#xff0c;如用户名、密码等。然而&#xff0c;如果我们需要更详细的用户资料管理&#xff0c;比如添加更多的字段或者自定义验证规则&#x…

Linux 常见的冷知识集锦

一、前言 本文旨在记录那些常见的Linux概念和名词&#xff0c;但这些又没经常直接使用到&#xff0c;更多在底层运行&#xff0c;见过却又不是特别清楚的碎片知识&#xff0c;以温故知新。 二、知识点和概念说明 2.1、POSIX标准/协议 POSIX&#xff08;Portable Operating S…

股票技术指标 RSI KDJ MACD

具体指标解释&#xff0c;大模型都有&#xff0c;只说作用 RSI&#xff08;Relative Strength Index&#xff0c;相对强弱指数&#xff09; 超买和超卖水平&#xff1a;通常情况下&#xff0c;RSI值超过70表示市场可能超买&#xff0c;而低于30表示可能超卖。这并不意味着价格…

数据结构:顺序二叉树(堆)

目录 前言 一、堆的实现 1.1 头文件 1.2 堆的初始化及销毁 1.3 堆的插入 1.4 堆的删除 1.5 取堆顶数据和判空 前言 前面我们讲了二叉树有顺序结构和链式结构&#xff0c;今天就来讲一下顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间…

HTTP请求的流转路径,从Tomcat到SpringMVC

本文主要讲一下&#xff0c;一个HTTP请求在后端服务的流转路径&#xff0c;Tomcat等一众servlet容器如何定义了Web应用的基础样貌&#xff0c;后来的MVC框架又是如何弱化了servlet的存在&#xff0c;改为自己实现请求派发的。 前些日子我写了十几篇文章来介绍Tomcat的架构&…

AI在医学领域:联邦学习 (FL) 在肿瘤学的应用综述

关键词&#xff1a;联邦学习 (Federated Learning, FL)、机器学习 (Machine Learning, ML)、肿瘤学 (Oncology)、数据隐私 (Data Privacy)、精准医疗 (Precision Medicine)、多模态 (Multi-modal) 肿瘤学正在经历快速的变革&#xff0c;这得益于机器学习&#xff08;ML&#xf…

tinymce字体为48px后再设置numlist数字列表导致前面的序号字体不对--【已解决】

问题描述&#xff1a; tinymce选择完大号字体&#xff0c;如48px&#xff0c;再选择数字列表&#xff0c;会导致数字列表的序号字体不对。 解决&#xff1a; 演示效果

【C语言篇】C语言常考及易错题整理DAY3

文章目录 选择题整形提升与算术转换左移右移操作符操作符优先级与结合性后置指针变量基本知识 编程题最大连续1的个数完全数计算单词倒排面试题.珠玑妙算两数之和 选择题 整形提升与算术转换 声明以下变量&#xff0c;则表达式: ch/i (f*d – i) 的结果类型为&#xff08; &…

Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt

目录 #1 找软件 #2 懂提示词 #3 更难的一步&#xff0c;会英文 我个人认为&#xff0c;想要玩文生图&#xff0c;你要会3个步骤&#xff1a; #1 找软件 主流文生图软件&#xff1a;Midjourney、Stable Diffusion、Dall-E 3 巧了&#xff0c;我用的都是小众、免费的画笔工…

Linux 错误码

目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中&#xff0c;错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示&#xff0c;0 表示成功&#xff0c;正数表示警告或其他非致命错误。 为了开发者更好…

查询大数据信用需要收费吗?哪个平台好一点?

随着大数据技术被运用到金融行业&#xff0c;不少申贷人都开始了解自己的大数据信用&#xff0c;在查询大数据信用的时候&#xff0c;查询大数据信用需要钱吗?哪个平台好一点?等问题是很多人都比较关心的问题&#xff0c;下面本文就详细为大家详解一下&#xff0c;希望对你了…

基于python的百度迁徙迁入、迁出数据分析(九)

副标题&#xff1a;从百度迁徙数据看——人口虹吸效应 人口虹吸效应&#xff1a;人口虹吸效应是指大城市或中心城市因其经济、文化、教育、医疗等资源的优势&#xff0c;吸引周边地区的人口、资本和其他资源向其集中的一种现象。这种效应在城市化进程中尤其明显&#xff0c;通…

公司起诉员工泄密难吗?如何搜寻有力的证据?专业审计软件助力,追责之路其实不难!

在企业管理中&#xff0c;员工泄密是一个严重的问题&#xff0c;不仅可能损害企业的商业利益&#xff0c;还可能对企业的声誉造成不可挽回的影响。然而&#xff0c;公司起诉员工泄密并非易事&#xff0c;需要满足严格的法律条件和程序&#xff0c;并面临证据收集与举证、法律程…

10款好用的文件加密软件排行榜,2024企业常用的文件加密软件

在数据安全日益受到重视的今天&#xff0c;文件加密软件已成为保护企业敏感信息的重要工具。以下是2024年企业常用的10款好用的文件加密软件排行榜&#xff0c;帮助你选择适合的工具来保护你的文件和数据。 1. 安秉加密软件 安秉加密软件提供用户友好的界面和强大的加密功能。…

使用 nginx 搭建代理服务器(正向代理 https 网站)指南

简介 正向代理 简介 在企业开发环境中&#xff0c;局域网内的设备通常需要通过正向代理服务器访问互联网。正向代理服务器充当中介&#xff0c;帮助客户端请求外部资源并返回结果。局域网内也就是俗称的内网&#xff0c;局域网外的互联网就是外网&#xff0c;在一些特殊场景内…

unity 画线写字

效果 1.界面设置 2.涉及两个脚本UIDraw.cs和UIDrawLine.cs UIDraw.cs using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class UIDraw : MonoBehaviour, IPointerEnterHandler, IPointerEx…