利用PlatformBuilder定制WindowsCE系统并开发USB摄像头驱动和数据发送端的开发,本文详细介绍USB摄像头驱动的设计和发送端的程序设计。系统的软件结构图如图3所示。
WindowsCE流接口驱动程序是具有定制接口的驱动程序,表现为在用户一级的动态链接库DLL,是一般类型的设备驱动程序。流接口驱动程序中用来实现一组固定的函数称为流接口函数,这些流接口函数使得应用程序可以通过文件系统访问这些驱动程序。流接口驱动程序几乎支持任何类型的可以连接到基于WindowsCE.net的平台外部设备,其中包括USB设备。
流接口驱动程序的主要任务是把外设的使用传递给应用程序,这是通过把设备表示为文件系统的一个特殊文件实现。应用程序通过文件系统的API函数调用流接口函数,然后流接口驱动程序调用本机驱动或者通过设备管理器与系统内核或外围打交道。
2.1 摄像头驱动程序的流接口函数的实现
开发摄像头驱动程序涉及到一组标准的流接口驱动程序的函数,如CAM_Init()、CAM_Deinit()、CAM_Open()、CAM_Read()等,这些函数是接口驱动程序的DLL接口,其中CAM_Init()、CAM_Open()、CAM_Read()和CAM_IOControl()最为重要。下面对这些重要函数进行详细介绍。
(1)CAM_Init()
CAM_Init()函数是通过设备管理器提供的ActiveDeviceEx()函数调用。在设备初始化时通过ActiveDeviceEx()将设备句柄信息写入DriversActive下面,当应用程序初始化时,注册表的地址将以Context参数形式传给CAM_Init()网站状态监控助手,利用RegOpenKeyEx()、RegQueryValueEx()等函数执行打开和读写注册表操作,等执行成功后返回USB设备的句柄信息等。驱动程序的部分源代码:
(2)CAM_Open()
在对设备进行读操作之前,首先要先通过执行CeratFile()来调用CAM_Open()打开设备,CAM_Open()所需的第一个参数是应用程序初始化时由CAM_Init()返回的设备句柄等信息,然后将设备关闭的事件设为无信号状态。
下面是部分源码:
程序中涉及的EnterCriticalSection()和LeaveCriticalSection()两个函数的作用是保证在临界区内所有被访问的资源不被其他线程访问,直到当前线程执行完临界区代码。EnterCriticalSection()和LeaveCriticalSection()分别表示为进入临界区和退出临界区。
(3)CAM_IOControl()
程序设计中通过CreatFile()函数调CAM_Open()打开摄像头设备,通过ReadFile()将返回值传给CAM_IOControl()流接口函数,而CAM_IOControl()则调用OV51xReadOneFrame()对USB设备数据进行读取。下面是部分源码:
对于USB总线上的数据传输,一共有四种传输类型,分别是控制传输、中断传输、批量传输和实时传输,这四种传输类型分别应用到不同的USB设备。其中实时传输适用于以固定速率或特定时间内传输,可以容忍偶尔错误的流数据情况,对于USB摄像头这种实时性要求比较高的设备一般选用实时传输,所以在CAM_Read()中就需要用到实时传输函数IssueIsochTransfer()来读取摄像头采集的数据。如果IssueIsochTransfer()执行后返回一个标示句柄,则代表执行成功,如果无返回值,则表示执行失败。
下面是部分源码:
程序中涉及的EnterCriticalSection()和LeaveCriticalSection()两个函数的作用是保证在临界区内所有被访问的资源不被其他线程访问,直到当前线程执行完临界区代码。EnterCriticalSection()和LeaveCriticalSection()分别表示为进入临界区和退出临界区。
(3)CAM_IOControl()
程序设计中通过CreatFile()函数调CAM_Open()打开摄像头设备,通过ReadFile()将返回值传给CAM_IOControl()流接口函数,而CAM_IOControl()则调用OV51xReadOneFrame()对USB设备数据进行读取。下面是部分源码:
实时监控网站对于USB总线上的数据传输,一共有四种传输类型,分别是控制传输、中断传输、批量传输和实时传输,这四种传输类型分别应用到不同的USB设备。其中实时传输适用于以固定速率或特定时间内传输,可以容忍偶尔错误的流数据情况,对于USB摄像头这种实时性要求比较高的设备一般选用实时传输,所以在CAM_Read()中就需要用到实时传输函数IssueIsochTransfer()来读取摄像头采集的数据。如果IssueIsochTransfer()执行后返回一个标示句柄,则代表执行成功,如果无返回值,则表示执行失败。
在每次得到一包数据时,查找帧开始标记,如果查找到,则复制剩余的所有数据到应用程序的缓冲中。在程序的Ov51xReadOneFrame()函数中,pDataBuff申请了9610B空间,dwFrameLen为10次传输每次的长度,这里都设置为961。图4为Ov51ReadFrame()软件流程图。
2.2 通信发送端的设计实现
通信发送端主要完成RTP/RTCP协议封装和解封装、网络发送与数据获取。本文所实现的是基于RTP/UDP/IP协议栈的MPEG-4实时流媒体传输,是移动视频监控系统中网络传输部分的子模块。采用JRTPLIB库函数来实现RTP的实时传输。传输部分的系统架构如图5所示。
该发送端的主要功能是将音视频流封装到RTP包内通过3G网络传送给接收端,同时发送和接收RTCP包进行反馈控制,以期达到最佳效果。基于WindowsCE平台通过调用JRTPLIB函数库来编程实现实时流媒体传输。
由于RTP协议并不作为独立的网络层来实现,它采用应用层组帧的理念,作为应用程序代码的一部分免费网站监控,本文针对一个具体媒体的应用通过应用程序实现RTP封装分组,然后将RTP分组交给UDP接口,采用JTHREAD作为线程库,完成多线程的操作。利用RTP来做视频传输分2个session来完成:一个负责声音传送;另一个负责视频传送。
发送端的部分主程序如下:
3 结语
本文在现有的汽车防盗报警系统的基础上,通过接口的扩展,实现了基于3G网络的视频监控功能,并详细阐述了摄像头的流接口函数和通信发送端的设计。此外,通过该系统的通用接口的扩展,该系统还可与具体行业或家庭应用相结合,实现手机对于小范围环境的可视化监控。该系统的设计实现不但对于汽车防盗产品的发展有着重要的意义,同时对于基于3G网络的可视化监控的发展提供了良好的应用前景。
iPhone6抢购神器降世 实时监控苹果官网供货情况
在面对iPhone6/iPhone6 Plus这两款神器的时候,就连土豪也使不上什么劲,有钱都花不出去,因为抢购iPhone6的难度已经不亚于在中国抢购春运火车票了。不过,iPhone6抢购神器也问世了!据说跟春运抢票软件有的一拼。
上一篇:淘宝客高佣金采集软件功能说明
下一篇:通王CMS 2.0简介
文章地址:https://www.tianxianmao.com/article/other/jyWindowsCEczxtdrjjgbglbf.html