摘要:本文分析了终端通讯设备的组成及功能,并提出了终端通讯设备的核心部分的总体架构,基于ARM9硬件平台及Qt4creator的软件平台,在嵌入式Linux系统下,通过无线或有线的局域网,进行相互间的聊天、会议。
关键字:ARM9、Qtcreator4、局域网通信、Linux
-
前言
随着嵌入式系统的不断发展,嵌入式的处理器的性能不断提升,存储系统容量也在不断的扩大,各种多媒体应用程序被移植到嵌入式系统中,各种嵌入式应用程序成为了嵌入式开发的不可或缺的重要组成部分。随着Android系统的火热趋势,嵌入式应用程序将再进入一个新纪元。物联网概念的提出,让我们深切的体会到网络的重要性,现在如手机类似的终端所采用的聊天软件几乎都是QQ,本终端中的程序是自主开发,采用开源的Qt4creator平台,具有跨平台的强大特性,可实现终端设备、PC机的Windows与PC机的Linux系统间在局域网范围内的即时通讯。
选择Linux平台与Qtcreator4的开发环境主要有以下几个方面的考量:
(1)、Linux系统与Qt软件的开源特性;
(2)、Linux系统与嵌入式系统的紧密相关性;
(3)、Qt界面设计的强大性与美观性;
(4)、市场中Qt软件与Linux系统的普适性。
-
系统设计
本软件可安装于Linux系统和Windows的PC机上,同时也可以安装在具体相应嵌入式系统的终端设备中。主要完成三个功能:两人间的私聊、多人间的会议、与文件的传输。
其中,聊天时只需输入本局域网相应用户的IP地址,只要双方都使用此软件,便可实现聊天。开会议时首先由主持人打开程序中的会议程序,开始会议,局域网内的与会人员只需在自己的软件中相应的界面里面输入主持人设置的端口,与服务器端的IP地址便可开始会议。无论在会议阶段还是在聊天界面都是可以向本局域网内的I主机发送文件。
对于将本程序装入可连网终端的设计,写者选择了一款具有Redhat系统。
-
功能设计与实现
程序的初始界面是一个欢迎使用的界面:
而后有一个可供选择的软件信息界面:
随后可根据自己的需要来选择相应的模式,聊天:
也可以选择会议模式,会议模式与聊天模式类似,但是,会多了新建会议的模块:
都可以修改字体、字型与字体的颜色等。
TCP文件传输:
TCP文件接收:
about *a = new about; a->setStyleSheet ("QDialog#about{borderimage:url(images/back6.jpg)}"); a->exec(); |
UDP协议实现天模块中,主要有以下几个实现模块:
(1)、构造函数中:
bool conn = connect(udpsocket,SIGNAL(readyRead()), this,SLOT(receive())); |
connect(udpsocket,SIGNAL(readyRead()), this,SLOT(receive())); connect(ui->sendbtn,SIGNAL(clicked()), this,SLOT(send())); |
|
(2)、修改编码及发送信息:
QByteArray text =ui->sendtedit->toPlainText(). toLocal8Bit(); |
len=udpsocket->writeDatagram(text,text.length(), QHostAddress(ui->ipledit->text()),10500); |
(3)、修改编码及接收信息:
data.resize(udpsocket->pendingDatagramSize()); udpsocket->readDatagram(data.data(),data.size()); QString str=QString::fromLocal8Bit(data.data()); |
TCP协议实现的会议模块中,主要有以下几个功能模块:
(1)、进入与离开会议室
connect(tcpClientSocket,SIGNAL(updateClients(QString,int)), this,SLOT(updateClients(QString,int))); connect(tcpClientSocket,SIGNAL(disconnected(int)), this,SLOT(slotDisconnected(int))); |
void Server::updateClients(QString msg, int length) { emit updateMeeting(msg,length); qDebug()<<"updateClients"<<msg<<" "<<length; for(int i=0;i<tcpClientSocketList.count();i++) { QTcpSocket *item = tcpClientSocketList.at(i); if(item->write(msg.toLatin1(),length)!=length) continue; } } |
(2)发送信息
QByteArray text =ui->usrNameLedit->text().toLocal8Bit()+" "+ QTime::currentTime().toString().toLocal8Bit()+'\n' +ui->qunSend_tedit->toPlainText().toLocal8Bit(); |
tcpSocket->write(text,text.length()); |
tcpSocket->read(datagram.data(),datagram.size()); QString msg =QString::fromLocal8Bit(datagram.data()); |
TCP协议实现的文件传输模块中,功能模块:
totalBytes = localFile->size();//获取文件大小 QDataStream sendOut(&outBlock,QIODevice::WriteOnly); sendOut.setVersion(QDataStream::Qt_4_3); QString currentFile = fileName. right(fileName.size() - fileName.lastIndexOf('/')-1); //去除文件的路径部分 sendOut<<qint64(0)<<qint64(0)<<currentFile; //发关文件头结构:总长度、文件名长度和文件名 totalBytes += outBlock.size(); //文件长度加上文件头的长度,后面的是求文件头的长度 sendOut.device()->seek(0);//读写指针从头开始 sendOut<<totalBytes<<qint64( (outBlock.size()-sizeof(qint64)*2)); bytesToWrite = totalBytes – tcpClient->write(outBlock); //发出文件头,并修改发送字节数 |
TCP协议实现的文件接收模块中,功能模块:
if(bytesReceived < totalBytes) { bytesReceived += tcpServerConnection->bytesAvailable(); inBlock = tcpServerConnection->readAll(); localFile->write(inBlock); localFile->flush(); inBlock.resize(0); } |
-
结束语
参考文献
[1] 成洁,卢紫毅。Linux窗口程序设计——Qt4精彩实例分析,北京:清华大学出版社,2008.11.
[2] 蔡志明等。精通Qt4编程,北京:电子工业出版社,2008.1.
[3]李春葆,董尚燕,余云霞。C++面向对象程序设计,北京:清华大学出版社,2008.