Zabbix --- Snmp Trap监控详细教程

news2024/12/21 22:27:47

一、zabbix服务器安装snmptrapd服务

1、安装服务

yum -y install net-snmp net-snmp-agent-libs net-snmp-devel net-snmp-libs net-snmp-perl net-snmp-utils

注:使用perl脚本解析trap信息并进行格式化,net-snmp-perl

2、zabbix启用snmptrap进程,重启服务

 vi /usr/local/zabbix_proxy/etc/zabbix_proxy.conf
SNMPTrapperFile=/tmp/zabbix_traps.tmp #数据从snmp trap守护进程传到服务器的临时文件,必须与zabbix_trap_receiver.pl或者SNMPTT配置文件中一致
StartSNMPTrapper=1 #1代表启用,0为禁用
systemctl restart zabbix_proxy

二、配置snmptrap接收设备trap信息

1、将zabbix源码包里的perl脚本复制到/usr/bin目录下

 cp /usr/local/zabbix-6.0.19/misc/snmptrap/zabbix_trap_receiver.pl /usr/bin/zabbix_trap_receiver.pl

2、编辑snmptrap服务配置文件

vi /etc/snmp/snmptrapd.conf
# Example configuration file for snmptrapd
#
# No traps are handled by default, you must edit this file!
#
authCommunity   log,execute,net public #只接收团体字为public的trap信息
# 不做任何验证 disableAuthorization  yes
# traphandle SNMPv2-MIB::coldStart    /usr/bin/bin/my_great_script cold
perl do "/usr/bin/zabbix_trap_receiver.pl"

3、检查zabbix_trap_receiver.pl脚本中的“trap信息存放路径”配置是否与zabbix配置一致

grep -w '$SNMPTrapperFile' /usr/bin/zabbix_trap_receiver.pl

注意:Zabbix不提供任何日志轮询系统(它应由用户处理)。trapfile文件需要设置日志切割, 日志轮询应该首先重命名旧文件,然后才能将其删除,以免丢失trap:

4、查看第三方mib文件的存放目录

net-snmp-config --default-mibdirs
#输出 /root/.snmp/mibs:/usr/share/snmp/mibs

将第三方mib放入目录/usr/share/snmp/mibs,用于perl脚本或SNMPTT解析OID信息。

(vSphere的mib库下载地址:https://customerconnect.vmware.com/cn/downloads/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/7_0#drivers_tools“VMware vSphere Management Information Base”部分)

 5、启动snmptrap服务

systemctl start snmptrapd.service

6、测试snmptrap接收以及perl脚本解析功能

snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.4' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.4 s "testMonitor03"

如在指定的trap存放文件中接收到对应解析信息即正常,本案例中为“/tmp/zabbix_traps.tmp”

注:如不正常,检查配置文件以及net-snmp-perl是否安装成功,若重新安装后需重启snmptrap服务再进行测试。

SNMP TRAP监控过程

  • 被监控设备向zabbix发送一个trap信息,由二进制snmptrapd进程接收它。
  • snmptrapd进程执行perl脚本,该脚本将trap信息解析转换为适合Zabbix监控的格式(基本上添加标头)。
  • 解析后,trap信息被保存到/tmp/zabbix_traps.tmp
  • SNMP trapper检查文件是否有新的trap信息,并将其与监控主机匹配。

三、使用snmptt解析trap信息(第二种)

1、安装snmptt服务

  • 1.1 官网下载二进制包 Download SNMP Trap Translator

http://www.net-snmp.org/download.html

SNMPTT

  • 1.2 安装snmptt

tar xf snmptt_1.5.tgz
cd snmptt_1.5

#将snmptt自带相关命令拷贝到/usr/sbin下
cp snmptt /usr/sbin/ && chmod +x /usr/sbin/snmptt
cp snmptthandler /usr/sbin/ && chmod +x /usr/sbin/snmptthandler
cp snmpttconvertmib /usr/sbin/ && chmod +x /usr/sbin/snmpttconvertmib
cp snmpttconvert /usr/sbin/ && chmod +x /usr/sbin/snmpttconvert

#拷贝snmptt配置文件snmptt.ini和snmptt.conf解析规则文件到放/etc/snmp下
cp snmptt.ini /etc/snmp/
cp examples/snmptt.conf.generic /etc/snmp/snmptt.conf

cp snmptt.service /usr/lib/systemd/system

2、编辑snmptt配置文件snmptt.ini

#允许使用NET-SNMP包中的Perl模块:
net_snmp_perl_enable = 1

#将日志记录到trap文件中,该文件将被Zabbix读取
log_enable = 1
log_file = [TRAP FILE]

#设置日期-时间格式
date_time_format = %H:%M:%S %Y/%m/%d

3、修改snmptrap配置文件snmptrapd.conf

    3.1、使用SNMPTT守护进程模式

traphandle default snmptthandle
#注释原来的perl方式,修改为snmptt方式

注:使用--daemon命令行选项运行SNMPTT或将snmptt.ini文件中的模式变量设置为守护进程将导致SNMPTT在守护进程模式下运行         

          或者在使用嵌入式处理程序时,需要用

perl do "/usr/sbin/snmptthandler-embedded"

注意:使用嵌入式处理程序时会获得更好的性能

    3.2、使用SNMPTT独立模式

traphandle default /usr/sbin/snmptt

注:snmptt.conf文件越大,处理时间就越长。如果会收到大量TRAP,则应使用守护进程模式。在没有--daemon命令行选项的情况下运行SNMPTT将导致独立模式,除非snmptt.ini文件中的模式变量设置为守护进程。对于独立模式,snmptt.ini文件中的模式变量应设置为独立模式

4、snmptt.conf添加snmptt解析规则

# 1、匹配Linkdown的规则,注意index设置为*匹配所有端口
EVENT LinkDown .1.3.6.1.6.3.1.1.5.3.* "Status Events" Warning
FORMAT ZBXTRAP $aA LinkDown on interface $4.    Admin state: $2.    Operational state: $3.   

# 2、匹配Linkup的规则,注意index设置为*匹配所有端口
EVENT LinkUp  .1.3.6.1.6.3.1.1.5.4.* "Status Events" Normal
FORMAT ZBXTRAP $aA LinkUp on interface $4.    Admin state: $2.    Operational state: $3.   

# 3、默认规则,oid设置为.* 没有其他规则匹配到时,所有trap信息都按此规则处理
EVENT General .* "General event" Normal
FORMAT ZBXTRAP $aA $1

5、重启snmptrapd与snmptt服务

systemctl restart snmptrapd
systemctl start snmptt

启动snmptt时发生报错:

1、

需要安装perl-Config-IniFiles,如果yum源找不到软件包,可以下载源码包再用yum local install perl-Config-IniFiles-2.79-1.el7.noarch.rpm解决依赖关系

2、

如上需要安装perl-Sys-Syslog

6、测试snmptrap接收以及snmptt解析功能

snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring001" .1.3.6.1.6.3.1.1.5.3 s "Down" .1.3.6.1.6.3.1.1.5.3 s "UP" .1.3.6.1.6.3.1.1.5.3 s "Interface-32"

四、zabbix配置监控与告警

1、创建监控主机

主机接口需要与发送trap信息设备的IP一致

2、添加snmptrap监控项

3、设置触发器

snmptrap信息特殊性一般需要手动设置恢复表达式,另外可能一条信息包含多个接口的状态,所以事件生成要选择“多重”,事件关闭要设置为“匹配标签”使告警不会被误关闭。

 4、使用regsub/iregsub宏函数配置标签

五、SNMPTT使用技巧

1、自动创建snmptt.conf 解析规则

snmptt.conf定义了解析规则,自己单独为OID创建解析规则太过繁琐。

    1.1、转换mib命令格式:

nmpttconvertmib -in=path-to-mib -out=/tmp/snmptt.conf --net_snmp_perl
# 将path-to-mib文件自动解析并将转换结果追加到snmptt.conf文件中

    1.2、大量mib文件批量转换:

#由于snmpttconvertmib不支持批量转换,可能需要通过脚本来进行批量转换:
for f in $(grep -l -i "notification" ./*);do snmpttconvertmib -in="$f" -out=/tmp/snmptt.conf --net_snmp_perl;done;

#目的使用循环读取不同MIB文件,将所有文件内容包含"notification"的mib文件解析转换,转换后的结果导入到指定一个或者多个文件中。TRAP-TYPE (v1) or NOTIFICATION-TYPE 

    1.3、修改转换后的snmptt.conf文件,每个 FORMAT 行都需要添加ZBXTRAP,否则ZABBIX无法解析

sed -r -i "s/^(FORMAT)/\1 ZBXTRAP \$aA/g" /tmp/snmptt.conf

grep "FORMAT" /tmp/snmptt.conf #检查修改结果

    1.4、在snmptt.ini配置文件中添加新的解析规则conf文件

vi /etc/snmptt/snmptt.ini

###
snmptt_conf_files = <<END
/etc/snmptt/snmptt.conf
/tmp/snmptt.conf
END
###
systemctl restart snmptt

注意:conf文件中的解析规则不要重复,否则同一个snmptrap事件会匹配多个规则,并生成多条事件。

2、snmptt.conf解析规则中的”EXEC”/“PREEXEC”属性可以实现很多功能

例如:IP地址自动转换,HEX->IP地址;利用snmpget命令获取trap的描述信息;执行自愈脚本等

案例:通过SNMPTT中”EXEC”属性,自定义外部python脚本,将SNMPTRAP信息hexstring格式进行转码翻译后,再将翻译后的消息写回到SNMPTrapperFile定义的文件中,实现告警事件接入ZABBIX并提升SNMPTRAP信息可读性。

    2.1、创建解码脚本

# cat /etc/snmp/translatetraptozbx.py
#!/usr/bin/python
# -*- coding:utf-8 -*-


#description: convert hex-string to string


import sys
import time

# 定义日志信息
logtime=time.strftime('%H:%M:%S %Y/%m/%d',time.localtime())
snmptrapfile="/var/log/snmptt/snmptt.log"

# 将hex转换成中文,hex to gb2312
def hex_to_ascii(hex_str):
try:
hex_str = hex_str.replace('Hex-STRING', '').replace(':','').replace(' ', '').replace('0x', '').replace('\t', '').replace('\n', '')
ascii_str = hex_str.decode('hex').decode('gb2312',errors='ignore')
#except (TypeError):
except :
ascii_str = 'ZBXTRAP can not translate this message'

return ascii_str

# 获取参数:IP [SNMPTRAP OIDS],example:$aA $N $+*
if len(sys.argv) >= 4:

ZBXTRAPHOST=sys.argv[1]
EVENTTYPE=sys.argv[2]
SNMPTRAPMESSAGE=''.join(sys.argv[3:])
KEYWORD='enterprises.3902.4101.1.3.1.3'
if KEYWORD in SNMPTRAPMESSAGE:
alertmessage=SNMPTRAPMESSAGE.replace('enterprises','\nenterprises').split('\n')
eventextnumber=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3','').split(':')[0]
eventtime=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3'+eventextnumber+':','')
eventseverity=alertmessage[9].replace('enterprises.3902.4101.1.3.1.6'+eventextnumber+':','').strip()

alarmid=alertmessage[14].strip()
# 告警等级转换
if eventseverity=='1':
severity="critical"
elif eventseverity=='2':
severity="critical"
elif eventseverity=='3':
severity="major"
elif eventseverity=='4':
severity="major"
elif eventseverity=='5':
severity="warning"
elif eventseverity=='6':
severity="cleared"
else:
severity="unknown"

eventtheme=hex_to_ascii(alertmessage[15].replace('enterprises.3902.4101.1.3.1.14'+eventextnumber+':','').replace(' ',''))
eventsource=hex_to_ascii(alertmessage[16].replace('enterprises.3902.4101.1.3.1.15'+eventextnumber+':','').replace(' ',''))

zbxtrapmessage=logtime+" ZBXTRAP "+ZBXTRAPHOST+" "+eventtime+"-"+ZBXTRAPHOST+" "+EVENTTYPE+",alarmuuid:"+alarmid+",severity:"+severity+" "+eventtheme+" "+eventsource
zbxtrapmessage2=zbxtrapmessage.encode("raw_unicode_escape").decode("raw_unicode_escape").encode("utf8")
with open(snmptrapfile,'a+') as f:
f.write(zbxtrapmessage2)
f.write("\n")
f.close()
print zbxtrapmessage2

else:
sys.exit()

    2.2、定义SNMPTRAP事件类型的格式化参数

 vim /etc/snmp/snmptt.conf
EVENT ztedesktopalarmNew .1.3.6.1.4.1.3902.4101.1.4.1.1 "Status Events" Normal
FORMAT $aA $N "【告警】$+*"
REGEX(\n)()g
REGEX(\(unknown\))()g
REGEX(\s+)(-)g
EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+*
systemctl restart snmptt

3、snmptt.conf解析规则文件语法

详情参看官网:SNMPTT

EVENT event_name event_OID "category" severity
FORMAT format_string
[EXEC command_string]
[NODES sources_list]
[MATCH [MODE=[or | and]] | [$n:[!][( ) | n | n-n | > n]
[SDESC]
[EDESC]

3.1、EVENT

event_name(事件名称)

  • 包含空格的唯一文本标签(别名)。
  • 当使用snmpttconvertmib转换时,这将匹配MIB文件中TRAP-TYPE或NOTIFICATION-TYPE行上的名称。

event_OID(事件OID):

  • 不包含空格的虚线格式或符号符号的对象标识符字符串,
  • 如果通过在snmptt.ini文件中设置net_snmp_perl_enable来安装并启用Net-SNMP Perl模块,也可以使用符号名称。例如:IF-MIB::linkDown。
  • OID也可以使用通配符*来匹配结尾所有的Index,或者定义为 .* 匹配所有未知事件。

category(类别):

  • 用双引号括起来的字符串
  • 如果类别为“IGNORE”,则即使snmpt .conf包含FORMAT和/或EXEC语句,也不会发生任何操作。
  • 如果类别为“LOGONLY”,则会像往常一样记录该陷阱,但是EXEC语句将被忽略。

severity(严重性):

  • 事件严重程度字符串,日志记录时在输出中使用。
  • 例如: Minor(次要), Major(重要), Normal(正常), Critical(紧急), Warning(警告)
  • 可以在snmptt.ini配置文件中配置将syslog级别或NT事件日志类型与严重性级别匹配的选项。

3.2 FORMAT

format_string(格式字符串):

  • 每个EVENT只能有一个FORMAT行。
  • 格式字符串用于生成将被记录到任何支持的日志记录方法的文本。
  • 可以使用以下变量对该字符串执行变量替换:
$A -陷阱代理主机名(见注1)
$aA - Trap代理IP地址
$Be - securityEngineID (snmpEngineID)(见注7)
$Bu - securityName (snmpCommunitySecurityName)(见注7)
$BE - contextEngineID (snmpCommunityContextEngineID)(见注释7)
$Bn - contextName (snmpCommunityContextName)(见注7)
$c -类别
$C - Trap社区字符串
$D -来自snmpt . conf或MIB文件的描述文本(见注释6)
$E -符号格式的企业陷阱OID
$e -数字格式的企业trap OID (.1.3.6.1.4.1.n)
$j -企业编号(n)
$Fa -报警(铃)(BEL)
$Ff -形式馈入(Ff)
$Fn -换行符(LF, NL)
$Fr -回报(CR)
$Ft - tab (HT, tab)
$Fz -翻译格式行(仅限EXEC, log_format和syslog_format)
$G -一般陷阱编号(如果是企业陷阱则为0)
$S -特定trap编号(如果是一般trap则为0)
$H -运行SNMPTT的系统主机名
$N -匹配条目的.conf文件中定义的事件名称
$i -匹配条目的.conf文件中定义的事件OID(可以是通配符OID)
$O -符号格式的Trap OID(见注4)
$0 -数字格式的Trap OID(见注4)
$pn - PREEXEC结果n (1-n)
$pun -未知陷阱预执行结果n (1-n)。请参见snmp .ini中的unknown_trap_preexec设置。
$R, $R - Trap主机名(参见注1)
$aR, $aR - IP地址
$s -严重性
$T - Uptime:网络实体初始化后的时间
$X -时间陷阱被假脱机(守护模式)或当前时间(独立模式)
$x -日期陷阱被假脱机(守护模式)或当前日期(独立模式)
$# -陷阱中变量绑定的数目(多少)
$$ -打印$
$@ -从陷阱被假脱机(守护模式)或当前时间(独立模式)开始的秒数
$n -扩展变量绑定n (1-n)(参见注释2,5)
$+n -将变量绑定n (1-n)展开为变量名:值的格式(参见注2、3、5)
$-n -展开变量绑定n (1-n),格式为变量名(变量类型):值(见注2、3、5)
$vn -扩展变量绑定n的变量名(1-n)(参见注3)
$* -扩展所有变量绑定(参见注5)
$+* -以变量名:值的格式展开所有变量绑定(参见注2、3、5)
$-* -以变量名(变量类型):值的格式展开所有变量绑定(参见注2、3、5)

例如:FORMAT NIC switchover to slot $3, port $4 from slot $5, port $6

3.3、[EXEC command_string]

[EXEC command_string]

  • 每个EVENT可以有多个EXEC行。
  • 可选字符串,包含接收到trap后要执行的命令。EXEC行按照它们出现的顺序执行。
  • EXEC使用与FORMAT行相同的变量替换。您可以在EXEC行上使用$Fz来添加翻译后的FORMAT行,而不是重复您已经在FORMAT上定义的内容。

例如:

EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
    
    FORMAT NIC switchover to slot $3, port $4 from slot $5, port $6
    EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - $Fz"
    
    EXEC c:\\snmp\\pager netops "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"

如果在“snmptt.conf”文件中设置trap severity为LOGONLY,则不会执行EXEC。

注意:与FORMAT行不同的是,消息中没有附加任何内容。如果您想在上面的页面中包含主机名和日期,则必须使用诸如$r、$x和$x之类的变量。

[PREEXEC command_string]

  • 每个EVENT可以有多个PREEXEC行。
  • 可选字符串,包含一条在收到trap后、处理FORMAT和EXEC语句之前执行的命令。外部程序的输出存储在$pn变量中,其中n是从1开始的数字。允许使用多个PREEXEC行。第一个PREEXEC将命令的结果存储在$p1中,第二个PREEXEC将命令的结果存储在$p2中。
  • 删除所有结束换行符。
  • 可以在snmptt.ini配置文件中修改参数pre_exec_enable用于启用/禁用PREEXEC语句。
  • PREEXEC使用与FORMAT行相同的变量替换。

例如:

EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal  
    FORMAT Link down on interface $1($p1). Admin state: $2. Operational state: $3  
    PREEXEC /usr/local/bin/snmpget -v 1 -Ovq -c public $aA ifDescr.$1

样例输出:Link down on interface 69("100BaseTX Port 1/6 Name SERVER1").  Admin state up.  Operational state: down

在上面的示例中,结果是用引号括起来的,因为这是从snmpget返回的结果(它不是由SNMPTT添加的)。

注意:即使在snmptt.conf文件中设置trap severity为LOGONLY, PREEXEC也会执行。

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

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

相关文章

react轮播图

这里 我用的是组件&#xff1a; 网址&#xff1a;Collapse 折叠面板 - Ant Design Mobile 1.首先 先声明一个变量 2、把需要的数据存存进去 3、组件内容复制过来&#xff08;这里用到的是map循环&#xff09; 然后图片就出来了 就是这个简单 哈哈哈哈&#xff01;&#xff01…

【Unity-Cinemachine相机】虚拟相机(Virtual Camera)的本质与基本属性

我们可以在游戏进行时修改各个属性&#xff0c;但在概念上&#xff0c;最好将Virtual Camera 当作一种相机行为的“配置文件”&#xff0c;而不是一个组件。 我们的相机有几种行为就为它准备几种虚拟相机&#xff0c;比如角色移动就为它第三人称相机&#xff0c;瞄准就准备一个…

Linux——守护进程

简述 不受用户登录、注销影响的进程称为守护进程 特点 后台运行&#xff1a;守护进程在后台默默地执行任务&#xff0c;不与用户交互。它不会向终端输出信息&#xff0c;也不会从终端接收输入。 无终端关联&#xff1a;守护进程通常与任何终端会话&#xff08;比如SSH会话&…

【c++5道练习题】①

目录 一、有限制的累加 二、计算日期到天数转换 三、仅仅反转字母 四、 字符串的第一个唯一字符 五、字符串最后一个单词的长度 一、有限制的累加 题述&#xff1a; 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句…

基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MyBatisPlus基础 一、入门案例1.1 创建新模块&…

深入理解Python中的多进程和多线程

前言 此篇文章将深入的讲解Python中的多进程和多线程 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 第一部分&#xff1a;多进程 多进程是指在操作系统中…

STL stack,queue,deque以及适配器

目录 stackstack的使用stack模拟实现 queuequeue的使用queue模拟实现 适配器deque stack stack的使用 下面是stack库中的接口函数&#xff0c;有了前面的基础&#xff0c;我们可以根据函数名得知函数的作用 函数说明stack()构造空栈empty()判断栈是否为空size()返回栈中元素…

keil5 快捷下载STM32系列芯片器件包的方法

以STM32H7系列的器件包为例,官网的下载网址为 https://sadevicepacksprodus.blob.core.windows.net/pack/Keil.STM32H7xx_DFP.3.1.1.pack 其中STM32H7xx为芯片系列编号,3.1.1为器件包的版本 如需下载其他系列和版本的器件包,只需把网址中的编号和版本换成对应的即可(前提是输入…

Websocket、SessionCookie、前端基础知识

目录 1.Websocket Websocket与HTTP的介绍 不同使用场景 Websocket链接过程 2.Session&Cookie Cookie的工作原理 Session的工作原理 区别 3.前端基础知识 1.Websocket Websocket与HTTP的介绍 HTTP&#xff1a; 1.HTTP是单向的&#xff0c;客户端发送请求&#xff0…

OWS.infg应用程序隐私政策

本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务&#xff0c;本软件目前不会使用和披露您的个人信息。但本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时&#xff0c;即视为您已经同意本隐私权政策全部内容。本隐私权政策…

OJ练习第154题——到家的最少跳跃次数

到家的最少跳跃次数 力扣链接&#xff1a;1654. 到家的最少跳跃次数 题目描述 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。 它…

【数据结构】——查找、散列表的相关习题

目录 一、选择填空判断题题型一&#xff08;顺序、二分查找的概念&#xff09;题型二&#xff08;分块查找的概念&#xff09;题型三&#xff08;关键字比较次数&#xff09; 二、应用题题型一&#xff08;二分查找判定树&#xff09; 一、选择填空判断题 题型一&#xff08;顺…

1、英飞凌-AURIX-TC297简介

目录 TC297简介TC297特点&#xff1a;系统优势最具创新性的安全应用场景 printf("欢迎关注公众号&#xff1a;Kevin的学习站/车载嵌入式探索者&#xff0c;博主建立了一个车规级开发交流群&#xff0c; 感兴趣的朋友可以关注公众号&#xff0c;加个人WX&#xff1a;_kevin…

医疗小程序:让服务更高效,用户体验更优化

随着移动互联网的快速发展&#xff0c;小程序已经成为了一个热门的开发方向。医疗健康类小程序也不例外&#xff0c;拥有广泛的市场需求和前景。本文将为你提供一份完整的医疗健康类小程序开发攻略&#xff0c;帮助你快速开发上线一个专业成熟的小程序商城。 一、选择合适的小程…

C++(17):异常处理

异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。 异常使得能够将问题的检测与解决过程分离开来&#xff1a;程序的一部分负责检测问题的出现&#xff0c;然后解决该问题的任务传递给程序的另一部分。检测环节无须知道问题处理模块的…

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…

AI能完全取代PS吗?两者僵持背后的设计思路!

PS 是功能强大的位图图片处理软件。它的核心功能是图片处理&#xff0c;最大特点是放大图片时会出现马赛克模糊。PS 存在下载安装复杂&#xff0c;功能繁杂&#xff0c;新手不易上手等缺点。越来越多设计师更青睐轻量级的协作设计软件&#xff0c;例如新一代国产软件即时设计。…

openCV实战-系列教程11:文档扫描OCR识别上(轮廓检测/轮廓近似/透视变换/OCR识别)项目实战、源码解读

&#x1f9e1;&#x1f49b;&#x1f49a;&#x1f499;&#x1f49c;OpenCV实战系列总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 下篇内容&#xff1a; openCV实战-系列教程13&#xff1a;文档扫描OCR识别下&am…

李跳跳下载-《告别广告困扰,让李跳跳助力打造清爽浏览体验》

大家好&#xff0c;&#x1f44b;今天我想向大家介绍一款非常好用的应用程序——李跳跳 App &#x1f680;。 随着智能手机的普及&#xff0c;应用程序已经成为了我们日常生活中必不可少的一部分。但是&#xff0c;随之而来的是各种各样的广告&#xff0c;这些广告不仅浪费我们…

【C++】输入输出及格式控制

在各类算法竞赛和机试中&#xff0c;对测试数据和输出格式往往会有明确的规定&#xff0c;笔者结合个人刷题经历&#xff0c;得到了以下C语言输入输出控制的方法。 cin&#xff1a;从缓冲区中读取数据 cin>>从缓冲区中读取数据时&#xff0c;若缓冲区中第一个字符是空格…