《网络管理》实践环节04:SNMP监控数据采集流程及SNMP协议详细分析

news2025/4/15 21:18:42
兰生幽谷,不为莫服而不芳;
君子行义,不为莫知而止休。

1 实验目标

1. 理解SNMP网络管理原理

2. 掌握SNMP服务器采集SNMP Agent数据的方法

3. 掌握SNMP报文发送和应答流程

4. 掌握典型GetResponsePDU数据结构分析的方法

4. 具备SNMP通信的故障排除能力

2 实验拓扑

图2- 1

实验先决条件:如拓扑图所示,任选一个服务器且任选一个Agent,即1SNMPserver+1SNMPAgent,也可以都选,多选一个加10分。

3.实验内容

实验内容:编写代码,测试

1)使用snm服务器发送SNMP数据包; 使用wiresharktcpdump抓包;

2)根据抓包数据分析并验证SNMP协议的工作过程(参考教材图4-2);

3)挑选MIB-2功能组中系统功能组system采集过程的相应包,分析其SNMP协议工作过程;

4)查找标量对象标识符MIB-2.1.3.6.1.2.1.1.4.0响应包,并按第2BER编码方法、第3MIB-2功能组及第4SNMP PDU结构,分析该GetResponsePDU

4实训原理/流程

RFC 1157给出了SNMPv1协议的定义,是ASN.1定义的。NMSAgent发出三种请求:GetRequestGetNextRequestSetRequest,Agent只有一种GetResponsePDU

SNMP报文

版本号

团体名

SNMP PDU

GetRequestPDUGetNextRequestPDUSetRequestPDU

PDU类型

请求标识

0

0

变量绑定表

GetResponsePDU

PDU类型

请求标识

错误状态

错误索引

变量绑定表

TrapPDU

PDU类型

制造商ID

代理地址

一般trap

自定trap

时间戳

变量绑定表

变量绑定表

1

1

2

2

……

n

n

图2- 2

图2- 3

各种报文发送和应答序列如下:

图2- 4

     

图2- 5

图2- 6

 

图2- 7

图2- 8

生成和发送SNMP报文

图2- 9

[实验步骤]

一)安装工具并查看:

服务器端和被监控端都要安装

yum install -y net-snmp net-snmp-utils

snmpd -v

二)客户端配置

1. Lihnux客户端

我想多台NMS管理本机,根据需要。具体配置自行修改,注意红色部分。

……

exec .1.3.6.1.2.1.1.1.0 /usr/local/bin/custom_sysdescr.sh

rocommunity public    192.168.56.0/24

rwcommunity private   192.168.56.0/24

rocommunity MySecureComm 192.168.56.0/24

rwcommunity MyWriteComm 192.168.56.0/24

rocommunity MySecureComm 192.168.100.0/24

recommunity MyWriteComm 192.168.100.0/24

com2sec writeAccess 192.168.56.0/24 MyWriteComm

com2sec writeAccess 192.168.100.0/24 MyWriteComm

rwuser snmpuser auth -V 2c                 //这个是命令行生成的

agentAddress udp:161,udp6:[::1]:161

# For more information, read the FAQ as well as the snmpd.conf(5)

# manual page.

####

# First, map the community name "public" into a "security name"

#       sec.name  source          community

com2sec notConfigUser  default       public

####

# Second, map the security name into a group name:

#       groupName      securityModel securityName

group   notConfigGroup v1           notConfigUser

group   notConfigGroup v2c           notConfigUser

……

####

# Third, create a view for us to let the group have rights to:

# Make at least  snmpwalk -v 1 localhost -c public system fast again.

#       name           incl/excl     subtree         mask(optional)

view    systemview    included   .1.3.6.1.2.1.1

view    systemview    included   .1.3.6.1.2.1.25.1.1

view    systemview    included   .1

view    systemview    included   .1.3.6.1.4.1.2021.9

####

# Finally, grant the group read-only access to the systemview view.

#       group          context sec.model sec.level prefix read   write  notif

access  notConfigGroup ""      any       noauth    exact  systemview none none

syslocation 7Jiao

syscontact Admin

# -----------------------------------------------------------------------------

# Here is a commented out example configuration that allows less

# restrictive access.

# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY

# KNOWN AT YOUR SITE.  YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO

# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.

##       sec.name  source          community

#com2sec local     localhost       COMMUNITY

#com2sec mynetwork NETWORK/24      COMMUNITY

com2sec notConfigUser  default       public

##     group.name sec.model  sec.name

#group MyRWGroup  any        local

#group MyROGroup  any        mynetwork

group   notConfigGroup v1    notConfigUser

group   notConfigGroup v2c   notConfigUser

access  notconfigGroup any   noauth

# System contact information

#

# It is also possible to set the sysContact and sysLocation system

# variables through the snmpd.conf file:

sysdescr        CentOS7.9.2207

sysobjectid     19216810022

syslocation Building No.7 7907

syscontact Wu Zhengzhong <1531036898@qq.com>

sysname         cts-zbxagt

sysservices     72

###############################################################################

# Process checks.

#

#  The following are examples of how to use the agent to check for

#  processes running on the host.  The syntax looks something like:

#

#  proc NAME [MAX=0] [MIN=0]

#

#  NAME:  the name of the process to check for.  It must match

#         exactly (ie, http will not find httpd processes).

#  MAX:   the maximum number allowed to be running.  Defaults to 0.

#  MIN:   the minimum number to be running.  Defaults to 0.

#

#  Examples (commented out by default):

#

#  Make sure mountd is running

proc mountd

#  Make sure there are no more than 4 ntalkds running, but 0 is ok too.

proc ntalkd 4

#  Make sure at least one sendmail, but less than or equal to 10 are running.

proc sendmail 10 1

#  A snmpwalk of the process mib tree would look something like this:

#

# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2

enterprises.ucdavis.procTable.prEntry.prIndex.1 = 1

enterprises.ucdavis.procTable.prEntry.prIndex.2 = 2

enterprises.ucdavis.procTable.prEntry.prIndex.3 = 3

enterprises.ucdavis.procTable.prEntry.prNames.1 = "mountd"

enterprises.ucdavis.procTable.prEntry.prNames.2 = "ntalkd"

enterprises.ucdavis.procTable.prEntry.prNames.3 = "sendmail"

# enterprises.ucdavis.procTable.prEntry.prMin.1 = 0

# enterprises.ucdavis.procTable.prEntry.prMin.2 = 0

# enterprises.ucdavis.procTable.prEntry.prMin.3 = 1

# enterprises.ucdavis.procTable.prEntry.prMax.1 = 0

# enterprises.ucdavis.procTable.prEntry.prMax.2 = 4

# enterprises.ucdavis.procTable.prEntry.prMax.3 = 10

# enterprises.ucdavis.procTable.prEntry.prCount.1 = 0

# enterprises.ucdavis.procTable.prEntry.prCount.2 = 0

# enterprises.ucdavis.procTable.prEntry.prCount.3 = 1

# enterprises.ucdavis.procTable.prEntry.prErrorFlag.1 = 1

# enterprises.ucdavis.procTable.prEntry.prErrorFlag.2 = 0

# enterprises.ucdavis.procTable.prEntry.prErrorFlag.3 = 0

enterprises.ucdavis.procTable.prEntry.prErrMessage.1 = "No mountd process running."

enterprises.ucdavis.procTable.prEntry.prErrMessage.2 = "finish!"

# enterprises.ucdavis.procTable.prEntry.prErrMessage.3 = ""

# enterprises.ucdavis.procTable.prEntry.prErrFix.1 = 0

# enterprises.ucdavis.procTable.prEntry.prErrFix.2 = 0

# enterprises.ucdavis.procTable.prEntry.prErrFix.3 = 0

###############################################################################

# load average checks

#

# load [1MAX=12.0] [5MAX=12.0] [15MAX=12.0]

#

# 1MAX:   If the 1 minute load average is above this limit at query

#         time, the errorFlag will be set.

# 5MAX:   Similar, but for 5 min average.

# 15MAX:  Similar, but for 15 min average.

# Check for loads:

load 12 14 14

# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.10

# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.1 = 1

# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.2 = 2

# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.3 = 3

enterprises.ucdavis.loadTable.laEntry.loadaveNames.1 = "Load-1"

enterprises.ucdavis.loadTable.laEntry.loadaveNames.2 = "Load-5"

enterprises.ucdavis.loadTable.laEntry.loadaveNames.3 = "Load-15"

2. HCL网络设备客户端

v1&v2c

备注

snmp-agent sys-info version v1 v2c

snmp-agent community read public

snmp-agent community write private

snmp-agent sys-info contact Mr.WuZhengzhong-Mob:15523232551

snmp-agent sys-info location CQIE7Jiao,7907

snmp-agent trap enable

nmp-agent target-host trap address udp-domain [snmp server IP] params securityname public v1

适配版本

读共同体

写共同体

联系电话

设备位置

允许向用共同体public NMStrap

由于MobaXterm与主机相连是加密连接的,所以,用wireshark去抓包,通常无法得到所需的数据结构。

下面我们试一下:

图2- 10

#启动wireshark,抓取VirtualBox Host-only网卡的数据包

#snmp服务器(192.168.56.220)上获取客户端(192.168.56.22)参数

[root@zbx624oe2203 wutool]# snmpwalk -c public -v 2c 192.168.56.22 sysName

SNMPv2-MIB::sysName.0 = STRING: cts-zbxagt

此时,在wireshark上抓取的包,没有解析出来:

图2- 11

所以,我们在获取信息的时候,应该是在snmp上用专有的抓包工具来分析:

yum install -y tcpdump

启动snmp获取数据,然后启动snmpwalk -v 2c -c public 192.168.56.22 system

tcpdump -i ens37  -s 0      -w   snmp.pcap udp        port  161

         接口    抓到完整的数据包    保存文件名  指定协议    指定端口

在指定文件夹中,会出现snmp.pcap数据包

图2- 12

查看数据包snmp.pcap

图2- 13

看不懂。要用专门的格式

[root@zbx624oe2203 wutool]# tcpdump -r snmp.pcap

自己找所需的信息

reading from file snmp.pcap, link-type EN10MB (Ethernet), snapshot length 262144

dropped privs to tcpdump

11:04:22.237693 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(26)  system

11:04:22.238182 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(115)  system.sysDescr.0="Linux cts-zbxagt 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64"

11:04:22.238270 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysDescr.0

11:04:22.238604 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(38)  system.sysObjectID.0=E:8072.3.2.10

11:04:22.238689 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysObjectID.0

11:04:22.239105 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(31)  system.sysUpTime.0=153002

11:04:22.239160 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysUpTime.0

11:04:22.239484 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(61)  system.sysContact.0="Wu Zhengzhong <1531036898@qq.com>"

11:04:22.239546 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysContact.0

11:04:22.239856 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(39)  system.sysName.0="WuSnmpAgent"

11:04:22.239903 IP zbx624oe2203.58465 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysName.0

11:04:22.240142 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(46)  system.sysLocation.0="Building No.7 7907"

……

11:04:22.249635 IP 192.168.56.22.snmp > zbx624oe2203.58465:  GetResponse(29)  interfaces.ifNumber.0=5

11:04:44.060966 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(26)  system

11:04:44.061492 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(115)  system.sysDescr.0="Linux cts-zbxagt 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64"

11:04:44.061606 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysDescr.0

11:04:44.061920 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(38)  system.sysObjectID.0=E:8072.3.2.10

11:04:44.061990 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysObjectID.0

11:04:44.062259 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(31)  system.sysUpTime.0=155184

11:04:44.062325 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysUpTime.0

11:04:44.062559 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(61)  system.sysContact.0="Wu Zhengzhong <1531036898@qq.com>"

11:04:44.062641 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysContact.0

11:04:44.062924 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(39)  system.sysName.0="WuSnmpAgent"

11:04:44.062975 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysName.0

11:04:44.063215 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(46)  system.sysLocation.0="Building No.7 7907"

11:04:44.063307 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(28)  system.sysLocation.0

……

11:04:44.072969 IP zbx624oe2203.33528 > 192.168.56.22.snmp:  GetNextRequest(30)  system.9.1.4.10

11:04:44.073290 IP 192.168.56.22.snmp > zbx624oe2203.33528:  GetResponse(29)  interfaces.ifNumber.0=5

2- 14

图2- 15

修改一下得到:

 

00 0c 29 ea d2 35 0c cd 87 b7 01 05 08 00 45 00 00 66 00 51 00 00 ff 11 c8 99 c0 a8 38 6f c0 a8 38 dc 00 a1 8a 42 00 52 98 86 30 48 02 01 01 04 06 70 75 62 6c 69 63 a2 3b 02 04 09 6a 72 95 02 01 00 02 01 00 30 2d 30 2b 06 08 2b 06 01 02 01 01 04 00 04 21 57 75 20 5a 68 65 6e 67 7a 68 6f 6e 67 20 3c 31 35 33 31 30 33 36 38 39 38 40 71 71 2e 63 6f 6d 3e

2. HCL网络设备客户端

图2- 16

图2- 17

00 0c 29 ea d2 35 0c cd 87 b7 01 05 08 00 45 00 00 66 00 51 00 00 ff 11 c8 99 c0 a8 38 6f c0 a8 38 dc 00 a1 8a 42 00 52 98 86 30 48 02 01 01 04 06 70 75 62 6c 69 63 a2 3b 02 04 09 6a 72 95 02 01 00 02 01 00 30 2d 30 2b 06 08 2b 06 01 02 01 01 04 00 04 1f 4d 72 2e 57 75 5a 68 65 6e 67 7a  68 6f 6e 67 2d 4d 6f 62 3a 31 35 35 32 33 32 33 32 35 35 31

00 0c 29 ea d2 35                                           //目的MAC

0c cd 87 b7 01 05                                           //MAC

08 00                                                       //IP数据报

45 00 00 66 00 51 00 00 ff 11 c8 99 c0 a8 38 6f c0 a8 38 dc //IP

00 a1 8a 42 00 52 98 86                                     //UDP

30                                                       //SNMP SEQUENCE

48                                                       //SNMP报文长度

02 01 01                                                 //版本号

04 06 70 75 62 6c 69 63                                  //public

a2 3b                                         //RequestPDU报文,长度3b

02 04 09 6a 72 95                          //请求标识

02 01 00                                   //0

02 01 00                                   //0

//后面就是变量绑定表

30 2d                                       // SNMP SEQUENCE45

30 2b                                       // SNMP SEQUENCE43

06 08 2b 06 01 02 01 01 04 00               //.1.3.6.1.2.1.4.0

04 1f                                       //OCTSTRING 长度1f

4d 72 2e 57 75 5a 68 65 6e 67 7a  68 6f 6e 67 2d 4d 6f 62 3a 31 35 35 32 33 32 33 32 35 35 31                   //Mr.WuZhengzhong-Mob:15523242551

抓包结果分析

SNMPv1原始报文内容:

00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8  0a 05 0c 00 00 a2 00 34 ff e0 30 2a 02 01 00 04 06 70 75 62 6c 69 63 a4 1d 06 0a 2b 06 01 04 01 bf 08 03 02 0a 40 04 c0 a8 0a 01 02 01 00 02 01 00 43 01 0e 30 00

目的MAC00 23 5a 9e 58 b9

MAC00 4c 41 49 50 55

协议类型:08 00 ,为IP数据报

IP头:45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8 0a 05

UDP头:0c 00 00 a2 00 34 ff e0

其余部分都为SNMP报文,接下来我们对照前面的报文结构体来逐个分析一下。

30 表示SNMP消息是ASN.1SEQUENCE类型;

2a 表示该SNMP报文的总长度是42(0x2a)个字节,该字段所表示的报文长度起始于它后面的第一个字节直到报文结束;

02 01 00 表示版本号,可见其确实为BER编码方式。02表示该字段是INTEGER类型;01表示该字段占1个字节;00表示版本号,该值为“版本号-1”;

04 06 70 75 62 6c 69 63 表示团体名,

04表示该字段为OCTETSTRING类型;

06表示该字段占6个字节;

70 75 62 6c 69 63表示团体名的ANSII码的十六进制形式,这里是“public”;

a4 1d 其中a4中的“4”表示这是一个trap报文,a4又叫报文的标签标记

1d表示后面还有29(0x1d)个字节的数据;

06 0a 2b 06 01 04 01 bf 08 03 02 0a 企业OID标识。

06表示该字段是个对象标识符,OBJECTIDENTIFIER

0a表示该字段占10(0x0a)个字节;

关于SNMPOID的编码方式有些奇特:例如1.3.6.1.2. 取前两个数字分别记为xy。编码时40*x+y,这里x=1y=3,因此结果为40*1+3=43,即表示十六进制的2b。因此,这里的企业OID编码即为1.3.6.1.4.1.8072.3.2.10

40 04 c0 a8 0a 01 同样

40表示该字段为OCTET STRING 类型;

04表示IP地址占4个字节;IP地址为192.168.10.1

02 01 00 其中00表示trap类型为coldStart

02 01 00 其中00表示我们指定的trapspecific-trap也为coldStart类型;

43 01 0e

43表示为TimeTicks类型;

01表示该字段占1个字节;

0e即十进制的14表示时间标签为0.14秒,这里时间计数器以0.01秒递增;

30 00 30表示“键-值”值对的编码类型

30SEQUENCE

00表示该字段占0个字节,即没有该字段。

SNMPv2原始报文内容:

00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a 01 c0 a8 0a 05 0c 01 00 a2 00 67 04 bb 30 5d 02 01 01 04 06 70 75 62 6c 69 63 a7 50 02 04 17 73 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 17 06 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 0603 01 01 05 01 30 18 06 0a 2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a

目的MAC00 23 5a 9e 58 b9

MAC00 4c 41 49 50 55

协议类型:08 00IP报文

IP头:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a80a 01 c0 a80a 05

UDP头:0c 01 00 a2 00 67 04 bb

余下部分全为SNMP报文内容,这里我们做一下简单的约定:

xx 标注类型;xx 标注长度;xx 标注真正的数据。

这样一来上面这串原始数据就好分析多了J

30 5d 整个SNMP报文的编码方式

30SEQUENCE类型,

5d报文长度93(0x5d)字节;

02 01 01 版本号01v2版本;

04 06 70 75 62 6c 69 63 团体名70 75 62 6c69 63  即英文的“public”;

a7 50 a7表示trap类型为7,即厂商自定义trap

50表示PDU区段占80(0x50)字节;

02 04 17 73 2c fb 请求ID17 73 2c fb 十进制的393424123

02 01 00 错误状态0

02 01 00 错误索引0

30 42 “变量名-值”对编码类型

30 SEQUENCE类型;

42 “变量名-值”所占总字节0x42,即66字节;

30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e

30第一个“名-值”对区段编码方式,即SEQUENCE类型;

0d第一个“名-值”对总长度0x0d13字节;

06第一个变量名的编码类型0x06,时间标签;

08第一个变量名占0x08个字节;

2b 06 01 02 01 01 03 00第一个变量名,为1.3.6.1.2.1.1.3.0

0e第一个变量值为0x0e,即14

30 17 06 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 06 03 01 01 05 01

第二个“名-值”对;变量名1.3.6.1.6.3.1.1.4.1.0;变量值1.3.6.1.6.3.1.1.5.1

30 18 06 0a2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a

第三个“名-值”对;变量名1.3.6.1.6.3.1.1.4.3.0;变量值1.3.6.1.4.1.8072.3.2.10

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

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

相关文章

《Uniapp-Vue 3-TS 实战开发》构建HTTP请求拦截器

引言 在 UniApp 结合 TypeScript 和 Vue3 的项目开发中&#xff0c;请求拦截器起着至关重要的作用。它能够在请求发送前和响应接收后对数据进行统一处理&#xff0c;极大地提高了代码的可维护性和功能性。本文将详细解析上述代码中请求拦截器的实现及其在 UniApp-Ts-Vue3 项目中…

从PDF中提取表格:以GB/T2260—2007为例

文章目录 先说结论前因后果思路1、PDF2CSV2、PDF2MD → MD2CSV3、针对不同表格的两种思路1&#xff09; 竖形三线表2&#xff09;五元素为一组 还没结束批量处理1、分割markdown文档2、跳过另一种格式的文档 总结一下 先说结论 结论就是&#xff0c;博主用了一天的时间去研究如…

初识MySQL · 复合查询(内外连接)

目录 前言&#xff1a; 基本查询回顾 笛卡尔积和子查询 笛卡尔积 内外连接 子查询 单行子查询 多行子查询 多列子查询 from中使用子查询 合并查询 前言&#xff1a; 在前文我们学习了MySQL的基本查询&#xff0c;就是简单的套用了select语句&#xff0c;最多不过是…

辛格迪客户案例 | 北京舒曼德医药实施电子合约系统(eSign)

01 北京舒曼德医药科技开发有限公司&#xff1a;医药科技的数字化先锋 北京舒曼德医药科技开发有限公司&#xff08;以下简称“舒曼德医药”&#xff09;作为国内医药科技领域的领军企业&#xff0c;致力于创新药物的研发、临床试验和市场推广。公司以“科技兴药、质量为先、服…

Python面向对象-开闭原则(OCP)

1. 什么是开闭原则&#xff1f; 开闭原则(Open-Closed Principle, OCP) 是面向对象设计的五大SOLID原则之一&#xff0c;由Bertrand Meyer提出。其核心定义是&#xff1a; “软件实体(类、模块、函数等)应该对扩展开放&#xff0c;对修改关闭。” 对扩展开放&#xff1a;当需求…

Class 文件和类加载机制

一、Class 文件 与 类加载机制 概述 什么是 Class 文件&#xff1f; Java 源码&#xff08;.java&#xff09;经过 javac 编译器 编译生成的字节码文件&#xff08;.class&#xff09;&#xff1b;由 JVM 识别执行&#xff0c;包含类的完整结构信息&#xff08;如字段、方法、…

Vue3+Vite+TypeScript+Element Plus开发-07.Mockjs引用与Axios封装

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档目…

【Redis】背景知识

一、Redis的特性 Redis是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xf…

航电系统的任务载荷集成技术要点概述!

一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突&#xff1a;不同厂商的载荷设备&#xff08;如光学相机、雷达、电子战模块&#xff09;采用不同的通信协议&#xff08;如1553B、RS422、以太网&#xff09;&#xff0c;需设计统一的总线接口标准以支持即…

OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日&#xff0c;OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试&#xff0c;OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…

Qt中的信号与槽及其自定义

信号源&#xff1a;哪个控件发的信号 信号的类型&#xff1a;用户进行不同的操作就会触发不同的信号 如点击按钮&#xff0c;在输入框移动光标&#xff0c;勾选一个复选框&#xff0c;选 择一个下拉框 信号的处理方式&#xff1a;槽(slot)----也就是函数&#xff0c;Qt中用con…

【PFPGA学习】状态机思想编程HDLbitsFPGA练习

目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 &#xff14;. 选型建议 三、HDLbitsFPGA练习记录&#xff08;combinational logic…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

Python从入门到精通全套视频教程免费

概述 &#x1f4e2; 所有想学Python的小伙伴看过来&#xff01;作为深耕编程领域的技术分享者&#xff0c;最新整理了一份Python从0到1的视频教程。 &#x1f4a1;亮点 ✅ 保姆级系统路线&#xff1a;从环境搭建、语法精讲&#xff0c;到爬虫/数据分析/AI/Web全栈开发&#…

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…

帆软fvs文件中某表格新增数据来声提醒

1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件&#xff08;如 mp3 格式&#xff09;&#xff0c;并将其放置在合适的目录。 例如&#xff1a;%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」&#xff0c;输入以下 JavaScript …

从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人

前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…

$_POST 超级全局变量

$_POST 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同&#xff0c;$_POST 允许发送大量数据&#xff0c;且数据不会显示在 URL 中&#xff0c;因此更适用于提交敏感信息&#xff0c;如用户登录信息、表单数据等。 使…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…