基于嵌入式系统的聊天程序设计Word文档格式.docx
- 文档编号:21603784
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:153.02KB
基于嵌入式系统的聊天程序设计Word文档格式.docx
《基于嵌入式系统的聊天程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于嵌入式系统的聊天程序设计Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
嵌入式系统是数字化产品的核心。
为适应嵌入式分布处理结构和应用上网需求,面向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
$./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文件。
(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总体功能
根据对需求所做的分析,聊天程序需要实现的基本功能应包括以下几个方面:
(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"
);
addWidget(edit_ip,0,1);
//ServerPort
QLabel*label2=newQLabel("
ServerPort:
addWidget(label2,1,0);
edit_port=newQLineEdit(this);
edit_port->
4321"
addWidget(edit_port,1,1);
QPushButton*btn=newQPushButton("
Connect"
/*addtheconnectbutton*/
addWidget(btn,2,1);
/*addthebutton*/
connect(btn,SIGNAL(clicked()),this,SLOT(ButtonConnect()));
//multilineinputmode
QLabel*label3=newQLabel("
ContractArea:
addWidget(label3,3,0);
multiedit_contract=newQMultiLineEdit(this);
multiedit_contract->
setReadOnly
(1);
//setreadonly
addWidget(multiedit_contract,3,1);
QLabel*label4=newQLabel("
SendArea:
addWidget(label4,4,0);
multiedit_send=newQMultiLineEdit(this);
addWidget(multiedit_send,4,1);
QPushButton*button_send=newQPushButton("
Send"
/*addthesendbutton*/
addWidget(button_send,5,0);
connect(button_send,SIGNAL(clicked()),this,SLOT(ButtonSend()));
QPushButton*button_clear=newQPushButton("
Clear"
/*addtheclearbutton*/
addWidget(button_clear,5,1);
connect(button_clear,SIGNAL(clicked()),this,SLOT(ButtonClear()));
}
~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)
{
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);
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(PORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
(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>
Receivedamessage:
%s\n"
buf);
printf("
Sendamessage:
(sendbytes=send(client_fd,buf,strlen(buf),0);
exit(0);
七、功能的实现过程
依照上节所设计的结构和过程,可以很方便的实现出聊天功能。
下面就是一
个聊天过程的执行情况。
聊天的现实过程为:
A:
Hello
B:
A(B):
……
Bye
其中A,B是虚拟的聊天者。
在实现过程中,这个聊天过程就要借助一个服务器来实现,聊天的发送端要先跟这个服务器通信,然后由这个服务器与接收方进行通信,最后完
成聊天过程。
八、总结
通过这次嵌入式linux程序设计和编程,对linux的编程有了更深的了解。
特别是对QT编程有了很大的进步,通过测试,编写的程序都能顺利运行。
由于时间紧迫,对服务器部分没有用QT来设计界面,只是编写客户端的QT程序,并成功仿真运行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 嵌入式 系统 聊天 程序设计