论远程控制系统设计与开发主控端模块设计大学本科毕业论文.docx
《论远程控制系统设计与开发主控端模块设计大学本科毕业论文.docx》由会员分享,可在线阅读,更多相关《论远程控制系统设计与开发主控端模块设计大学本科毕业论文.docx(34页珍藏版)》请在冰豆网上搜索。
论远程控制系统设计与开发主控端模块设计大学本科毕业论文
论远程控制系统设计与开发—主控端模块设计
摘要
随着现今社会计算机的广泛普及以及网络的快速发展给远程控制系统带来了广阔的用武之地,人们可以通过简单的终端机完全控制网络另一端的被控机,从而完成强大的控制功能,获取被控机的任何信息,这种方式被称之为远程控制。
简单远程控制系统由主控端和被控端两部分组成。
主控端用于实施各种对联网计算机的监控操作,被控端对于接收到的数据进行分析,解释并执行。
系统主要可以实现获取被控端信息、被控端系统控制、消息发送等。
本文对远程控制系统原理和主要相关技术作了简单介绍,在进行需求分析之后,详细描述了本系统的被控端的设计与实现,最后表格形式给出测试结果。
关键词:
远程控制C/S模式套接字信息安全
SimpleRemoteControlSystem
——TheDesignofmastercontrolTerminal
Abstract
Withthewideuseofcomputerandtherapiddevelopmentofnetwork,theremotecontrolsystemisusedfarandwide.Justthroughsimplemanipulateoftheterminal,peoplecancompletelycontrolthecomputerontheotherside,includingobtainthesysteminformationofthecomputer,andimplementpowerfulfunctions.Itisso-calledremotecontrol.Thesimpleremotecontrolsystemconsistsoftwopartsincludingcontrollingterminalandcontrolledterminal.Wecanmonitorthecontrolledterminalandimplementsomeoperationaboutcontrollingthecontrolledterminalonthecontrollingmonitor.Thecontrolledterminalisusedforanalyzing,explainingandimplementthereceiveddata.Thesystemcanimplementthefunctionofgettingtheinformationofcontrolledterminal,controlcontrolledterminal,sendingmessages,andsoon.Thepapersimplyintroducesthetheoryofremotecontrolandthemaintechnology.Aftertheanalysis,itdescribesthedesignandimplementofthecontrolledterminal.Atlast,itshowstheresultinformoffigures.
Keywords:
RemotecontrolClient/ServermodeSocketInformationsecurity
1.绪论
因特网的出现及其发展推动了科学技术的各个方面,并使之取得了巨大的进步,利用因特网,可以使远程控制技术得到大范围的应用,从而方便人们的生活。
1.1课题研究背景
随着社会、科技、经济的不断发展,远程控制技术的应用范围也在不断拓展,从最初银行、军事、机要部门等特殊行业领域的应用已经延伸到了今天的电业部门、商业部门、普通工矿企业、道路交通领域、学校教学应用、卫生医疗部门以及宾馆酒店行业等等,其卓越的功能也日益受到各个应用行业的重视和青睐,但是许多远程监控软件都需要配有硬件设备,这不仅使得实际应用的成本升高,而且也使实施应用增加了技术障碍。
虽然有诸多问题的存在,但是我们应该认识到远程控制技术的研究,不仅充分利用了现有资源,拓宽了因特网的利用范围,而且也使远程控制能够减少成本扩大远程化距离,实现任意节点的访问机制,并进入一般的应用领域,比如,进入家庭,人们通过因特网控制家用电器,采用因特网作为远程控制平台,是一项很有前途和潜力的技术,另外它可以应用到设备远程诊断、远程监测、遥控等领域。
通常企业内部或者IT公司的客户技术支持部门都有技术支持业务其任务是通过电话解答疑难问题,努力减少技术人员到现场服务或让用户把设备送到支持中心进行维护。
这种技术支持方式尽管被普遍采用,但效率不高而且大大增加了技术支持成本。
远程控制软件能使技术人员直接操作远程计算机,就像操作本地机器一样,无需用户介入,技术人员既能得到该机器的一手资料,从而加快了问题的解决。
实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。
1.2国内外研究现状
目前,基于因特网的远程控制国内外都有不同程度的研究。
相对来说,由于西方国家在信息技术和计算机控制技术的发展上的优势,他们在研究远程控制方面相对早些,而且有些公司有相关的初级产品问世。
国内由于因特网的飞速发展,近几年也开始积极的研究。
国内外在基于因特网的远程机器人控制方面的研究相对其他领域要多一些。
例如美国伯克立大学研制的是一个通过因特网远程控制的种植花草工业机器人手臂。
拥护通过机器人手臂上的摄像机所传输的图像,对这个花园内进行简单的操作。
这些基于因特网的远程控制系统普遍采用了客户/服务器网络模型,现场采用摄像机来监视,并通过网络发出指令。
当前,由于网络基础设施还不够完善,所以监视图像由于数据量大,其传输时间过长。
即使是采用了数据压缩技术,也仍然有很大的数据量需要传输,因而由此产生的远程控制时间延迟也必然很大。
此外,这类系统普遍采用瘦客户/肥服务器的网络模型,监控端的控制操作功能过于简单,都只是发一些简单的指令,而不能实现一些复杂的必要的逻辑处理功能。
第三,这类系统在处理上由于时间延迟影响现场控制系统不稳定时,仍然采用的执行-等待-执行-等待的单步执行流程,生产设备运行效率相当低下,第四,大量的采用以图像监视为主的方式,虽然可以使得监控人员更能直观的感受到现场情况,便与监控人员的控制;但是我们应该注意到,有些设备的被监控状态是难以用图像方式表示出来的,比如温度、速度、压力这类精确的数值量;此外有些采用图像传输的数据量也可以采用通过数据传输关键数据以在监控端进行实况模拟图,这样就会减少数据量,而使数据传输速度大大提高。
1.3课题研究的主要内容和方法
本课题的研究主要内容主要包括以下几个方面:
1.简单远程控制系统相关理论研究
2.简单远程控制系统总体结构
3.简单远程控制系统的功能模块的设计
4.简单远程控制系统功能模块的编程实现
本软件用C++语言编写,采用的是C/S结构,一个客户端,一个服务器端。
客户端是控制端,服务器端是被控制端。
主要功能就是通过本地计算机,控制远程的另一台计算机的键盘。
主要思路是先用Winsocket建立两边的连接,客户端向服务端发送键码,服务器端得到键码后模拟出按键事件。
1.4主要工作分配
该系统软件是本人与肖星辰同学共同研究开发的,肖星辰同学主要负责被控端的设计与开发,本人主要负责主控端和部分被控端(获取被控端信息)的设计与开发。
本人在系统开发中的具体工作:
1.搜寻与系统开发相关的资料,熟悉C++开发语言。
2.完成主控端与被控端的连接。
3.完成主控端模块的程序代码。
4.与肖星辰同学一起对系统进行调试和测试。
5.归并相关系统开发文档,完成毕业论文的撰写。
2简单远程控制系统相关理论
2.1远程控制系统概述
远程控制软件实际上是一种客户机/服务器程序,服务器程序安装在被控制的计算机端,客户机安装在控制端。
在客户端和服务器端都安装成功之后,客户端在网络上搜寻已经安装了服务器的远程计算机;然后,客户端就发指令获得服务器端的连接指令,两台PC建立起连接,就可以通过网络的互连协议TCP/IP协议进行远端控制。
2.2TCP协议
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。
TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。
应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、XWindows和SMTP)需要高度的可靠性,所以它们使用了TCP。
DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。
TCP基础:
数据传输协议允许创建和维护与远程计算机的连接。
连接两台计算机就可彼此进行数据传输。
如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(远程主机)属性,还要知道进行“侦听”的端口(远程端口)属性,然后调用Connect方法。
如果创建服务器应用程序,就应设置一个收听端口(本地端口)属性并调用Listen方法。
当客户计算机需要连接时就会发生ConnectionRequest事件。
为了完成连接,可调用ConnectionRequest事件内的Accept方法。
建立连接后,任何一方计算机都可以收发数据。
为了发送数据,可调用SendData方法。
当接收数据时会发生DataArrival事件。
调用DataArrival事件内的GetData方法就可获取数据。
2.3UDP协议
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求程序员编程验证。
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。
因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。
相对于FTP或Telnet,这些服务需要交换的信息量较小。
使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
UDP基础:
用户数据文报协议(UDP)是一个无连接协议。
跟TCP的操作不同,计算机并不建立连接。
另外UDP应用程序可以是客户机,也可以是服务器。
为了传输数据,首先要设置客户计算机的LocalPort属性。
然后,服务器计算机只需将RemoteHost设置为客户计算机的Internet地址,并将RemotePort属性设置为跟客户计算机的LocalPort属性相同的端口,并调用SendData方法来着手发送信息。
于是,客户计算机使用DataArrival事件内的GetData方法来获取已发送的信息。
2.4Socket套接字
在远程控制软件中,对于主控机和受控机进行的数据通信所使用的主要技术就是网络编程技术和系统编程技术。
随着计算机网络技术的发展TCP/IP协议,被集成到操作系统内核中时,相当于在操作系统中引入了一种新型的输入/输出操作,操作系统拥护进程与网络的交互作用比用户进程与传统的输入/输出设备互相作用复杂的多。
首先,进行网络操作的两个进程不在同机器上,如何建立它们之间的联系?
其次,有很多种网络协议,如何建立一种通用机制以支持多种协议?
这些都是网络应用变成所要解决的问题。
20世纪80年代初,美国政府的高级研究工程机构ARPA给加利福尼亚大学BERKELEY分校提供了奖金,让他们在UNIX操作系统下实现TCP/IP协议。
在这个项目中,研究人员为TCP/IP网络通信开发了一个应用程序接口API。
这个API就称为SOCKET(套接字)接口,今天SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。
实际上,Socket在计算机中提供了一个通信端口(套接口)。
通过这个端口,一台计算机可以与任何一台具有Socket接口的计算机通信。
通信的借口是套接口,一个套接口是通信的一端,在这一端上可以找到与其对应的一个名字。
一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信域中。
一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越域的界限,但这时一定要执行某种解释程序。
)应用程序在网络上传输,接受的信息都是通过这个套接口来实现。
在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读写操作。
开始使用套接字编程之前,首先必须建立这些概念:
网间进程通讯,服务方式,客户机/服务器模式。
进程通信的概念最初来源与单机系统。
由于每个进程都在自己的地址范围内运行,为保证量相互通信的进程之间既互不干涉又能协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD中的管道(Pipe)、命名管道(NamedPipe)和软中断信号(Signal)、UNIXSystemV的消息(Message)、共享存储区(SharedMemory)和信号量(Semaphore)等,但都仅限于用在本机进程之间的通信。
网间进程通信要解决的是不同计算机进程间的相互通信问题(可把同机进程通信看成是其中的一个特例)。
为此,首先要解决的是网间进程标识问题,同一计算机上,不同进程可以用进程号(ProcessID)作为唯一标识,但在网络环境下,各个计算机独立分配的进程号不能唯一的标识该进程。
例如,计算机甲赋予某进程号48,在乙计算机中也可以存在48号进程,因此,“48号进程”这句话就没有意义了。
其次,操作系统支持的网络协议众多,不同的协议的工作方式不同,地址格式也不一样,因此,网间进程通信还要解决多重协议的识别问题。
在网络分层结构中,各层之间是严格单向依赖的,各个层次的分工和协作集中体现在相邻层之间的界面上。
“服务”是描述相邻层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。
下层是服务提供者,上层是请求服务的用户。
服务的表现形式是原语(Primitive),如系统调用或库函数等。
系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。
在国际标准化组织(ISO)的术语中,网络层及其以下各层又称为通信子网,只是提供点到点的通信,没有程序或进程的概念。
而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制、流量控制、数据排序(报文排序)及连接管理等问题。
为此提供不同的服务方式:
面向连接(虚电路)的服务或无连接的服务。
面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接及终止连接的过程。
在数据传输过程中,各数据分组不携带目的地址,而使用连接号(ConnectID)。
本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。
其中TCP协议就提供面向连接的虚电路。
无连接的服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。
无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。
提供无连接的数据报服务的常用协议是UDP协议。
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式就是客户机/服务器模式(Client/Server)。
即客户向服务发出服务请求,服务接收到请求后,提供相应的服务。
客户机/服务器模式的建立基于以下两点:
首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器式的TCP/IP。
2.4.1基本套接字函数调用
大多数的数据报套接字应用程序都使用一个规定的事件序列来完成客户应用程序与服务器应用程序间的通信,如图2-1所示:
图2-1
首先,客户端和服务器端都要创建一个数据报套接字。
接着,服务器调用bind()函数给套接字分配工人的端口(在开发应用程序时,这个公认的端口通常时指定的。
例如本程序的端口就指定为80)。
这样,客户端和服务器端就使用同一个端口来表示服务器套接字。
一旦服务器将公认的端口分配给了套接字,客户端和服务器端都能使用sendto()和recvfrom()来发送和接收数据报直到完成传输。
然后调用closesocket()来关闭套接字。
下面具体看从给定套接字的一个地址开始的每一步工作时怎样进行的。
2.4.2创建套接字
系统调用socket()函数向应用程序提供套接字手段时的声明如下:
SOCKETPASCALFARsocket(intaf,inttype,intprotocol);
该函数有三个参数,其中参数af指定通信发生的区域,在DOS,Windows系统中支持AF_INET,它时网际网区域。
参数type描述要建立套接字的类型。
也就是指是流式套接字还是数据报套接字。
参数protocol说明该套接字使用的协议,如果该参数为0,则表示使用默认的连接模式。
Socket()函数根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整形套接字句柄。
2.4.3指定本机地址
当一个套接字用socket()创建以后,bind()将套接字地址(主机地址和端口)与所创建的套接字编号联系起来,即将名字赋予套接字。
bind()声明如下:
intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
bind()函数共有三个参数,其中参数s是由socket()函数调用返回的并且未连接的套接字句柄。
参数name是赋给套接字s的本地地址。
参数namelen指参数name的长度,调用成功,返回0;否则返回SOCKET_ERROR。
2.4.4建立套接字连接
建立套接字是要用connect()与accept()。
connect()函数的原型声明如下:
intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);
Connect()共有三个参数,其中s指要建立连接的本届套接字句柄。
参数name指对方套接字地址结构的指针,对方套接字地址长度由参数namelen说明。
如果调有成功,返回0;否则返回SOCKET_ERROR。
Accept()函数原型声明如下:
SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);
该函数也由三个参数,其中参数s为本地套接字句柄,在做accept函数调用的参数前要先调用listen(),参数addr是指向客户方套接字地址结构的指针,用来接收连接实体的地址。
addr的确切格式由套接字创建时建立的地址簇决定。
参数addrlen为客户方套接字地址的长度。
如果调用成功,accept()函数返回一个SOCKET类型的值。
否则返回INVALID_SOCKET。
Socket(),bind(),connect(),accept()这四个套接字系统调用可以晚上一个完全的通信建立,包括协议,本地主机地址和端口,目的地址和端口。
socket()指定协议元,他的用法与是否为客户机和服务器,是否面向连接无关,bind()指定本机地址和端口号,时面向连接的。
在服务器方必须调用bind()函数;
2.4.5监听连接
建立连接以后,服务器端要调用listen()函数,表明愿意接收连接,listen()要在accept()之前调用,原函数声明如下:
intPASCALFARlisten(SOCKETs,intbacklog);
该函数有两个参数,参数s标志一个本地已建立单尚未连接的套接字句柄,服务器愿意从它上面接收请求。
参数backlog表示请求连接队列的最大长度,用于限制排队的请求个数,目前最大值为5。
如果调用成功,listen()函数返回0;否则返回SOCKET_ERROR。
2.4.6数据传输
当连接建立以后,就可以传输数据了,通常调用send()和recv()函数。
send()函数原型声明如下:
intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);
共有四个参数,其中s为已经连接的本地套接字句柄。
buf指向存有发送数据的缓冲区指针,长度有len指定。
flags智利队传输控制方式,如是否发送带外数据等。
如果调用成功,返回总发送的字节数;否则,返回SOCKET_ERROR。
Recv()函数调用用于在参数s指定的已经连接的数据报或流套接字上接收输入数据,原型声明如下:
IntPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);
参数的意义同send();
2.4.7关闭套接字
closesocket()关闭套接字s并释放分配给该套接字的资源,cosesocket()函数原型声明如下:
BOOLPASCALFARclosesocket(SOCKETs);
该函数只有一个参数s,指待关闭的套接字句柄。
如果调用成功,返回0,否则返回SOCKET_ERROR。
3Windows的消息系统
Windows程序时基于一种事件驱动的编程模式,这就意味着应用程序所要做的大部分工作时随着Windows消息的变化而进行的。
在本程序的实现过程中,涉及大量的系统消息处理和自定义消息的处理。
因此,用到如何使用处理C++类的消息。
3.1消息的种类
应用程序所要做的每项工作几乎都是基于处理Windows消息的,这些消息以三种基本形式出现:
常用的Windows、控件通知和命令。
Windows消息的ID通常加上前缀WM_,例如WM_QUIT。
这些前缀为WM_的消息代表发生在应用程序中的窗口和视图处理消息(MFC为这些消息中的绝大部分提供了默认的操作)。
控件消息是由子窗口传向主窗口的WM_COMMAND消息。
例如,只要编辑控件的当前内容被改变,它就会传递一个EN_CHANGE消息到主窗口(通常是对话框)。
Windows消息控件通知通常由窗口对象来处理,即由类CWnd所派生的对象处理。
命令