首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
视频监控数据采集器
来源:本站整理  作者:佚名  2011-10-29 16:59:52



  概述

  采用网络对数字视频监控系统进行实时数据传输及控制,能充分利用网络优势,有地进行远程控制。一般远程监控系统包括本地监控装置和远程监控装置两部分,如下图所示,

包含视频监控的采集模块、传输通信模块、数据处理模块三部分,即通常所说的前端、传输、后端,前端部分由摄像机、镜头、防护罩、安装支架、云台、解码器等组成,主要用于对公共区域、重点区域进行摄像,并将视频信号传送至后端进行处理;传输部分由视频同轴电缆、电源线、控制线等组成,主将前端信号传输至后端,并为前端摄像机和解码器提供电源和控制信号;后端部分由视频画面处理器、摄像机、矩阵切换主机、控制键盘、监视器等组成,将前端传送的视频信号进行分割、处理、记录和控制,完成监视、控制、记录等防范和管理功能。

  本地监控中心控程序主要涉及数据收发、数据分析处理、数据显示模块,数据收发模块是按制台程序的重要部分,如果没有合理、有效的收发设计方案,将影响到其他模块正常运转。本文将数据收发模块设计为一个独立的基于Win32不支持的控制台程序,称为数据传输代理,它的核心是采用Win32多钱程编程技术和Socket网络编程技术;另外,视频监控的GUI程序称为监控中心控制台,监控中心服务器上运行的两个程序即指数据传输代理和监控中心控制台程序。

  监控中心服务器可以任意对各个现场实现监控,一方而完成远程现场视频图像数据的实时接收、解压缩、播放、存储以及控制该现场的摄像机切换、镜、云台动作,另一方而接收处理现场的报警信息。

  数据采集器的设计与实现

  数据传输代理主要实现与控制台数据通信、与远程客户端通信、数据库操作三部分功能。与控制台数据通信主要基于消息,利用ADO技术实现数据采集器对数据库的操作;与远程客户端通信采用Socket编程技术,如何有效地与远程客户端进行通信、写入数据库并保证数据准确地传输到控制台是本文设计的核心和难点。

  数据传输代理实现的功能模块可以划分为:(1)监视远程现场客户端的运行状态是否正常,当网络不通或远程终止等异常情况时数据采集器立即向控制台发送消息,同时控制台端实时显示客户和网络的运行状态;(2)控制远程现场客户端,如现场的摄像机切换、镜头、云台动作等;向远程监控现场客户端发送视频流和报警信息的接收;(4)将接收的数据写入数据库,并读取库中的信息;(5)向控制台传递数据,并接收控制台的控制信息。

  数据传输代理的线程设计包含以下几点:(1)主线程:初始化同步的事件变量、临界区变量、共享资源等变量,建立一个侦听套接字,负责开启新的客户连接请求线程,建立传输套接宇。当主线程收到程序结束信号时向各线程发出终止事件,等待各线程的终止,并释放资源;(2)远程控制线程;负责向远程客户端发送控制命令;(3)远程监视进程:负责监视所有远程客户端的运行状况及网络状况,实现控制中心实时显示客户端的运行状态;(4)数据传输线程:该线程的数目与远程现场客户端的数目相同,处理各个客户发送的数据,并将接收到的视频流信息和报警信息写入数据库,同时将接收到的数据发送到控制台进行数据分析处理;(5)数据传输维护线程:将数据传输线程做一个链表,实时维护此链表中各个绂程的有效性,该线程主要是解决数据传输绂程复杂不易管理的问题。

  软件设计

  软件设计流程如下图所示。

  定义数据结构和全局变量首先定义一个用于描述每一个客户端信息的数据结构Clientlnfo和一个客户链表ClientList,分别定义如下:

typedef struct_Clientlnfo
    {
    bool is_start test;
    /*发送测试包标示*/
    time_t send_time;
    /*发送的时间;*/
    time_t rec_time;
    /*最近接收到包时间*/
    unsigned long ip;
    /*客户端ip*/
    int sd;
    /*套接字标示*/
    DWORD ThreadlD;
    /*接收视频流线程*/
    } Clientlnfo;
    struct ClientList
    {
    Clientlnfo ci;
    ClientlnfoList*next;
    }:
    ClientList*g_ci_list;

  数据结构Clientlnfo记录了客户的基本信息,如客户端IP,同时记录了与该客户端通信对应的套接字标示sd和接收处理该客户视频流的线程标示,在程序运行过程中能有效的控制系统线程和套接字的开关情况;字段和rec_time用于察看远程客户端运行状态,当rec_time或与当前时间超过一定间隔时需重新向客户端发送状态,请求数据包检测其运行状态;ClientList是以Clientlnfo为节点的链表结构;g_ci_list是系统定义的一个的全局指针变量,指向正常连接的远程现场客户列表。

  其次,定义NewClientlnfor数据结构和g_nci全局变量,保存新连接请求的客户端的基本信息,定义如下

typedef struct_NewClientlnfor{
    int sd;
    /*连接套接字标示*/
    unsigned long ip;
    /*客户端IP*/
    char name[32];
    /*客户端名称*/
    } NewClientlnfor;
    NewClientlnfor g_nci;

  线程的启动  使用WinAPI函数创建一个新的线程,该函数的系统声明如下

HANDLE CreatThread(
    SEC_THREAD_START StartFunction,
  /*启动该线程所运行的函数*/
  PVOID ThreadParameter,
  /*传递该线程的一定信息*/
  PULONG Threadld
  /*该线程启动后的ID号*/
  );

  每一个线程都定义了相应的实现函数,主线程中直接调用CreatThread函数即可开启该线程。

  线程间同步的实现线程之间的同步协调是通过事件和临界区实现的,系统定义了2个临界区变量,分别保护全局变量和g_nci的安全:

CRITICAL SECTION
  g_ClientListCS;
    CRITICAL_SECTION g_NewClientCS;

  首先初始化临界区变量,在对变量进行操作前,首先要得到临界区资源,操作结束后释放该资源,以便其他访问的线程使用,利用这种方法即实现了对全局变量g_ClientListCS的同步。

  如果访问变量g_ClientListCS,则操作如下:

 EnterCmicalSection
  (&g_ClientListCS );
    /*对变量g_ClientlistCS的操作*/
    LeaveCritjcalSectiOn
  (&g_ClientListCS):

  另外,系统还定义了几个事件全局变量进行同步:

HANDLEm_hStop;
    /*用于停止事件句柄*/
    HANDLEm_hPause;

 

   用来接收用户发来的停止、暂停和继续消息如下:

   当系统暂停后再发出继续信号时,需通过以下方式重置事件变量:

 

  网络通信的实现采用TCP套接字实现远程客户数据的发送、接收。由于多个线程和现场客户端通信时为同一个套接宇,为了有效的使用套接字,将其设定为非阻塞模式(NonbLOCking),采用Se-lect模型,利用select函数,判断套接字上是否存在数据,或者能否向套接字写入数据。具体实现如下:

  小结

  本文利用多线程和套接字技术成功的解决了本地控制中心对多个现场远程监视的数据收发任务,该方案同时也适合手服务器和多客户进行数据采集和控制的任何模型。线程闻同步以及线程生存期内的维护是多线程编程应该注意的关键问题,由于多个线程同时需要对同一个套接字的使用,使用的非阻塞套接字模式和select模型,避免了在套接字处于非锁定模式中时产生的WSAEWOULDBLOCK错误。

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:39,773.44000 毫秒