1、基于嵌入式linux的QQ聊天系统设计武汉理工大学华夏学院专业综合课程设计报告书项 目 名 称基于嵌入式linux的QQ聊天系统设计课程设计总评成绩 学生姓名、学 号 黄标 10212411322 学 生 专 业 班级 自动化1113 指 导 教 师 姓名 苏明霞 课程设计起止日期 2014.12.52014.12.31 课程设计基本要求专业综合课程设计是十分重要的实践教学环节,通过专业综合课程设计,培养学生综合运用所学理论知识和专业技能,以项目为导向解决工程领域的实际问题。课程设计报告是科学论文写作的基础,报告可以以小论文的形式提交。 1. 专业综合课程设计内容包括项目设计方案论证、项目设计
2、与结果分析、答辩等环节,每个环节都应有一定的考核要求和考核成绩。2. 项目设计方案论证主要包括可行性设计方案论证、从可行性方案中确定最佳方案,项目设计要求按选择的方案进行硬件设计或软件编程。4. 项目设计结果分析主要包括项目设计与制作结果的工艺水平,项目测试性能指标的正确性和完整性,软件运行情况和效果分析,故障或错误原因的分析和处理方法。 5. 学生在课程设计过程中应认真阅读与本课程设计项目相关的文献,培养自己的阅读兴趣和习惯,借以启发自己的思维,提高综合分和理解能力。文献阅读摘要记录于课程设计报告书中。6. 答辩是课程设计中十分重要的环节,由课程设计指导教师向答辩学生提出23个问题,通过答辩
3、可进一步了解学生对课程设计中理论知识和实际技能掌握的程度,以及对问题的理解、分析和判断能力。7.学生应在课程设计周内认真参加项目设计的各个环节,按时完成课程设计报告书。课程设计报告书是实践教学水平评估的重要资料,应按课程、班级集成存档交实验室统一管理。课程设计任务书学生姓名: 黄标 专业班级: 自动化113 指导教师: 苏明霞 工作单位:武汉理工大学华夏学院 题 目: 基于嵌入式linux的QQ聊天系统设计 基础条件:1. 软帝嵌入式ARM9开发教学设备;2. PC机及相关应用软件;要求完成的主要任务:1. 了解TCP方面socket编程,linux下QT编程。2. 实现客户端与服务器端的聊天
4、功能。3. 撰写课程设计说明书。4. 课程设计说明书要求:引言、设计要求、系统结构、原理设计、各个模块的设计与实现、软件设计、调试过程、体会及总结、参考文献、源程序。说明书使用A4纸打印或手写。时间安排:第14周 下达课程设计任务书和日程安排,根据任务书查找资料,了解触摸屏工作原理;第15周 熟悉linux的QT下C+程序设计;熟悉linux移植过程。第16周 程序的编写和调试; 第17周 结果分析整理、撰写课程设计报告,验收和答辩。指导教师签名: 2014 年 12 月 5 日系主任(或责任教师)签名: 2014 年 12月 5 日摘 要(摘要200字左右,采用5号字,楷体;摘要要求写“目的
5、、方法、结果、结论”) 本系统建立在嵌入式系统网络平台上,系统的设计上瘾了面向对象技术和面向对象的设计原则。系统采用C/S与B/S结合的结构,客户端与客户端一级客户端与服务端之间通过Socket传递消息。使用嵌入式C+语言编写,开发工具采用linux下的QT环境。 服务器设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。大大 增强了程序对服务器资源的利用。在linux下编写并调试服务器端程序与客户端程序,实现了客户、服务器之间的连接和通信。关键字:linux;qt;tcp/ip;聊天1、设计的总体目的与功能1、聊天程序的基本要求(1)、在QT(或mi
6、niGUI)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。(2)、QT(或miniGUI)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。2、需实现的主要功能(1)客户端输入服务器IP和端口号。(2)服务器必须成功启动。(3)每一个客户端可以寻找服务器,并且与服务器建立连接。(4)客户端和服务器可以实现通信。(5)通信的内容可以显示在面板上。(6)利用QT设计界面,并下载到ARM2410上面二、方案论证(可行性方案、系统实现方案)1、QT设计QT设计编写和调试阶段使用周立功ARM2410箱子提供的QT
7、forPC编译器,运行测试阶段使用QTforARM编译器。使用QTforPC阶段编译程序的步骤如下(以编译hello.cpp程序为例):(1)进入/x86-qtopia目录,运行set-env脚本,设置环境变量。$.set-env(2)进入hello目录,然后用progen工具生成工程文件hello.pro。 $cdhello $vihello.cpp$progentapp.tohello.pro(3)使用tmake工具,生成hello工程的Makefile文件。 $ tmake-oMakefilehello.pro(4)修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入 m
8、ake命令编译。 LIBS=$(SUBLIBS)-L$(QTDIR)/lib-lqte-lm-lstdc+$make(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够 访问/dev/fb0)。 $cd/zylinux/x86-qtopia $.set-env $cdhello $./helloqws 如果要将Hello程序发布到ARM2410上运行,还需进行以下工作:(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。 $cd/zylinux/arm-qtopia $cpav/zylinux/x86-qtopia/hello(7)运行当前
9、目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。 $.set-env $cdhello $tmake-oMakefilehello.pro(8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。(9)插入USB鼠标和USB键盘,启动ARM2410。启动Qtopia的终端,运行hello程序。利用同样的编译方法,客户端QT程序进行编译和调试。2、客户端QT界面设计客户端QT需要以下基本组件:(1)两个QEditLine,一个用于输入服务器IP地址(可读可写),另一个用
10、于输入服务器端口号(可读可写)。(2)三个按钮,一个用于连接服务器,另一个用于发送消息,最后一个用于清空发送区域数据。(3)四个标签,用于显示不用组件的内容。(4)两个MultiLineedit,一个用于显示通信内容(只读),一个作为发送区域(可读可写)。3、服务器端和客户端的数据传输方式服务器端和客户端的数据是用TCP套接字来传输的。IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。端口号与IP地址的组合得出一个网络套接字。客户端使用linuxC函数socket建立到服务器的套接字连接。当套接字连接socket建立后,可以利用linuxC语言中的send函数和recv函
11、数来实现简单的发送和接收消息。4、服务器端功能设计由于时间有限,服务器并没有用QT来编写界面,只是实现一个简单的控制程序。服务器主要实现有:(1)创建套接字(2)对套接字、IP地址和端口号进行绑定(3)进行监听(4)等待客户端的连接(5)对客户端接收和发送数据5客户端功能设计客户端使用QT设计界面,客户端实现的功能如下:(1)创建套接字 (2)连接服务器 (3)与服务器通信6详细设计(1)、功能分析和描述:聊天工具包括两大功能模块:客户端和服务器端。具体实现的功能创建套接字、连接通信、接收数据显示和发送数据。(2)、客户端功能模块 连接服务器 连接服务器之前需要解析服务器地址、创建套接字、设置
12、sockaddr_in 结构体中相关参数。 发送消息功能 连接功能是开始聊天前必须进行的步骤 连接成功之后 就可以进行发送消息了。发送消息功能流程图如图2-5所示。接收消息模块 连接成功后 就可以接收服务器发送过来的数据。 (3)、服务器功能模块服务器的设计并没有使用QT编写界面,服务器端实现的功能有服务器模块流程图三、硬件电路设计或软件设计1、代码实现 (1)、客户端代码 QT构造和析构函数 EditDemo:EditDemo(QWidget *parent, const char *name):QWidget(parent, name) QGridLayout *grid = new QG
13、ridLayout(this, 6, 3, 0, 0); /IP addr QLabel *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 Port QLabel *label2 = new QLabel( Server Port:, this); grid-addWidget( label2, 1, 0)
14、; edit_port = new QLineEdit(this); edit_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 mode QLa
15、bel *label3 = new QLabel( Contract Area:, 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); multied
16、it_send = new QMultiLineEdit(this); grid-addWidget(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,
17、 this); /*add the clear button*/ grid-addWidget(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); 创建套接字 void EditDemo:CreateSocket(void)
18、/*地址解析函数*/ 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 = *(struct in_addr *)host-h_addr); bzero(&(serv_addr.sin_zero), 8); 创建线程
19、 void *task(void *arg) int recvbytes = 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
20、Thread*/ (2)、服务器端代码 #define PORT 4321 #define BUFFER_SIZE 1024 #define MAX_QUE_CONN_NM 5 int 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
21、,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); int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */ setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i); /*绑定函数bind*
22、/ ibind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(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 = rec
23、v(client_fd, buf, BUFFER_SIZE, 0); if(recvbytes 0) printf(Received a message: %sn, buf); printf(Send a message: %sn, buf); (sendbytes = send(client_fd, buf, strlen(buf), 0); close(sockfd); exit(0); 四、结果分析(对获得的数据、波形、现象或问题进行分析) 4.运行结果五、参考文摘(相关文摘不少于5篇,记录每篇文献的作者姓名.文献名称.文献发行城市:文献出版社,出版年;文献内容摘要, 每篇不少于100字
24、)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分)答辩记录:指导教师综合评语:指导教师(签名) 日 期: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1