基于嵌入式linux的QQ聊天系统设计.docx
《基于嵌入式linux的QQ聊天系统设计.docx》由会员分享,可在线阅读,更多相关《基于嵌入式linux的QQ聊天系统设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于嵌入式linux的QQ聊天系统设计
武汉理工大学华夏学院
专业综合课程设计报告书
项目名称基于嵌入式linux的QQ聊天系统设计
课程设计总评成绩
学生姓名、学号黄标10212411322
学生专业班级自动化1113
指导教师姓名苏明霞
课程设计起止日期2014.12.5~2014.12.31
课程设计基本要求
专业综合课程设计是十分重要的实践教学环节,通过专业综合课程设计,培养学生综合运用所学理论知识和专业技能,以项目为导向解决工程领域的实际问题。
课程设计报告是科学论文写作的基础,报告可以以小论文的形式提交。
1.专业综合课程设计内容包括项目设计方案论证、项目设计与结果分析、答辩等环节,每个环节都应有一定的考核要求和考核成绩。
2.项目设计方案论证主要包括可行性设计方案论证、从可行性方案中确定最佳方案,项目设计要求按选择的方案进行硬件设计或软件编程。
4.项目设计结果分析主要包括项目设计与制作结果的工艺水平,项目测试性能指标的正确性和完整性,软件运行情况和效果分析,故障或错误原因的分析和处理方法。
5.学生在课程设计过程中应认真阅读与本课程设计项目相关的文献,培养自己的阅读兴趣和习惯,借以启发自己的思维,提高综合分和理解能力。
文献阅读摘要记录于课程设计报告书中。
6.答辩是课程设计中十分重要的环节,由课程设计指导教师向答辩学生提出2~3个问题,通过答辩可进一步了解学生对课程设计中理论知识和实际技能掌握的程度,以及对问题的理解、分析和判断能力。
7.学生应在课程设计周内认真参加项目设计的各个环节,按时完成课程设计报告书。
课程设计报告书是实践教学水平评估的重要资料,应按课程、班级集成存档交实验室统一管理。
课程设计任务书
学生姓名:
黄标专业班级:
自动化113
指导教师:
苏明霞工作单位:
武汉理工大学华夏学院
题目:
基于嵌入式linux的QQ聊天系统设计
基础条件:
1.软帝嵌入式ARM9开发教学设备;
2.PC机及相关应用软件;
要求完成的主要任务:
1.了解TCP方面socket编程,linux下QT编程。
2.实现客户端与服务器端的聊天功能。
3.撰写课程设计说明书。
4.课程设计说明书要求:
引言、设计要求、系统结构、原理设计、各个模块的设计与实现、软件设计、调试过程、体会及总结、参考文献、源程序。
说明书使用A4纸打印或手写。
时间安排:
第14周下达课程设计任务书和日程安排,根据任务书查找资料,了解触摸屏工作原理;
第15周熟悉linux的QT下C++程序设计;熟悉linux移植过程。
第16周程序的编写和调试;
第17周结果分析整理、撰写课程设计报告,验收和答辩。
指导教师签名:
2014年12月5日
系主任(或责任教师)签名:
2014年12月5日
摘要
(摘要200字左右,采用5号字,楷体;摘要要求写“目的、方法、结果、结论”)
本系统建立在嵌入式系统网络平台上,系统的设计上瘾了面向对象技术和面向对象的设计原则。
系统采用C/S与B/S结合的结构,客户端与客户端一级客户端与服务端之间通过Socket传递消息。
使用嵌入式C++语言编写,开发工具采用linux下的QT环境。
服务器设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。
大大增强了程序对服务器资源的利用。
在linux下编写并调试服务器端程序与客户端程序,实现了客户、服务器之间的连接和通信。
关键字:
linux;qt;tcp/ip;聊天
1、设计的总体目的与功能
1 、聊天程序的基本要求
(1)、在QT(或miniGUI)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。
(2)、QT(或miniGUI)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。
2 、需实现的主要功能
(1) 客户端输入服务器IP和端口号。
(2) 服务器必须成功启动。
(3) 每一个客户端可以寻找服务器,并且与服务器建立连接。
(4) 客户端和服务器可以实现通信。
(5) 通信的内容可以显示在面板上。
(6) 利用QT设计界面,并下载到ARM2410上面
二、方案论证(可行性方案、系统实现方案)
1、 QT设计
QT设计编写和调试阶段使用周立功ARM2410箱子提供的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文件,在LIBS变量中增加需要用到的库,然后输入
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程序发布到ARM2410上运行,还需进行以下工作:
(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。
$ cd /zylinux/arm-qtopia
$ cp –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键盘,启动ARM2410。
启动Qtopia的终端,运行hello程序。
利用同样的编译方法,客户端QT程序进行编译和调试。
2、 客户端QT界面设计
客户端QT需要以下基本组件:
(1)两个QEditLine,一个用于输入服务器IP地址(可读可写),另一个用于输入服务器端口号(可读可写)。
(2)三个按钮,一个用于连接服务器,另一个用于发送消息,最后一个用于清空发送区域数据。
(3)四个标签,用于显示不用组件的内容。
(4)两个MultiLineedit,一个用于显示通信内容(只读),一个作为发送区域(可读可写)。
3、服务器端和客户端的数据传输方式
服务器端和客户端的数据是用TCP套接字来传输的。
IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。
端口号与IP地址的组合得出一个网络套接字。
客户端使用linux C 函数socket建立到服务器的套接字连接。
当套接字连接socket建立后,可以利用linux C语言中的send函数和recv函数来实现简单的发送和接收消息。
4、服务器端功能设计
由于时间有限,服务器并没有用QT来编写界面,只是实现一个简单的控制程序。
服务器主要实现有:
(1)创建套接字
(2)对套接字、IP地址和端口号进行绑定
(3)进行监听
(4)等待客户端的连接
(5)对客户端接收和发送数据
5客户端功能设计
客户端使用QT设计界面,客户端实现的功能如下:
(1)创建套接字
(2)连接服务器
(3)与服务器通信
6详细设计
(1)、功能分析和描述:
聊天工具包括两大功能模块:
客户端和服务器端。
具体实现的功能创建套接字、连接通信、接收数据显示和发送数据。
(2)、客户端功能模块
连接服务器连接服务器之前需要解析服务器地址、创建套接字、设置sockaddr_in结构体中相关参数。
发送消息功能连接功能是开始聊天前必须进行的步骤连接成功之后就可以进行发送消息了。
发送消息功能流程图如图2-5所示。
接收消息模块连接成功后就可以接收服务器发送过来的数据。
(3)、服务器功能模块
服务器的设计并没有使用QT编写界面,服务器端实现的功能有
服务器模块流程图
三、硬件电路设计或软件设计
1、代码实现
(1)、客户端代码
QT构造和析构函数
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");
}
}
创建套接字
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);
}
创建线程
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*/
}
(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);
四、结果分析(对获得的数据、波形、现象或问题进行分析)
4.运行结果
五、参考文摘(相关文摘不少于5篇,记录每篇文献的作者姓名.文献名称.文献发行城市:
文献出版社,出版年;文献内容摘要,每篇不少于100字)
[1]嵌入式Linux应用程序开发标准教程.人民邮电出版社。
2010.7
[2]何加铭主编.嵌入式32位微处理器系统设计与应用.电子工业出版社.2006年
[3]许海燕,付炎著.嵌入式系统技术与应用.机械工业出版社.2002年
[4]周立功主编.ARM嵌入式系统基础教程.北京航空航天大学出版社.2005年
[5]田泽主编.嵌入式系统开发与应用教程.北京航空航天大学出版社.2005年
[6]徐英慧;马忠梅;王磊;王琳主编.ARM9嵌入式系统设计-基于sc32410与linux(第二版).北京航空航天大学出版社.2010年
课程设计评分表
评分项目
评分成绩
1.目的明确、功能合理(10分)
2.设计方案正确,具有可行性、创新性(20分)
3.硬件电路正确、软件流程清晰(40分)
4.参考文摘不少于5篇(10分)
5.答辩(20分)
总分(100分)
答辩记录:
指导教师综合评语:
指导教师(签名)
日期:
年月日