一种通用数据帧解析方法、装置及设备与流程

文档序号:18899012发布日期:2019-10-18 21:40阅读:426来源:国知局
一种通用数据帧解析方法、装置及设备与流程

本发明涉及数据解析技术领域,具体而言,涉及一种通用数据帧解析方法、装置及设备。



背景技术:

scada(supervisorycontrolanddataacquisition,数据采集与监视控制系统)需对整体系统的设备数据进行采集,再加以计算机的监控应用。为确保数据安全,防止数据被窃听,在设备数据传输过程中,引入数据加密机制,只有正确的密钥才能正常解析数据。

然而,在具体应用过程中,存在前期工程监控未引入数据加密机制,后期工程监控引入数据加密机制的情况,导致有两套服务器解析程序,分别解析加密数据和未加密数据,不便于服务器维护,增加运维成本。

针对现有技术中scada系统有两套服务器解析程序,不利于服务器维护的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供一种通用数据帧解析方法、装置及设备,以解决现有技术中scada系统有两套服务器解析程序,不利于服务器维护的问题。

为解决上述技术问题,本发明实施例提供了一种通用数据帧解析方法,包括:

根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧,其中,加密数据帧和非加密数据帧的帧格式不同,所述帧类型标识用于在解析过程中标识所述数据帧发送端发送的数据帧的类型;

若所述当前数据帧为加密数据帧,利用预设密钥对所述当前数据帧进行解密,并将解密得到的数据存入解析队列。

可选的,所述预设帧格式是在加密数据帧的头部设置长度为预设字节且取值为预设值的数据;

根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧,包括:

判断所述帧类型标识是否为第一值,其中,所述第一值表示确认非加密帧;

若所述帧类型标识不是第一值,按照所述预设帧格式从网络缓存区读取预设字节的数据;

判断所述预设字节的数据是否为预设值;

若所述预设字节的数据为预设值,确定所述当前数据帧为加密数据帧。

可选的,在判断所述预设字节的数据是否为预设值之后,还包括:

若所述预设字节的数据不是预设值,判断所述帧类型标识是否为第二值,其中,所述第二值表示确认加密帧;

若是,则从所述网络缓存区偏移所述预设字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤;

若否,则确定所述当前数据帧为非加密数据帧,并按照非加密数据帧的解析流程进行解析。

可选的,在利用预设密钥对所述当前数据帧进行解密之前,还包括:

读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;

对所述当前数据帧进行第一完整性校验;

若第一完整性校验通过,利用所述预设密钥对所述当前数据帧进行解密。

可选的,在对所述当前数据帧进行第一完整性校验之后,还包括:

若第一完整性校验未通过,按照非加密数据帧读取数据帧长度,并进行第二完整性校验,若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,在将解密得到的数据存入解析队列之后,还包括:

从网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第二值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,在判断所述帧类型标识是否为第一值之后,还包括:

若所述帧类型标识是第一值,确认所述当前数据帧为非加密数据帧;

读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;

对所述当前数据帧进行第二完整性校验;

若第二完整性校验通过,将所述当前数据帧中的数据内容存入解析队列;

若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,在将所述当前数据帧中的数据内容存入解析队列之后,还包括:

从所述网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第一值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,在根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧之前,还包括:

将各数据帧发送端对应的帧类型标识初始化为第三值,其中,所述第三值表示默认加密帧。

本发明实施例提供了一种通用数据帧解析装置,包括:

判断模块,用于根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧,其中,加密数据帧和非加密数据帧的帧格式不同,所述帧类型标识用于在解析过程中标识所述数据帧发送端发送的数据帧的类型;

解密模块,用于在所述当前数据帧是加密数据帧的情况下,利用预设密钥对所述当前数据帧进行解密,并将解密得到的数据存入解析队列。

可选的,所述预设帧格式是在加密数据帧的头部设置长度为预设字节且取值为预设值的数据;

所述判断模块包括:

第一判断单元,用于判断所述帧类型标识是否为第一值,其中,所述第一值表示确认非加密帧;

读取单元,用于若所述帧类型标识不是第一值,按照所述预设帧格式从网络缓存区读取预设字节的数据;

第二判断单元,用于判断所述预设字节的数据是否为预设值;

确定单元,用于若所述预设字节的数据为预设值,确定所述当前数据帧为加密数据帧。

本发明实施例还提供了一种设备,包括本发明实施例所述的通用数据帧解析装置。

本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如本发明实施例所述的通用数据帧解析方法。

本发明实施例还提供了一种电子设备,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如本发明实施例所述的通用数据帧解析方法。

应用本发明的技术方案,针对scada系统提供一种通用的数据帧解析方法,利用预设帧格式及数据帧发送端对应的帧类型标识,只需一套服务器程序即可支持加密数据帧和非加密数据帧的解析,便于服务器维护。

附图说明

图1是本发明实施例一提供的通用数据帧解析方法的流程图;

图2是本发明实施例二提供的通用数据帧解析方法的具体流程图;

图3是现有技术的数据帧解析架构示意图;

图4是本发明实施例二提供的通用数据帧解析的架构示意图;

图5是本发明实施例三提供的通用数据帧解析装置的结构框图;

图6是本发明实施例五提供的电子设备的结构示意图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义,“多种”一般包含至少两种。

应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。

取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。

下面结合附图详细说明本发明的可选实施例。

实施例一

图1是本发明实施例一提供的通用数据帧解析方法的流程图,如图1所示,该方法包括以下步骤:

s101,根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧,其中,加密数据帧和非加密数据帧的帧格式不同,帧类型标识用于在解析过程中标识数据帧发送端发送的数据帧的类型。

本实施例中,定义帧格式,以从格式上区分加密数据帧和非加密数据帧。预设帧格式可以是在加密数据帧的头部额外设置长度为预设字节且取值为预设值的数据。例如,长度为一个字节,取值为1f,在解析时,若数据帧的第一个字节为1f,则该数据帧很可能是加密数据帧,当然,也可能非加密数据帧的第一个字节恰好是1f,对此,可以通过帧类型标识和/或完整性校验来辅助判断,以保证数据帧的准确解析。

对于scada系统,解析单元面对多个设备(即数据帧发送端),若一个设备发送加密数据帧,则该设备在与解析单元的交互过程中,一直发送加密数据帧。本实施例设置帧类型标识,用于在解析过程中辅助判断待解析的是加密数据帧还是非加密数据帧,以进行相应的具体解析。帧类型标识包括多种取值,不同的取值表示不同的数据帧类型,例如,0表示默认加密帧,1表示确认的加密帧,2表示确认的非加密帧。在解析单元里,针对每个与其建立连接的数据帧发送端,均设置相应的帧类型标识,并且初始值均设置为表示默认加密帧。后续基于判断可知数据帧发送端发送的到底是加密数据帧还是非加密数据帧,并将其帧类型标识设置为相应的值。

s102,若所述当前数据帧为加密数据帧,利用预设密钥对所述当前数据帧进行解密,并将解密得到的数据存入解析队列。

本实施例的技术方案,针对scada系统提供一种通用的数据帧解析方法,利用预设帧格式及数据帧发送端对应的帧类型标识,只需一套服务器程序即可支持加密数据帧和非加密数据帧的解析,便于服务器维护,且解析效率高。

可选的,s101包括:判断所述帧类型标识是否为第一值,其中,所述第一值表示确认非加密帧;若所述帧类型标识不是第一值,按照所述预设帧格式从网络缓存区读取预设字节的数据;判断所述预设字节的数据是否为预设值;若所述预设字节的数据为预设值,确定所述当前数据帧为加密数据帧。

本可选实施方式中,网络缓存区用于缓存待解析的数据帧。帧类型标识表示当前数据帧不是确认的非加密帧,则根据预设帧格式判断当前数据帧是否为加密数据帧。

进一步的,若所述预设字节的数据不是预设值,判断所述帧类型标识是否为第二值,其中,所述第二值表示确认加密帧;若是,则从所述网络缓存区偏移所述预设字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤,以重新解析数据帧;若否,则确定所述当前数据帧为非加密数据帧,并按照非加密数据帧的解析流程进行解析。

本实施方式中,一种情况是,当前数据帧不符合预设帧格式,且帧类型标识表示该帧为确认的加密帧,这是矛盾的,表示预设字节的数据是错误字节,跳过预设字节的数据,重新进行判断,由此实现了错误字节的剔除。另一种情况是,当前数据帧不符合预设帧格式,且帧类型标识表示该帧不是确认的加密帧,由此可知确定该帧是非加密帧,可以按照非加密帧的解析流程进行解析,非加密帧的解析流程请参见后面的说明。

可选的,在利用预设密钥对所述当前数据帧进行解密之前,还包括:按照加密数据帧读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;对所述当前数据帧进行第一完整性校验;若第一完整性校验通过,利用所述预设密钥对所述当前数据帧进行解密。

进一步的,在对所述当前数据帧进行第一完整性校验之后,还包括:若第一完整性校验未通过,按照非加密数据帧读取数据帧长度,并进行第二完整性校验,若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤,以重新解析数据帧。

其中,数据帧中有固定字段来标注该数据帧的长度,利用该字段可以读取到完整的数据帧。为了保证接收的数据帧的准确完整,可以进行完整性校验,例如crc校验,若校验通过,表示数据帧接收正确,若校验未通过,表示数据帧存在错误字节。

本可选实施方式中,按照加密数据帧进行数据帧的读取和校验,校验未通过,确定该数据帧有错误字节,然后按照非加密数据帧进行读取和校验,以验证错误字节,然后偏移一个字节后,重新判断。实现了错误字节的剔除。

在一些实施例中,在s102将解密得到的数据存入解析队列之后,还包括:从网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第二值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。通过上述步骤,以对下一个数据帧进行解析,并且,将帧类型标识置为第二值,表示确认当前数据帧发送端发送加密帧数据。

非加密数据帧的解析流程如下:

在判断所述帧类型标识是否为第一值之后,还包括:若所述帧类型标识是第一值,确认所述当前数据帧为非加密数据帧;读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;对所述当前数据帧进行第二完整性校验,例如crc校验;若第二完整性校验通过,将所述当前数据帧中的数据内容存入解析队列;若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤,以重新解析数据帧。

本实施例中非加密数据帧的校验未通过,表示存在错误字节,通过字节偏移,以舍弃该错误字节,进而实现正确的数据帧解析。

可选的,在将所述当前数据帧中的数据内容存入解析队列之后,还包括:从所述网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第一值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。通过上述步骤,以对下一个数据帧进行解析,并且,将帧类型标识置为第一值,表示确认当前数据帧发送端发送非加密帧数据。

优选的,在根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧之前,将各数据帧发送端对应的帧类型标识初始化为第三值,其中,第三值表示默认加密帧。初始各数据帧发送端的帧类型标识为默认加密帧,也就是说,本发明实施例默认按照加密帧解析,以实现通用的解析流程。

实施例二

本实施例在上述实施例一的基础上,提供了通用数据帧解析方法的示例流程图,与上述实施例相同或相应的术语解释,本实施例不再赘述。本实施例中,在加密数据帧的头部额外增加1个字节的数据,取值为1f,非加密数据帧则不包含这样的数据,数据帧发送端按照上述格式来发送数据帧。帧类型标识flag,取值为0表示默认加密帧,取值为1表示确认加密帧,取值为2表示确认非加密帧。

如图2所示,该方法包括如下步骤:

步骤1:为各数据帧发送端设置帧类型标识flag,并初始化为0,继续步骤2。

步骤2:判断帧类型标识flag是否不等于2,若为真,继续步骤3;若为假,跳至步骤11。

步骤3:从buffer网络缓存区读取第一个字节数据,赋值headbyte,继续步骤4。

步骤4:判断第一个字节数据headbyte是否等于1f,若为真,继续步骤5;若为假,跳至步骤9。

步骤5:按加密数据帧格式,读取加密数据帧长度elengthbyte,并按加密数据帧长度elengthbyte读取完整数据帧,继续步骤6。

步骤6:进行完整加密数据帧校验,若校验通过,继续步骤7;若校验不通过,跳至步骤11。

步骤7:对数据帧进行解密处理,将解密后的数据帧存入数据解析队列,继续步骤8。

步骤8:从buffer网络缓存区偏移elengthbyte字节,帧类型标识置为1,返回步骤2,继续解析下一帧加密数据。

步骤9:判断帧类型标识flag是否等于1,若为真,继续步骤10;若为假,跳至步骤11。

步骤10:从buffer网络缓存区偏移一个字节,返回步骤2,重新解析加密数据。

步骤11:按非加密数据帧格式,读取数据帧长度nlengthbyte,并读取完整帧,继续步骤12。

步骤12:进行完整非加密数据帧校验,若校验通过,继续步骤13;若不通过,跳至步骤15。

步骤13:存入数据解析队列,继续步骤14。

步骤14:从buffer网络缓存区偏移nlengthbyte字节,帧类型标识置为2,返回步骤2,继续解析下一帧加密数据。

步骤15:从buffer网络缓存区偏移一个字节,返回步骤2,重新解析加密数据。

如图3所示,现有技术中,分别利用不同的解析单元,解析各设备发送来的加密数据帧和非加密数据帧。如图4所示,基于上述流程,使用一个通用的解析单元,即可实现加密数据帧和非加密数据帧的解析,便于维护。

实施例三

基于同一发明构思,本实施例提供了一种通用数据帧解析装置,可以用于实现上述实施例所述的通用数据帧解析方法。

图5是本发明实施例三提供的通用数据帧解析装置的结构框图,如图5所示,该装置包括:

判断模块501,用于根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧,其中,加密数据帧和非加密数据帧的帧格式不同,所述帧类型标识用于在解析过程中标识所述数据帧发送端发送的数据帧的类型;

解密模块502,用于在所述当前数据帧是加密数据帧的情况下,利用预设密钥对所述当前数据帧进行解密,并将解密得到的数据存入解析队列。

所述预设帧格式是在加密数据帧的头部设置长度为预设字节且取值为预设值的数据。

可选的,所述判断模块501包括:

第一判断单元,用于判断所述帧类型标识是否为第一值,其中,所述第一值表示确认非加密帧;

第一读取单元,用于若所述帧类型标识不是第一值,按照所述预设帧格式从网络缓存区读取预设字节的数据;

第二判断单元,用于判断所述预设字节的数据是否为预设值;

第一确定单元,用于若所述预设字节的数据为预设值,确定所述当前数据帧为加密数据帧。

可选的,所述判断模块501还包括:

第三判断单元,用于若所述预设字节的数据不是预设值,判断所述帧类型标识是否为第二值,其中,所述第二值表示确认加密帧;

第一偏移处理单元,用于若是,则从所述网络缓存区偏移所述预设字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤;

第二确定单元,用于若否,则确定所述当前数据帧为非加密数据帧,并按照非加密数据帧的解析流程进行解析。

可选的,上述装置还包括:

读取模块,用于在利用预设密钥对所述当前数据帧进行解密之前,读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;

校验模块,用于对所述当前数据帧进行第一完整性校验;若第一完整性校验通过,解密模块502利用所述预设密钥对所述当前数据帧进行解密;若第一完整性校验未通过,按照非加密数据帧读取数据帧长度,并进行第二完整性校验,若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,上述装置还包括:偏移处理模块,用于在将解密得到的数据存入解析队列之后,从网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第二值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,判断模块501还包括:

第三确定单元,用于若所述帧类型标识是第一值,确认所述当前数据帧为非加密数据帧;

第二读取单元,用于读取所述当前数据帧的长度,并按照所述当前数据帧的长度读取完整的当前数据帧;

校验单元,用于对所述当前数据帧进行第二完整性校验;若第二完整性校验通过,将所述当前数据帧中的数据内容存入解析队列;若第二完整性校验未通过,则从所述网络缓存区偏移一个字节,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,判断模块501还包括:第二偏移处理单元,用于在将所述当前数据帧中的数据内容存入解析队列之后,从所述网络缓存区偏移所述当前数据帧的长度,将所述数据帧发送端对应的帧类型标识置为第一值,并返回重新执行判断所述帧类型标识是否为第一值的步骤。

可选的,上述装置还包括:初始化模块,用于在判断模块501根据预设帧格式及数据帧发送端对应的帧类型标识,判断当前数据帧是否为加密数据帧之前,将各数据帧发送端对应的帧类型标识初始化为第三值,其中,所述第三值表示默认加密帧。

上述装置可执行本发明实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明实施例提供的方法。

本实施例还提供一种设备,包括上述通用数据帧解析装置,具体的,该设备可以是scada系统中负责解析数据帧的设备。

实施例四

本实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明实施例所述的通用数据帧解析方法。

实施例五

本实施例提供一种电子设备,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如本发明实施例所述的通用数据帧解析方法。

该电子设备可以是scada系统中负责解析数据帧的设备。

图6是本发明实施例五提供的电子设备的结构示意图,如图6所示,该电子设备包括:一个或多个处理器610以及存储器620,图6中以一个处理器610为例。

该电子设备还可以包括:通信装置630。

处理器610、存储器620和通信装置630可以通过总线或者其他方式连接,图6中以通过总线连接为例。

存储器620作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如本发明实施例中的对通用数据帧解析方法对应的程序指令/模块。处理器610通过运行存储在存储器620中的非易失性软件程序、指令以及模块,从而执行各种功能应用以及数据处理,即实现上述方法实施例的通用数据帧解析方法。

存储器620可以包括存储程序区和存储数据区,其中,存储程序区可存储操作装置、至少一个功能所需要的应用程序;存储数据区可存储根据对帧类型标识和解析数据等。此外,存储器620可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。

通信装置630可接收数据帧发送端发送来的数据帧。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1