基于嵌入式系统聊天程序设计.docx

上传人:b****5 文档编号:11941413 上传时间:2023-04-16 格式:DOCX 页数:16 大小:152.50KB
下载 相关 举报
基于嵌入式系统聊天程序设计.docx_第1页
第1页 / 共16页
基于嵌入式系统聊天程序设计.docx_第2页
第2页 / 共16页
基于嵌入式系统聊天程序设计.docx_第3页
第3页 / 共16页
基于嵌入式系统聊天程序设计.docx_第4页
第4页 / 共16页
基于嵌入式系统聊天程序设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于嵌入式系统聊天程序设计.docx

《基于嵌入式系统聊天程序设计.docx》由会员分享,可在线阅读,更多相关《基于嵌入式系统聊天程序设计.docx(16页珍藏版)》请在冰豆网上搜索。

基于嵌入式系统聊天程序设计.docx

基于嵌入式系统聊天程序设计

课程设计报告书

设计名称:

基于嵌入式系统的聊天程序设计

课程名称:

嵌入式系统开发

摘要

随着IT技术的日益发展,嵌入式设备的功能越来越强大。

嵌入式设备决不再只是充当一个小小的个人信息管理工具了,更重要的是可以上网浏览、收发邮件,在线聊天等。

然而就目前国内市场来说,并不是所有的嵌入式设备都具备以上所有的功能,即使具备,也可能由于缺乏相应的服务而不能实现。

但可以预见,嵌入式设备发展的趋势和潮流就是计算、通信、网络、存储等功能的融合。

目前市场上大多数的嵌入式系统都是商业化产品,价格昂贵,因此在开发过程中有必要使用一个模拟器,使得在PC上可以模拟一个嵌入式设备。

在Pc机上可以方便的开发和测试程序,并且可以帮助工程师快速的进行分析和改进,提高了工作效率和降低了项目的开发成本。

在嵌入式操作系统的领域中,Linux以其特有的魅力得到了众多开发商的亲睐。

Linux这些特性包括可以移植到多个同结构的CPU和硬件平台上,有很好的稳定性以及各种性能的升级能力。

嵌入式linux在电子行业的应用很广泛,学习嵌入式linux显得非常重要。

这次课程设计的主要目的是检验上学期学习linux后的效果。

通过基础题的代码编写,熟悉linuxC语言编程技巧。

通过完成聊天程序的设计,熟悉linux底层编程。

利用QT设计界面,缩短开发时间。

关键字:

嵌入式linux;基础题;聊天程序;QT

 

一、引言1

二、系统分析2

2.1开发背景2

2.2聊天程序的基本需求2

2.3需实现的主要功能2

三、需求分析3

3.1QT设计3

3.1.1客户端QT界面设计4

3.2服务器端和客户端的数据传输方式4

3.3服务器端功能设计5

3.4客户端功能设计5

四、总体设计5

4.1总体功能5

五、详细设计6

5.1功能分析和描述6

5.2客户端功能模块6

5.2.1连接服务器6

5.2.2发送消息功能6

5.2.3接收消息模块7

5.3服务器功能模块8

六、代码实现8

6.1客户端代码8

6.1.1QT构造和析构函数8

6.1.2创建套接字10

6.1.3创建线程11

6.2服务器端代码11

七、功能的实现过程13

八、总结13

 

一、引言

随着IT(信息)技术的飞速发展,特别是互联网的迅速普及,3C(计算机、通讯、消费电子)合一的加速,数字化时代已经来临。

嵌入式系统是数字化时代的一大主流产品,世界各国在此领域开始了激烈竞争,以争取获得主导地位。

嵌入式系统是数字化产品的核心。

为适应嵌入式分布处理结构和应用上网需求,面向21世纪的嵌入式系统要求配备标准的一种或多种网络通信接口。

针对外部联网要求,嵌入设备必需配有通信接口,相应需要TCP/IP协议族软件支持;由于家用电器相互关联(如防盗报警、灯光能源控制、影视设备和信息终端交换信息)及实验现场仪器的协调工作等要求,新一代嵌入式设备还需具备IEEEl394、USB、Bluetooth或IrDA通信接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件。

为了支持应用软件的特定编程模式,如Web或无线Web编程模式,还需要相应的浏览器,如HTML、WML等。

可以想象,如果一个体积很小的嵌入式系统能够进行在线聊天,HrrP通信,这将是会一件充满意义的事情。

但是现在大多数的嵌入式系统都是商业化产品,价格昂贵。

所以嵌入式系统

开发前期投入比较大,开发工具投入高。

为了改变这种状况,有必要设计一个模

拟器,使得在PC上可以模拟一个嵌入式设备。

在PC机上可以方便的开发和测试

程序,并且可以帮助工程师快速的进行分析和改进,提高了工作效率和降低了项

目的开发成本。

随着自由软件理念日益为大众广为接受,一批自由软件在IT的各个领域取得了巨大成功,Linux是其中最具代表性的一个。

其自由、开放的特性吸引了大批软件厂商和独立开发人员。

多年的发展和业界同仁的共同努力已使其成为高效、稳定、低成本的操作系统。

而且由于Linux开放源代码,任何人都可以对其进行裁减、修改,以适应自行开发的需要。

 

2、系统分析

2.1开发背景

IRC(IntemetRelayChat,网络中继聊天)协议用于文本交谈被设计出来已经有许多年了。

IRc协议是基于客户服务器模型的,可以很好地分布式地在许多机器上运行。

一个典型的设置涉及一个进程(服务器),它作为中心点接受客户(或其它服务器)的连接,并且实现要求的消息传送/多元技术和其它的功能。

这种分布模型,由于它要求每个服务器都拥有全局状态信息,限制了一个网络所能达到的最大规模。

因此是此协议最令人不能容忍的问题。

现存的网络能够以难以置信的速度持续增长,我们必须感谢硬件制造商们给了我们比以往更加强大的系统。

IRC协议本身就是~个电话会议系统(虽然使用的是C/S模式),所以非常适合分布式的多个机器上使用。

一个典型的建立包括一个单一的处理器(服务器)形成一个中心节点,客户机(或其他服务器)连接这个节点去获取消息或发送,群发等功能。

IRC协议已经在使用TCP/IP网络协议的系统中应用了。

虽然TCP/IP协议并不是必须的,但是现在IRC操作仅使用在这个方面。

2.2聊天程序的基本需求

1、在QT(或miniGUI)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。

2、QT(或miniGUI)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。

2.3需实现的主要功能

(1)客户端输入服务器IP和端口号。

(2)服务器必须成功启动。

(3)每一个客户端可以寻找服务器,并且与服务器建立连接。

(4)客户端和服务器可以实现通信。

(5)通信的内容可以显示在面板上。

(6)利用QT设计界面,并下载到MagicARM2410上面。

三、需求分析

3.1QT设计

QT设计编写和调试阶段使用周立功MagicARM2410箱子提供的QTforPC编译器,运行测试阶段使用QTforARM编译器。

使用QTforPC阶段编译程序的步骤如下(以编译hello.cpp程序为例):

(1)进入/x86-qtopia目录,运行set-env脚本,设置环境变量。

$.set-env

(2)进入hello目录,然后用progen工具生成工程文件hello.pro。

$cdhello

$vihello.cpp

$progen–tapp.t–ohello.pro

(3)使用tmake工具,生成hello工程的Makefile文件。

$tmake-oMakefilehello.pro

(4)修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入make命令编译。

LIBS=$(SUBLIBS)-L$(QTDIR)/lib-lqte-lm-lstdc++

$make

(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。

$cd/zylinux/x86-qtopia

$.set-env

$cdhello

$./hello–qws

如果要将Hello程序发布到MagicARM2410上运行,还需进行以下工作:

(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。

$cd/zylinux/arm-qtopia

$cp–av/zylinux/x86-qtopia/hello

(7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。

$.set-env

$cdhello

$tmake-oMakefilehello.pro

(8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。

(9)插入USB鼠标和USB键盘,启动MagicARM2410。

启动Qtopia的终端,运行hello程序。

利用同样的编译方法,客户端QT程序进行编译和调试。

3.1.1客户端QT界面设计

客户端QT需要以下基本组件:

(1)两个QEditLine,一个用于输入服务器IP地址(可读可写),另一个用于输入服务器端口号(可读可写)。

(2)三个按钮,一个用于连接服务器,另一个用于发送消息,最后一个用于清空发送区域数据。

(3)四个标签,用于显示不用组件的内容。

(4)两个MultiLineedit,一个用于显示通信内容(只读),一个作为发送区域(可读可写)。

3.2服务器端和客户端的数据传输方式

服务器端和客户端的数据是用TCP套接字来传输的。

IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。

端口号与IP地址的组合得出一个网络套接字。

客户端使用linuxC函数socket建立到服务器的套接字连接。

当套接字连接socket建立后,可以利用linuxC语言中的send函数和recv函数来实现简单的发送和接收消息。

3.3服务器端功能设计

由于时间有限,服务器并没有用QT来编写界面,只是实现一个简单的控制程序。

服务器主要实现有:

(1)创建套接字

(2)对套接字、IP地址和端口号进行绑定

(3)进行监听

(4)等待客户端的连接

(5)对客户端接收和发送数据

3.4客户端功能设计

客户端使用QT设计界面,客户端实现的功能如下:

(1)创建套接字

(2)连接服务器

(3)与服务器通信

四、总体设计

4.1总体功能

根据对需求所做的分析,聊天程序需要实现的基本功能应包括以下几个方面:

(1)客户端输入服务器IP和端口号。

(2)服务器必须成功启动。

(3)每一个客户端可以寻找服务器,并且与服务器建立连接。

(4)客户端和服务器可以实现通信。

(5)通信的内容可以方便查看。

使用QT设计的界面简洁,大方,操作简单,方便,容易上手,用户可以快速掌握操作流程。

五、详细设计

5.1功能分析和描述

聊天工具包括两大功能模块:

客户端和服务器端。

具体实现的功能创建套接字、连接通信、接收数据显示和发送数据。

5.2客户端功能模块

5.2.1连接服务器

连接服务器之前需要解析服务器地址、创建套接字、设置sockaddr_in结构体中相关参数。

5.2.2发送消息功能

连接功能是开始聊天前必须进行的步骤,连接成功之后,就可以进行发送消息了。

发送消息功能流程图如图2-5所示:

图2-5发送消息功能流程图

5.2.3接收消息模块

连接成功后,就可以接收服务器发送过来的数据。

5.3服务器功能模块

服务器的设计并没有使用QT编写界面,服务器端实现的功能有:

图2-8服务器模块流程图

六、代码实现

6.1客户端代码

6.1.1QT构造和析构函数

EditDemo:

:

EditDemo(QWidget*parent,constchar*name):

QWidget(parent,name)

{

QGridLayout*grid=newQGridLayout(this,6,3,0,0);

//IPaddr

QLabel*label1=newQLabel("IPAddr:

",this);

grid->addWidget(label1,0,0);

edit_ip=newQLineEdit(this);

edit_ip->setText("127.0.0.1");

grid->addWidget(edit_ip,0,1);

//ServerPort

QLabel*label2=newQLabel("ServerPort:

",this);

grid->addWidget(label2,1,0);

edit_port=newQLineEdit(this);

edit_port->setText("4321");

grid->addWidget(edit_port,1,1);

QPushButton*btn=newQPushButton("Connect",this);/*addtheconnectbutton*/

grid->addWidget(btn,2,1);/*addthebutton*/

connect(btn,SIGNAL(clicked()),this,SLOT(ButtonConnect()));

//multilineinputmode

QLabel*label3=newQLabel("ContractArea:

",this);

grid->addWidget(label3,3,0);

multiedit_contract=newQMultiLineEdit(this);

multiedit_contract->setReadOnly

(1);//setreadonly

grid->addWidget(multiedit_contract,3,1);

QLabel*label4=newQLabel("SendArea:

",this);

grid->addWidget(label4,4,0);

multiedit_send=newQMultiLineEdit(this);

grid->addWidget(multiedit_send,4,1);

QPushButton*button_send=newQPushButton("Send",this);/*addthesendbutton*/

grid->addWidget(button_send,5,0);

connect(button_send,SIGNAL(clicked()),this,SLOT(ButtonSend()));

QPushButton*button_clear=newQPushButton("Clear",this);/*addtheclearbutton*/

grid->addWidget(button_clear,5,1);

connect(button_clear,SIGNAL(clicked()),this,SLOT(ButtonClear()));

}

EditDemo:

:

~EditDemo()

{

if(socket_flag==1)/*ifcreatesocketsuccess*/

{

close(sockfd);/*Closethesocket*/

printf("Closethesocket\n");

}

}

6.1.2创建套接字

voidEditDemo:

:

CreateSocket(void)

{

/*地址解析函数*/

host=gethostbyname(edit_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=*((structin_addr*)host->h_addr);

bzero(&(serv_addr.sin_zero),8);

}

6.1.3创建线程

void*task(void*arg)

{

intrecvbytes=0;

charbuf[BUFFER_SIZE]={0};

arg=arg;

while

(1)

{

if((recvbytes=recv(sockfd,buf,BUFFER_SIZE,0))>0)

{

multiedit_contract->append("Serversaid:

"+(QString)buf);

}

}

}

voidCreateThread(void)

{

intresult=0;

result=pthread_create(&thread1,NULL,task,(void*)0);/*CreateThread*/

}

6.2服务器端代码

#definePORT4321

#defineBUFFER_SIZE1024

#defineMAX_QUE_CONN_NM5

intmain()

{

structsockaddr_inserver_sockaddr,client_sockaddr;

intsin_size,recvbytes;

unsignedintsendbytes=0;

intsockfd,client_fd;

charbuf[BUFFER_SIZE];

/*建立socket连接*/

sockfd=socket(AF_INET,SOCK_STREAM,0);

/*设置sockaddr_in结构体中相关参数*/

server_sockaddr.sin_family=AF_INET;

server_sockaddr.sin_port=htons(PORT);

server_sockaddr.sin_addr.s_addr=INADDR_ANY;

bzero(&(server_sockaddr.sin_zero),8);

inti=1;/*使得重复使用本地地址与套接字进行绑定*/

setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));

/*绑定函数bind*/

ibind(sockfd,(structsockaddr*)&server_sockaddr,sizeof(structsockaddr);

/*调用listen函数*/

listen(sockfd,MAX_QUE_CONN_NM);

/*调用accept函数,等待客户端的连接*/

client_fd=accept(sockfd,(structsockaddr*)&client_sockaddr,&sin_size);

/*调用recv函数接收客户端的请求*/

while

(1)

{

memset(buf,0,sizeof(buf));

recvbytes=recv(client_fd,buf,BUFFER_SIZE,0);

if(recvbytes>0)

{

printf("Receivedamessage:

%s\n",buf);

printf("Sendamessage:

%s\n",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程序,并成功仿真运行。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1