《基于嵌入式系统的聊天程序设计.doc》由会员分享,可在线阅读,更多相关《基于嵌入式系统的聊天程序设计.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.*课程设计报告书设计名称: 基于嵌入式系统的聊天程序设计 课程名称: 嵌入式系统开发 摘要随着IT技术的日益发展,嵌入式设备的功能越来越强大。 嵌入式设备决不再只是充当一个小小的个人信息管理工具了,更重要的是可以上网浏览、收发邮件,在线聊天等。然而就目前国内市场来说,并不是所有的嵌入式设备都具备以上所有的功能,即使具备,也可能由于缺乏相应的服务而不能实现。但可以预见,嵌入式设备发展的趋势和潮流就是计算、通信、网络、存储等功能的融合。目前市场上大多数的嵌入式系统都是商业化产品,价格昂贵,因此在开发过程中有必要使用一个模拟器,使得在PC上可以模拟一个嵌入式设备。在Pc机上可以方便的开发和测试程序
2、,并且可以帮助工程师快速的进行分析和改进,提高了工作效率和降低了项目的开发成本。在嵌入式操作系统的领域中,Linux以其特有的魅力得到了众多开发商的亲睐。Linux这些特性包括可以移植到多个同结构的CPU和硬件平台上,有很好的稳定性以及各种性能的升级能力。嵌入式linux在电子行业的应用很广泛,学习嵌入式linux显得非常重要。这次课程设计的主要目的是检验上学期学习linux后的效果。通过基础题的代码编写,熟悉linux C语言编程技巧。通过完成聊天程序的设计,熟悉linux底层编程。利用QT设计界面,缩短开发时间。关键字:嵌入式linux;基础题;聊天程序;QT 一、引言1二、 系统分析22
3、.1开发背景22.2聊天程序的基本需求22.3需实现的主要功能2三、需求分析33.1 QT设计33.1.1 客户端QT界面设计43.2服务器端和客户端的数据传输方式43.3 服务器端功能设计53.4客户端功能设计5四、总体设计54.1 总体功能5五、 详细设计65.1 功能分析和描述65.2 客户端功能模块65.2.1 连接服务器65.2.2发送消息功能65.2.3接收消息模块75.3 服务器功能模块8六、代码实现86.1 客户端代码86.1.1 QT构造和析构函数86.1.2 创建套接字106.1.3 创建线程116.2 服务器端代码11七、功能的实现过程13八、总结13一、引言随着IT(信
4、息)技术的飞速发展,特别是互联网的迅速普及,3C(计算机、通讯、消费电子)合一的加速,数字化时代已经来临。嵌入式系统是数字化时代的一大主流产品,世界各国在此领域开始了激烈竞争,以争取获得主导地位。嵌入式系统是数字化产品的核心。为适应嵌入式分布处理结构和应用上网需求,面向21世纪的嵌入式系统要求配备标准的一种或多种网络通信接口。针对外部联网要求,嵌入设备必需配有通信接口,相应需要TCPIP协议族软件支持;由于家用电器相互关联(如防盗报警、灯光能源控制、影视设备和信息终端交换信息)及实验现场仪器的协调工作等要求,新一代嵌入式设备还需具备IEEEl394、USB、Bluetooth或Ir DA通信接
5、口,同时也需要提供相应的通信组网协议软件和物理层驱动软件。为了支持应用软件的特定编程模式,如Web或无线Web编程模式,还需要相应的浏览器,如HTML、WML等。可以想象,如果一个体积很小的嵌入式系统能够进行在线聊天,HrrP通信,这将是会一件充满意义的事情。但是现在大多数的嵌入式系统都是商业化产品,价格昂贵。所以嵌入式系统开发前期投入比较大,开发工具投入高。为了改变这种状况,有必要设计一个模拟器,使得在PC上可以模拟一个嵌入式设备。在PC机上可以方便的开发和测试程序,并且可以帮助工程师快速的进行分析和改进,提高了工作效率和降低了项目的开发成本。随着自由软件理念日益为大众广为接受,一批自由软件
6、在IT的各个领域取得了巨大成功,Linux是其中最具代表性的一个。其自由、开放的特性吸引了大批软件厂商和独立开发人员。多年的发展和业界同仁的共同努力已使其成为高效、稳定、低成本的操作系统。而且由于Linux开放源代码,任何人都可以对其进行裁减、修改,以适应自行开发的需要。2、 系统分析2.1开发背景IRC(Intemet Relay Chat,网络中继聊天)协议用于文本交谈被设计出来已经有许多年了。IRc协议是基于客户服务器模型的,可以很好地分布式地在许多机器上运行。一个典型的设置涉及一个进程(服务器),它作为中心点接受客户(或其它服务器)的连接,并且实现要求的消息传送多元技术和其它的功能。这
7、种分布模型,由于它要求每个服务器都拥有全局状态信息,限制了一个网络所能达到的最大规模。因此是此协议最令人不能容忍的问题。现存的网络能够以难以置信的速度持续增长,我们必须感谢硬件制造商们给了我们比以往更加强大的系统。IRC协议本身就是个电话会议系统(虽然使用的是CS模式),所以非常适合分布式的多个机器上使用。一个典型的建立包括一个单一的处理器(服务器)形成一个中心节点,客户机(或其他服务器)连接这个节点去获取消息或发送,群发等功能。IRC协议已经在使用TCPIP网络协议的系统中应用了。虽然TCPIP协议并不是必须的,但是现在IRC操作仅使用在这个方面。2.2聊天程序的基本需求1、在QT(或min
8、iGUI)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。2、QT(或miniGUI)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。2.3需实现的主要功能(1) 客户端输入服务器IP和端口号。(2) 服务器必须成功启动。(3) 每一个客户端可以寻找服务器,并且与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 通信的内容可以显示在面板上。(6) 利用QT设计界面,并下载到MagicARM2410上面。三、需求分析3.1 QT设计QT设计编写和调试阶段使用周立功MagicARM2410箱子提供
9、的QT for PC编译器,运行测试阶段使用QT for ARM编译器。使用QT for PC阶段编译程序的步骤如下(以编译hello.cpp程序为例):(1)进入/x86-qtopia目录,运行set-env脚本,设置环境变量。$ . set-env(2)进入hello目录,然后用progen工具生成工程文件hello.pro。$ cd hello$ vi hello.cpp$ progen t app.t o hello.pro(3)使用tmake工具,生成hello工程的Makefile文件。$ tmake -o Makefile hello.pro(4)修改Makefile文件,在LI
10、BS变量中增加需要用到的库,然后输入make命令编译。LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc+$ make(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。$ cd /zylinux/x86-qtopia$ . set-env$ cd hello$ ./hello qws如果要将Hello程序发布到MagicARM2410上运行,还需进行以下工作:(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。$ cd /zylinux/arm-qtopia$ cp
11、av /zylinux/x86-qtopia/hello (7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。$ . set-env$ cd hello$ tmake -o Makefile hello.pro(8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。(9)插入USB鼠标和USB键盘,启动MagicARM2410。启动Qtopia的终端,运行hello程序。利用同样的编译方法,客户端QT程序进行编译和调试。3.1.1 客户端QT界面设计客户端
12、QT需要以下基本组件:(1)两个QEditLine,一个用于输入服务器IP地址(可读可写),另一个用于输入服务器端口号(可读可写)。(2)三个按钮,一个用于连接服务器,另一个用于发送消息,最后一个用于清空发送区域数据。(3)四个标签,用于显示不用组件的内容。(4)两个MultiLineedit,一个用于显示通信内容(只读),一个作为发送区域(可读可写)。3.2服务器端和客户端的数据传输方式 服务器端和客户端的数据是用TCP套接字来传输的。IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。端口号与IP地址的组合得出一个网络套接字。客户端使用linux C 函数socket建
13、立到服务器的套接字连接。 当套接字连接socket建立后,可以利用linux C语言中的send函数和recv函数来实现简单的发送和接收消息。3.3 服务器端功能设计由于时间有限,服务器并没有用QT来编写界面,只是实现一个简单的控制程序。服务器主要实现有:(1)创建套接字(2)对套接字、IP地址和端口号进行绑定(3)进行监听(4)等待客户端的连接(5)对客户端接收和发送数据3.4客户端功能设计客户端使用QT设计界面,客户端实现的功能如下: (1)创建套接字 (2)连接服务器 (3)与服务器通信四、总体设计4.1 总体功能根据对需求所做的分析,聊天程序需要实现的基本功能应包括以下几个方面:(1)
14、 客户端输入服务器IP和端口号。(2) 服务器必须成功启动。(3) 每一个客户端可以寻找服务器,并且与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 通信的内容可以方便查看。 使用QT设计的界面简洁,大方,操作简单,方便,容易上手,用户可以快速掌握操作流程。五、 详细设计5.1 功能分析和描述 聊天工具包括两大功能模块:客户端和服务器端。具体实现的功能创建套接字、连接通信、接收数据显示和发送数据。5.2 客户端功能模块5.2.1 连接服务器连接服务器之前需要解析服务器地址、创建套接字、设置sockaddr_in 结构体中相关参数。5.2.2发送消息功能连接功能是开始聊天前必须进行的
15、步骤,连接成功之后,就可以进行发送消息了。发送消息功能流程图如图2-5所示: 图2-5 发送消息功能流程图5.2.3接收消息模块连接成功后,就可以接收服务器发送过来的数据。5.3 服务器功能模块 服务器的设计并没有使用QT编写界面,服务器端实现的功能有: 图2-8 服务器模块流程图六、代码实现6.1 客户端代码6.1.1 QT构造和析构函数EditDemo:EditDemo( QWidget *parent, const char *name):QWidget(parent, name)QGridLayout *grid = new QGridLayout(this, 6, 3, 0, 0);
16、/IP addrQLabel *label1 = new QLabel( IP Addr:, this);grid-addWidget( label1, 0, 0 );edit_ip = new QLineEdit(this); edit_ip-setText(127.0.0.1);grid-addWidget( edit_ip, 0, 1 );/Server PortQLabel *label2 = new QLabel( Server Port:, this);grid-addWidget( label2, 1, 0);edit_port = new QLineEdit(this); ed
17、it_port-setText(4321);grid-addWidget( edit_port, 1, 1);QPushButton *btn = new QPushButton(Connect, this); /*add the connect button*/ grid-addWidget( btn, 2, 1); /*add the button*/connect(btn, SIGNAL(clicked(), this, SLOT(ButtonConnect(); /multiline input modeQLabel *label3 = new QLabel( Contract Are
18、a:, this);grid-addWidget(label3, 3, 0);multiedit_contract = new QMultiLineEdit(this); multiedit_contract-setReadOnly(1);/set read only grid-addWidget(multiedit_contract,3,1); QLabel *label4 = new QLabel( Send Area:, this);grid-addWidget(label4, 4, 0);multiedit_send = new QMultiLineEdit(this); grid-a
19、ddWidget(multiedit_send,4,1);QPushButton *button_send = new QPushButton(Send, this); /*add the send button*/ grid-addWidget( button_send, 5, 0); connect(button_send, SIGNAL(clicked(), this, SLOT(ButtonSend(); QPushButton *button_clear = new QPushButton(Clear, this); /*add the clear button*/ grid-add
20、Widget( button_clear, 5, 1); connect(button_clear, SIGNAL(clicked(), this, SLOT(ButtonClear(); EditDemo:EditDemo()if(socket_flag = 1)/*if create socket success*/ close(sockfd); /*Close the socket*/ printf(Close the socketn);6.1.2 创建套接字void EditDemo:CreateSocket(void)/*地址解析函数*/host = gethostbyname(ed
21、it_ip-text();/*创建socket*/sockfd = socket(AF_INET,SOCK_STREAM,0);/*设置sockaddr_in 结构体中相关参数*/serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(atoi(edit_port-text();serv_addr.sin_addr = *(struct in_addr *)host-h_addr);bzero(&(serv_addr.sin_zero), 8); 6.1.3 创建线程void *task(void *arg) int recvbyte
22、s = 0; char bufBUFFER_SIZE= 0; arg = arg; while(1) if(recvbytes = recv(sockfd, buf, BUFFER_SIZE, 0) 0) multiedit_contract-append(Server said: +(QString)buf); void CreateThread(void)int result = 0;result = pthread_create(&thread1, NULL, task, (void *)0); /*Create Thread*/6.2 服务器端代码#define PORT 4321#d
23、efine BUFFER_SIZE 1024#define MAX_QUE_CONN_NM 5int main()struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;unsigned int sendbytes = 0;int sockfd, client_fd;char bufBUFFER_SIZE;/*建立socket连接*/sockfd = socket(AF_INET,SOCK_STREAM,0);/*设置sockaddr_in 结构体中相关参数*/server_sockaddr.sin
24、_family = AF_INET;server_sockaddr.sin_port = htons(PORT);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(&(server_sockaddr.sin_zero), 8);int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i);/*绑定函数bind*/ibind(sockfd, (struct sockaddr *)&server_sockaddr, size
25、of(struct sockaddr);/*调用listen函数*/listen(sockfd, MAX_QUE_CONN_NM);/*调用accept函数,等待客户端的连接*/client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size);/*调用recv函数接收客户端的请求*/ while(1) memset(buf , 0, sizeof(buf);recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0); if(recvbytes 0) printf(Recei
26、ved a message: %sn, buf); printf(Send a message: %sn, buf); (sendbytes = send(client_fd, buf, strlen(buf), 0); close(sockfd);exit(0);七、功能的实现过程 依照上节所设计的结构和过程,可以很方便的实现出聊天功能。下面就是一个聊天过程的执行情况。聊天的现实过程为: A:Hello B:Hello A(B): A:Bye B:Bye其中A,B是虚拟的聊天者。 在实现过程中,这个聊天过程就要借助一个服务器来实现,聊天的发送端要先跟这个服务器通信,然后由这个服务器与接收方进行通信,最后完成聊天过程。八、总结通过这次嵌入式linux程序设计和编程,对linux的编程有了更深的了解。特别是对QT编程有了很大的进步,通过测试,编写的程序都能顺利运行。由于时间紧迫,对服务器部分没有用QT来设计界面,只是编写客户端的QT程序,并成功仿真运行。