基于Qt的四路视频监控系统中客户端的设计与实现
Write() Read() Bind() Socket() Conect() Listen() Accept() 建立连接 发送数据 接收数据 Read() Write() Close() Close() 图5.1 Socket编程模型
服务器,使用Server_Socket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 5.1.3 SOCKET创建代码 客户端Socket创建
int open_clientsock(char * address, int port) {
struct sockaddr_in servadr; int client_handle;
/* Create a new socket */
if ((client_handle = socket (AF_INET, SOCK_STREAM, 0)) == -1) exit_fatal (\ initaddr (&servadr,address,port);
if (connect(client_handle,(struct sockaddr *) &servadr, sizeof (struct sockaddr)) == -1) }
客户端Socket关闭 void
close_sock (int sockhandle) {
6
exit_fatal (\
return client_handle;
山西大学商务学院本科毕业论文(设计)
close (sockhandle); }
Socket接收消息
Int read_sock (int sockhandle, unsigned char *buf, int length) {
int byte_read = -1; unsigned char *ptbuf =buf; int mlength = length; int i = 0; do {
byte_read = read (sockhandle, ptbuf,mlength); if (byte_read > 0) {
ptbuf = ptbuf+byte_read; mlength = mlength-byte_read;
} i++;
if(i > 10000) return -1;
} while (mlength > 0); return (mlength); }
Socket发送消息
Int write_sock (int sockhandle, unsigned char *buf, int length) {
int byte_send = -1;
byte_send = write (sockhandle, buf, length); return (length - byte_send); }
5.2 UI界面四路视频画面显示 5.2.1 Qt中用到的基本类的介绍
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。
Qt拥有十分强大的类库,拥有400多个面向对象的类,它们带有大多数构建跨平台服务器与客户端程序的底层基础构造函数。Qt的类库可以分成三部分:组件(Components)、框架(Framework)、效用工具(Util.ities)。其中组件包括环境、主窗VI和相关类、标准对话框、基本窗VI部件、高级窗VI部件、组织者及帮助系统;框架包象、模型、抽象窗VI部件、图形和打印、拖放、窗VI部件外观和布局管理;效用工具包括通用工具类、图像处理、日期与时间、I/O处理和杂项。在程序设计中最常用的类包括QObject、QApplication、QWidget、QMainWindow、QI.ayout、QEvent等 。 5.2.2 客户端UI设计
通过QT 设计器,将所要用到的菜单、窗口进行设计实现。Qt 设计器支持一种基于工程的程序设计方法。首先创建一个工程(.pro后缀的文件),有了该工程文件就可以用利用QT提供的工具qmake来生
7
基于Qt的四路视频监控系统中客户端的设计与实现
成makefiles用于编译链接。菜单、窗体设计被保存成XML格式的.ui文件并且被uic(用户界面编译器)转换成为C++头文件和源文件。利用QT设计器完成的菜单、窗体设计只是个界面架构。其完成的特定功能还需要编程实现。在窗体的.ui 文件中,可以通过增加新的功能函数实现其特有的功能。界面设计框架如图5.2所示:
图 5.2 界面设计框架
整个GUI 系统只有一个GUI进程作为主进程,其他非GUI进程通过QThread在GUI进程中创建新的子进程实现相应的功能。该窗口实现类如下所示: class MainWindow : public QMainWindow {
Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0); ~MainWindow();
private slots: void setting(); private:
Ui::MainWindow *ui;
QAction* settingAct; QMenu* fileMenu;
QFrame* centralFrame;
8
山西大学商务学院本科毕业论文(设计)
QGridLayout *gridlayout;
QVector
本窗口进程通过启用线程来调用程序使得窗口显示画面,调用实现如下代码所示: CamThread::CamThread(long camID,long winID) {
_camID = camID; _winId = winID; }
void CamThread::run() {
sleep(1);
char buff[128]={0};
QSettings settings(QString(\ sprintf(buff,\
char* value = settings.value(buff, \
sprintf(buff,\ _stream= popen(buff,\ exec(); }
每个窗口可以进行IP设置,根据所监视服务器IP地址设置监控连接,实现效果如图5.3所示: 代码设置如下: namespace Ui {
class SettingDialog; }
class QGridLayout; class QLineEdit;
class SettingDialog : public QDialog {
Q_OBJECT 图 5.3 IP设置界面 public:
explicit SettingDialog(QWidget *parent = 0);
9
基于Qt的四路视频监控系统中客户端的设计与实现
~SettingDialog();
void LoadSetting(); void SaveSetting(); private:
Ui::SettingDialog *ui; QGridLayout* gridlayout; QLineEdit* edit0; QLineEdit* edit1; QLineEdit* edit2; QLineEdit* edit3; };
SDL层显示 5.5.1 SDL接口调用
SDL在Linux平台下的接口:
视频显示使用X11,利用XFree86 DGA扩展的优势,全屏显示使用新的w MTRR加速。 声音使用OSS API。
使用clone()系统调用和SysV IPC,或者glibc-2.1的pthreads实现线程。
通过SDL_GetWMInfo()取得SDL驱动接口的隐藏部分,从而可以实现诸如去除窗口要素和图标化窗口等效果。
SDL库分为 Video、Audio、CD-ROM、Joystick 和 Timer 等若干子系统,除此之外,还有一些单独的官方扩充函数库。这些库由官方网站提供,并包含在官方文档中,共同组成了SDL的“标准库”: SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。 SDL_mixer—更多的声音输出函式以及更多的声音格式支持。 SDL_net—网络支持。
SDL_ttf—TrueType字体渲染支持。 SDL_rtf—简单的RTF渲染支持。
本客户端留出接口,另外启用线程调用SDL层在客户端界面显示视频。具体实现如下: class SDLTestThread { public:
SDLTestThread(long winID);
long _winId; FILE* _fId; };
SDLTestThread::SDLTestThread(long winId) {
_winId = winId;
if(1){
SDL_Thread *thread;
10