视频监控客户端软件的设计与实现
【编译环境】ubuntu 8.10 + Vmware + windows xp
【目标机】FS2410
【交叉编译器】QtX11-4.4.0 / Qte-4.4.0
1 说在前面
1.1 该项目是华清远见嵌入式学院综合实训项目,系统结构框图如下:
1.2 本项目所实现的内容是基于FS2410 开发板和DFROBOT 平台的,由于时间和条件的限制,与上述结构并不完全一致 ,功能上有所增减。
1.3 本项目的主要目的在于学习,代码上尽量以达到功能为主,界面上也未作过多的美化,用于实际工程还需要进行大量的优化。
1.4 在项目中,笔者主要负责远程监控软件的设计和系统的集成,因此,本文主要也是从这两个角度来说明的,在具体驱动程序的实现上未作阐述。
1.5 本文的程序部分仅给出类实现的头文件,并作了详细的注释,如果想得到更详细的程序,请告知邮箱:boat_man@163.com,我将尽早回复你。
1.6 毕业之际,希望以此作个总结,如果它能对你有所用,那我将更加高兴。
2 远程监控客户端软件的设计与实现
2.1 界面设计
首先在笔记本上画出如下的草图(本图是在Word2003上画的),该图为下一步的类设计及实际编程时的界面设计提供了参考。
2.2 类设计
根据界面的布局,把它看作是一个监示器,可以用3 个类来实现它:
2.2.1 机箱类 MonitorBase.h
主要为其他类提供容器并实现容器内各组件的通信及与外部的网络通信。
2.2.2 显示屏类 MonitorScreen.h
主要用来显示视频画面。
2.2.3 面板类 MonitorPanel.h
主要用来实现控制面板的功能,大部分的按钮都在这个类上。
2.3 工作流程图
2.4 类实现
2.4.1 机箱类 MonitorBase.h
class MonitorBase:public QDialog
{
Q_OBJECT
public:
MonitorBase(QWidget *parent = 0);
public slots: // 槽
void slotConnect(); // 实现到服务器的连接
void slotConnected(); // 连接后做一些事情
void slotFrameProc(); // 数据帧接收处理
void slotSendCmd(); // 发送命令
void slotReportTcpError(QAbstractSocket::SocketError ); // 报告通信错误
signals: // 信号
void signalIndicate(pHead); // 通知控制面板更新数据
void signalDisplay(QByteArray*); // 通知显示屏显示视频
void signalNoSignal(int); // 没有信号时通知显示屏
void signalConnected(bool); // 已连接时通知控制面板
private:
MonitorScreen *screen; // 显示屏对象
MonitorPanel *panel; // 控制面板对象
QLabel *statusLabel; // 状态栏标签
QPushButton *connectButton; // 连接按钮
QPushButton *quitButton; // 退出按钮
QTcpSocket sockRobot; // 通信TCP 套接字
QByteArray frameBuffer; // 数据帧缓冲
QByteArray *frameShow; // 视频帧用于显示
bool need_head; // 帧头是否接收到
bool conn_flag; // 连接是否已建立
pHead frameHead; // 帧头数据
};
2.4.2 显示屏类 MonitorScreen.h
class MonitorScreen:public QLabel
{
Q_OBJECT
public:
MonitorScreen(QWidget *parent = 0);
public slots:
void slotDisplay(QByteArray *); // 用于显示视频
void slotNoSignal(int); // 信号断开时处理
private:
QPixmap *frameScale; // 用于视频画面裁剪
QPixmap frameDisplay; // 显示的实现对象
};
2.4.3 面板类 MonitorPanel.h
class MonitorPanel:public QLabel
{
Q_OBJECT
public:
MonitorPanel(QWidget *parent = 0);
friend class MonitorBase; // 把机箱类作为友元
public slots:
void slotIndicate(pHead); // 接收机箱发来的更新信号
void slotConnected(bool); // 接收机箱已连接的信号
protected:
void keyPressEvent(QKeyEvent *); // 键盘按键处理
signals: // 发给机箱类的信号
void signalForward(); // 向前
void signalBackward(); // 向后
void signalUpward(); // 向上
void signalDownward(); // 向下
void signalStop(); // 停止
void signalTurnLeft(); // 向左
void signalTurnRight(); // 向右
void signalRotateLeft(); // 左转
void signalRotateRight();// 右转
void signalSpeak(); // 说话
void signalSing(); // 唱歌
void signalDance(); // 跳舞
private:
// 下面是显示文字的标签
QLabel *label1;
QLabel *label2;
QLabel *label3;
QLabel *label4;
QLabel *label5;
QLabel *label6;
QLabel *label7;
QLabel *label8;
QLabel *label9;
QLabel *longitudeLabel; // 经度
QLabel *latitudeLabel; // 纬度
QLabel *directionLabel; // 方向
QLabel *speedLabel; // 速度
QLabel *tempratureLabel; // 温度
QLabel *distanceLabel; // 距离
QLabel *frontLabel; // 前方
QLabel *leftLabel; // 左方
QLabel *rightLabel; // 右方
// 下面是一些按钮
QPushButton *upwardButton; // 向上
QPushButton *downwardButton; // 向下
QPushButton *forwardButton; // 向前
QPushButton *stopButton; // 停止
QPushButton *backwardButton; // 向后
QPushButton *turnLeftButton; // 向左
QPushButton *turnRightButton; // 向右
QPushButton *rotateLeftButton; // 左转
QPushButton *rotateRightButton; // 右转
QPushButton *speakButton; // 说话
QPushButton *singButton; // 唱歌
QPushButton *danceButton; // 跳舞
};
2.5 运行效果 ( 注:在IE下图片的文字可能会不清楚)
2.5.1 英文版
2.5.2 已汉化,增加了说话、唱歌、跳舞功能,启动欢迎界面。
2.5.3 视频加载中。
2.5.4 视频监控中320X240。
2.5.5 视频监控中640x480。
2.5.6 视频监控被断开。
2.5.7 访问地址可变,可通过局/广域网IP或域名访问。
2.5.8 移植到windows下。
2.5.9 移植到symbian s60 v3下( 详见《华清远见学习手记》 之3G智能机器人——移植视频监控客户端到我的Nokia E52上 )。
( 注:FireFox 打开有时会出问题,请尝试用IE打开)