基于手机的网络化安全考勤、门禁系统的设计与实现,软硬件协同

时间:2017-06-08 来源:网络

1 前言

门禁系统是最近几年才在国内广泛应用的又一高科技安全设施之一,现已成为现代建筑的智能化标志之一。在越来越注重商业情报和安全的今天,对进出一些重要机关、科研实验室、档案馆、以及关系到国计民生的公用事业单位的控制中心、民航机场等场所的工作人员,给予进出授权控制。这些都使得门禁系统的作用和功能得到进一步扩展和提升。

随着社会电子化智能程度的深入,市面上出现了不同种类的门禁及考勤系统[1][2]:密码门禁系统,刷卡门禁系统,生物识别门禁系统。

密码门禁系统:通过输入密码,系统判断密码正确就驱动电锁,打开门放行。它的优点:只需记住密码,无需携带其他介质。成本最低。缺点:速度慢,输入密码一般需要好几秒中,如果进出的人员过多,需要排队。如果输入错误,还需重新输入,耗时更长。安全性差,旁边的人容易通过手势记住别人的密码,密码容易忘记或者泄露。

刷卡门禁系统:根据卡的种类又分为接触卡门禁系统(磁条卡条码卡)和非接触卡(又叫感应卡射频卡)门禁系统。接触卡门禁系统由于接触而是的卡片容易磨损,使用次数不多,卡片容易损坏等,使用的范围已经越来越少了。非接触IC卡,由于其耐用性性价比好读取速度快安全性高等优势是当前门禁系统的主流。但是人员出入都需要随身携带专用的IC卡,否则无法出入,这也给现代快节奏的生活带来了一些不便。

生物识别门禁系统:根据人体生物特征的不同而识别身份的门禁系统。常见的有:指纹门禁系统(每个人的指纹纹路特征存在差异性),掌型仪门禁系统(每个人的手掌的骨骼形状存在差异性)虹膜门禁系统(每个人的视网膜通过光学扫描存在差异性)人像识别门禁系统(每个人的五官特征和位置不同)等。生物识别门禁系统的优点是:无需携带卡片等介质,重复的几率少,不容易被复制,安全性高。缺点是:成本高。由于生物识别需要比对很多参数特征,比对速度慢,不利于人员人数过多的场合。人体的生物特征会随着环境和时间的变化而变化,因此容易产生拒识率(明明是这个人,但是他的生物特征变了,而认为不是本人),例如:指纹由于季节和干湿度不同而不同,掌型和人像由于年龄的增长而改变,虹膜由于眼部患病而改变等。所以,生物识别门禁系统虽然先进和安全,但是由于他的成本高,应用的范围有限,不是当前门禁系统的主流。

由于以上各种考勤系统都存在各自的缺陷,使得在使用上述考勤技术的时候会给用户带来诸多不便。现在由于具有Wi-Fi功能的手机已日趋普及,因此如果在公司或小区等场合使用带有Wi-Fi功能的手机进行人员的出入登记管理将更加方便。用户不需要任何额外的设备,只需要一部具有Wi-Fi功能的手机即可,不仅使用方便,还将大大降低整个系统的部署成本。

手机中Wi-Fi模块的MAC地址具有唯一性,因此可用于考勤系统,实现人员身份的识别,而且无需使用其他特殊的设备。另外,考勤机与远程服务器端连接时,如果没有一些相应的安全措施,就容易受到攻击而传输错误、伪装的信息。本项目以PIC32 Ethernet Starter KIT为基础,扩充嵌入式Wi-Fi模块,获取手机Wi-Fi发送过来的身份认证信息,采用AES安全算法进行加密,实现操作简单、安全可靠的网络化身份认证门禁系统。

2相关技术和原理

2.1相关技术

2.1.1无线局域网WLAN

无线局域网WLAN是通过无线设备将两台或多台计算机连接在一起构成的网络。最早起源于1970夏威夷大学的ALOHA网络,它是一个双向星型拓扑,整个系统由分布于四个岛屿上的7台计算机之间通过无线的方式与中央计算机连接在一起进行通讯。1997年发布了第一个版本,1999年加了两个补充版本802.11a/b,随后工业界成立了Wi-Fi联盟,致力于解决符合802.11标准的产品的生产和设备兼容性问题。

无线局域网具有如下特点:

♦使用方便:由于没有线缆的限制,用户可以在网络资源附近的便利场所访问这些资源,如家庭、办公室等场所。

♦移动性好:随着越来越多的地方开通无线网,用户甚至可以在工作场所之外随意接入Internet。如:咖啡厅等地方即可便利的通过无线网接入Internet。

♦部署灵活:与有线网络相比,无线网络不需要布线,因此不会受到周围环境的影响。

♦扩展性好:在原有网络基础之上,通过添加AP即可扩展网络。而有线网络除了添加交换机等设备外,还要额外布线,不仅成本提高,而且灵活性差。

♦安全:使用共享密钥加密机制WEP(有线等效加密),WPA、WPA2(Wi-Fi)网络安全存取)等加密机制。

无线局域网的网络类型有:点到点(Ad-hoc)、桥接和分布式三种。

♦点到点:点到点网络允许无线设备互相直接通讯。在通讯范围内的无线设备可以互相被发现并且可以不通过AP直接通讯。这种通讯类型广泛应用于两台计算机,它们不需要通过网络来完成通讯。ad-hoc网络就是这种网络。

♦桥接:桥连接不同类型的网络,无线以太网桥可以连接有线以太网和无线网络,而桥则充当无线局域网的连接点。

♦无线分布式系统:当很难通过线缆在一个网络中将所有访问点都连接在一起的时候,可以用AP作为中继器。

2.1.2 Wi-Fi

Wi-Fi[3]是目前最成功的无线局域网(WLAN)系统,它基于IEEE802.11技术标准,通过近几年的快速发展,基础架构设施已经比较完善,无线接入热点(AP)覆盖已经很广,价格也很便宜。这样的系统可通过个人权限接入无线互连网,并访问本地网络中的其他系统,比如其他计算机,共享打印机和其他类似设备。通常,WLAN的带宽和传输延迟比许多其他类型的用户互联网连接(如ADSL、GPRS和3G)要好得多,因为WLAN既提供访问互联网服务,也提供本地通信服务。Wi-Fi在许多场合访问速度更多是受到共享连接和用户人数的限制,而非技术本身。Wi-Fi的突出优势是传输带宽、技术成熟度、开放的网络协议,以及基础接入产品、设施的完备和广泛覆盖。

2.1.3 AES加密

由于现实生活的实际需要及计算机技术的进步,密码学有了突飞猛进的发展密码学研究领域出现了许多新的课题新的方向。例如,在分组密码领域,DES已无法满足高保密性的要求。美国已征集并选定了Rijndael算法作为新的高级加密标准AES (AdvancedEncryptionStandard)。与3DES相比,AES[4]的安全性更高,算法实现更加灵活、简单。继美国征集AES结束之后,欧洲也开始进行名为NESSIE的密码大计划,其中候选算法中比较著名的两个算法就是IDEA算法和Camellia算法,目前,对这两个算法的研究也仅次AES算法。AES是基于分组的加解密算法,即每次要加密/解密的数据块大小必须是16字节,算法中大量使用移位操作。

AES算法相关概念

分组密码是对称密码体制的发展趋势。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。抵御已知明文的差分和线性攻击,可变长密钥和分组是AES的设计要点。

AES算法结构

AES加密算法主要由4个变换构成:字节代换(Byte—Sub)、行移位变换(ShiftRow)、列混淆变换(MixColumn)以及轮密钥加变换(AddRoundKey),其算法结构如图1所示。图1中InvByteSub、InvShiftRow和InvMixColumn分别表示ByteSub、ShiftRow、和MixColumn的逆变换。

图1 AES加密解密结构图

加密轮变换

AES加密数据块大小最大是256bit,但是密钥大小在理论上没有上限。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。AES加密算法的主体是其实就是加密轮变换,下面依次对以上4个子变换进行分析。

1、ByteSub变换

ByteSub变换对State中的每个字节进行S盒代替变换,变换由两步构成:

(1)求State中各字节的乘法逆。

(2)对(1)所得的结果做仿射变换y=f(x)。

2、ShiftRow变换

ShiftRow变换将State中的行按不同的偏移量循环移位。偏移量以字节为单位,第一行不变,第二行循环左移1个字节,第三行循环左移两个字节,第四行循环左移3个字节。

3、MixColumn变换

MixColumn变换是对状态中各列的混淆变换。在MixCollm1变换中,把一个State的列看作一个32位数据,然后对其进行矩阵乘法变换sj(x)=c(x)·Sj(x),其中c(x)=03x3+01x2+01x+02。

4、AddROundKev变换

AddRoundKey变换将State中的每个字节与本轮子密钥中对应的字节相异或.所得结果即为State的AddRoundKey变换值。加密轮函数可用伪C代码表示为:

Round(State,Roundkey[i])

{

ByteSub(State);

ShiftRow(State);

MixColumn(State);

AddROundKey(State,Roundkey[i]);

}

2.2系统原理

本系统在PIC32 Ethernet Starter KIT硬件基础上,扩充一个嵌入式Wi-Fi模块,构成本地客户端,由PC机作为服务器端。当手机打开WLAN扫描时,即可把唯一的MAC地址发送给客户端,客户端把MAC地址信息用AES算法进行加密,再将加密后的信息通过Ethernet接口发送给远程服务器,由服务器对信息进行解密、识别、匹配,并做出相应处理和应答。

图2系统原理图

图3系统模型图

3硬件设计

3.1 PIC32 Ethernet Starter KIT简介

PIC32 Ethernet Starter Kit[5]是一个非常简单易用,低成本的用于体验PIC3210/100Ethernet等功能的开发工具。PIC32可提供工作频率80MHz的32位MIPS处理器内核、512KB的编程FLASH、32KB的RAM内存以及众多的外围设备。这些设备包括USB控制器、定时器/计数器、串口控制器、A/D转换器以及更多的设备。该板具有大量的I/O接口和电源选项,其中也包括USB电源。它同时还具有与Microchip MPLAB开发软件相兼容的内置编程、调试、下载电路。Cerebot32MX4拥有九个DigilentPmod™外围模块连接器。可连接的DigilentPmod包括H-bridge驱动、模数和数模转换器、蜂鸣器、滑动开关、按键开关、LED指示灯、以及易于连接的转换器。

PIC32 Ethernet Starter Kit实物图如下图4:

图4 PIC32 Ethernet Starter Kit实物图

3.2 380模块简介

EMW-380-C[6]是一款多功能串口转Wi-Fi模块,它内部集成了TCP/IP协议栈和Wi-Fi通讯模块驱动,可用于串口与Wi-Fi无线网络之间的数据传输,可方便的为串口设备增加无线网络接口。可用于串口设备与PC机之间,或者多个串口设备之间的远程通信。

外观机械尺寸如下图5。

图5 EMW-380-C引脚排列顶视图

EMW-380-C实物图如下图6。

图6 EMW-380-C实物图

表1接线说明

No.

FUN.

No.

FUN.

J2

天线接线柱

J3

NG(暂时不使用)

模块上有两个LED灯用来直观地指示模块当前的状态。可以在配制模式下通过命令来获得模块当前的状态。LED功能如下表2.

表2 EMW-380-C LED指示灯状态

名称

颜色

含义

功能

D1

红色

Wi-Fi成功连接指示灯

D2

绿色

系统初始化成功指示灯

常亮:模块初始化正常,正常工作;

常暗:模块未初始化,或处于休眠状态。

表3 EMW-380-C引脚功能

J1引脚

功能

说明

J2引脚

功能

说明

1

Wakeup(IN)

WAKE_UP引脚如果产生下降沿使模块进入休眠状态,上升沿使模块进入正常工

作状态,模块对该引脚有去噪功能,避免非正常信号的干扰。

1

UART_RTS(OUT)

UART接收准备信号,低电平有效

2

/RESET(IN)

将该引脚拉低1μs,可以重新初始化模块

2

UART_CTS(IN)

UART允许发送信号,低电平有效

3

STATUS(IN)

STATUS用来设置模块的工作状态。

3

UART_RXD(IN)

UART数据输入

4

/INT(OUT)

HOST端可以通过查询EMW-380-C的/INT引脚来确定初始化是否完成。当模块加电

后,/INT会保持为高,当初始化完成后,/INT会被拉低,此后设备即可向

EMW-380-C发送命令并进行相关操作了。在EMW-380-C中/INT引脚没有其他功能。

4

UART_TXD(OUT)

UART数据输出

5

GND

模块接地

5

GND

6

NC

未定义,用户无须连接

6

NC

7

NC

7

NC

8

NC

8

NC

9

NC

9

NC

10

NC

10

VDD

模块电源输入

注意:

(1)UART连接包括:UART_TXD,UART_RXD,UART_RTS和UART_CTS。

(2)最简单应用中只需要连接电源和UART_TXD、UART_RXD。

(3)建议连接UART_RTS和UART_CTS来使能UART的硬件流控制。这样,网络阻塞时,模块可以对嵌入式设备发送给UART接口的数据流量进行自动控制。

3.3典型硬件连接与引脚说明

图7 典型UART连接图

系统是通过EMW-380-C Wi-Fi模块实现了系统的WLAN功能的。EMW-380-C Wi-Fi模块是一个软硬件高度封装的嵌入式Wi-Fi(802.11b/g)应用模块。硬件模块由ARM处理器和Wi-Fi射频芯片组成,软件集成了Wi-Fi、TCP/IP、UDP、DHCP等网络协议。模块提供一个UART/SPI串行接口与主MCU相连,在本系统中,即PIC32 Ethernet Starter KIT通过UART与该模块相连(如图7)。并由一个简单的API命令集来实现网络控制和基于802.3帧格式的链路层数据服务。模块支持AP和Ad-Hoc工作模式,并支持RF信道自动选择和WEP加密,适合各种小系统的标准Wi-Fi接入。EMW-380-C Wi-Fi模块具有TCP Server, TCP Client,UDP,UDP广播等多种工作模式,支持Web配置方式,方便用户灵活设定相关配置参数。

该模块有两种工作状态:配置模式和数据透明传输模式。在配置模式下,可以使用EMSP通讯协议来对模块进行操作,配置,简单测试收发数据等。模块的一切工作都处于EMSP命令的控制之下。在数据透明传输模式下,模块将通过UART把接收到的数据封装成TCP/UDP数据包发送到远端,同时也可以将接收到的远端TCP/UDP数据包的数据负载通过UART发送给嵌入式设备。

3.4硬件PCB图

从图8中可以看出,在本系统设计中,PIC32 Ethernet Starter KIT与EMW-380-C模块间的UART只连接了基本的两根线:UART-RXD和UART-TXD。用的是PIC32 Ethernet Starter KIT上的UART1,还有一根RB4连接到该模块的STATUS引脚上。作为该模块的状态检测线。

图8考勤系统客户端硬件PCB图

3.5硬件实物图

从图9中可以看出,左侧为PIC32 Ethernet Starter KIT实物图,右侧为扩展的EMW-380-C Wi-Fi模块。

图9考勤系统客户端硬件实物图

4软件设计

本系统的整个设计包括下位机软件设计和上位机软件设计。下位机主要结合了EMW-380-C Wi-Fi模块中的Wi-Fi技术,以及Microchip TCP/IP栈。而上位机主要结合了TCP/IP的socket编程以及对数据库的操作。

4.1下位机软件设计

图10 考勤系统客户端下位机软件设计

整个下位机的系统设计如上图。首先是对PIC32 Ethernet Starter KIT进行时钟配置,必要外设的配置(定时器,按钮,LED等)。Microchip TCP/IP栈通过处理物理网络端口与应用程序之间交互,为用户提供了一些基本的嵌入式网络应用基础。包括很多用于应用程的通用模块,像HTTP(web服务),STMP(发邮件),SNMP(提供状态和控制),Telnet,TFTP,串口到以太网等。此外,该栈包含了轻量级高性能的TCP和UDP层实现,并且支持IP,ICMP,DHCP,ARP和DNS。而本系统中使用了TCP/IP这部分功能。由于PIC32 Ethernet Starter KIT板子上丰富的资源,我们通过以太网,将PIC32 Ethernet Starter KIT和EMW-380-C Wi-Fi模块组成的考勤系统作为一个客户端。而远程的上位机作为服务器端。当初始化完系统的基本外设后,就要启动EMW-380-C Wi-Fi模块的Wi-Fi功能(见一下内容的详细介绍)。当考勤系统客户端连接到上位机的服务器之后,那么他们之间就可以正常通讯了。

在本系统设计中EMW-380-C Wi-Fi模块提供通用UART读写功能和EMSP协议的处理功能,来实现与PIC32 Ethernet Starter KIT的通讯。EMSP协议是一个与底层无关的通讯协议,只要EMW-380-C Wi-Fi模块与PIC32 Ethernet Starter KIT在硬件上连接好之后,利用EMSP协议提供的简单命令集就可以相互通讯了。PIC32 Ethernet Starter KIT发送给EMW-380-C Wi-Fi模块的数据包格式如下表4。格式中包含一个协议头(8个字节)和数据段(不定长,最大256个字节)。并且EMW-380-C Wi-Fi模块响应PIC32 Ethernet Starter KIT之后,发送给PIC32 Ethernet Starter KIT的数据包格式也是按照表4中的格式。

表4 EMSP数据包格式

headofprotocol

datafield

command

length

result

headchecksum

data

datachecksum

从表4中也可以看出,所有请求和应答都进行了校验和计算,从而保证了数据交换的完整性和可靠性。整个EMSP协议包含12条命令,来完成模块的控制、网络控制和网络通讯。

配置模式下命令的发送与响应实现如下:

按照表4的数据包格式,组装成一个完整的命令之后,把命令数据放入sendbuf缓冲区中,len是发送的数据包长度。

UART_send_buf(sendbuf,len);

DelayMs (1500);//responsehasadelay

if(cmdcode==EMSP_CMD_SCAN_AP)

DelayMs (1500);

if(cmdcode==EMSP_CMD_SET_CONFIG)

DelayMs (1000);

returnrecv_cmd();->recvlen=UART_receive_buf(recvbuf);

在recv_cmd()函数中调用UART_receive_buf函数,将接收到的响应数据包放入recvbuf中,recvlen是响应数据包的长度。之后对响应数据包做进一步的处理。

从实现上来说,EMSP协议中各命令的功能不同,处理时所需要的时间也是不同的。因此每条发送的命令等待响应所需的延迟也是不同的。

EMSP接口函数库

EMSP协议接口函数库提供了一系列API函数,通过调用这些函数可以轻松地在各种嵌入式设备上实现对EMW-380-C Wi-Fi模块的控制和参数配置。我们将这些接口函数库添加到我们的工程中,如下图11为工程中的文件目录结构。

图11 工程目录结构

EMSP接口函数库由标准C编写而成,由以下三个C语言文件及其对应的头文件构成。

1.em380c_hal.c

该代码实现了EMW-380-C模块和嵌入式设备之间的硬件接口。

2.EMSP.c

该代码实现了EMSP命令的协议处理。

3.EMSP_API.c

该代码可用于操控模块的API函数,用户只需要调用这些函数,就可以对模块实现配置和操作。

启动Wi-Fi模块,建立Ad-hoc网络

根据自己的硬件环境实现以上EMSP接口函数库。就可以很容易地使用这些接口函数了。要完成启动Wi-Fi模块,建立Ad-hoc网络这部分功能,首先要配置EMW-380-C与PIC32 Ethernet Starter KIT板子间的接口,即UART的配置。EMW-380-C的UART默认配置为:波特率:115200,数据位:8位,停止位:1位,奇偶校验:无,硬件流控:无。所以可以调用EMSP_API.c文件中的EM380C_Init()函数对EMW-380-C模块进行UART的配置。当硬件接口配置完成后,可以给EMW-380-C模块发送一个EMSP_CMD_GET_VER命令,来测试配置是否成功。成功后将从while循环中跳出来。接着给EMW-380-C模块发送EMSP_CMD_START命令来启动模块。如果想改变EMW-380-C Wi-Fi的一些基本参数,可以通过给该模块发送EMSP_CMD_SET_CONFIG命令。在本系统中,我们的模块的基本网络参数如下:

Wi-Fi Mode:Ad-hoc

Transfer Protocol:TCP

SSID:Microchip

无加密

IP address:192.168.1.5

Net Mask:255.255.255.0

Port Number:8080

通过以太网连接到server

这部分的功能主要用到TCP/IP协议栈的一些API函数。在本系统设计中,我们通过按钮SW1来触发该功能。该功能的实现主要在GenericTCPClient()函数中。当按钮SW1被按下后,考勤系统客户端进入SM_HOME状态,通过调用TCPOpen函数来建立与远程服务器间的socket连接,在本系统中,服务器开启的侦听端口为3000。

客户端与server端的通讯

当考勤系统客户端与服务器成功建立连接之后,考勤系统客户端进入SM_SOCKET_OBTAINED状态。而考勤系统客户端的EMW-380-C Wi-Fi模块在UDP 67端口进行侦听,当手机给EMW-380-C Wi-Fi模块发送DHCP请求时,EMW-380-C Wi-Fi模块就可以获取该手机的MAC地址。EMW-380-C Wi-Fi模块将获取的手机MAC地址通过UART将其主动发送给PIC32 Ethernet Starter KIT。比如PIC32 Ethernet Starter KIT收到如下信息:30 00 10 00 01 00 BE FF 00 1D 0F 31 7E 17 72 9A,则前8字节是MAC地址信息的头部,接着的6字节是MAC地址,最后两字节表示检验和。此时PIC32 Ethernet Starter KIT在SM_SOCKET_OBTAINED状态下将对这16字节数据进行AES加密,然后将这经过加密的16字节数据发送给远程的服务器端。一个应用场景为:上班时,只要与考勤系统客户端建立Ad-hoc点对点连接,然后考勤系统客户端给服务器发送经过加密的MAC地址信息,当服务器端接收到这些加密的信息后,对加密信息进行相应的解密,提取出MAC地址,从而进行身份认证进入公司。下班时,除了与考勤系统客户端建立Ad-hoc点对点连接之外,还要按下考勤系统客户端上的SW2按钮,这样考勤系统客户端给服务器发送了手机的MAC地址和下班的标识信息。这样可以区别此时是上班还是下班。

4.2上位机软件设计

4.2.1数据库设计

  1. 为了演示方便,本系统采用ACCESS2007数据库,建立Mobile_acces_control_system数据库,里面建有两张表Presonnel_Info和RecordList,用来保存公司人员信息。

  2. Presonnel_Info表保存公司人员的姓名和其手机WI-FI模块中的MAC地址(主键),如表5。该表主要是由管理人员录入人员的这两项基本信息。

表5 Presonnel_Info表

Mac_Addr

文本

Staff_Name

文本

  1. RecordList保留每天公司工作人员的上班出入时间记录,系统会先查找Presonnel_Info表来核查你的身份信息,若在Presonnel_Info表中有你的基本信息,系统会主动为你添加你每天的上下班时间记录信息,如表6。

表6 RecordList表

ID

自动编号

Mac_Addr

文本

Staff_Name

文本

In_Time

文本

Out_Time

文本

4.2.2应用程序设计

主要流程概述:应用程序作为服务器端,首先应用程序开启服务器程序(端口设为3000),用线程实现等待客户端的连接,可以接受多个客户端请求。若有客户端连接上,检查传送来的数据包是否合法;利用AES算法对经过加密的身份认证信息进行解密,合法则提取出MAC地址,通过MAC地址到数据库中查找该人员是否为公司人员;若是公司人员则通过数据包信息判断是进入还是出去,记录其出入时间信息。数据库中只保留人员每天的一次上下班记录,若有重复会给出提示,你已经有出或入记录信息。在显示窗口会实时显示每个人员的出入记录。上位机流程如下图12。

图12上位机服务器处理流程

如下图13为我们的PC端服务器界面。当有客户端与我们的服务器端成功建立TCP连接之后,界面的左下角就会显示“客户端连接上”。该服务器端可以显示人员的出入记录。如果只想显示当天的出入记录,则只要点击“显示当天记录”即可。如果有非公司的人员想要进入公司,由于该人员的手机MAC地址并没有在我们的数据库中进行登记,所以将不会通过服务器端的身份认证,从而不会为该人员开门。

图13 服务器端界面

关键词:门禁手机控制考勤网络化

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版