1、应用软件设计和功能实现说明文档1 车载监控系统概述整套监控系统将包括车载设备、网络服务器、客户端三大组成部分。客户端通过服务器的中转与车载设备间接通信,以实现从车载设备接收监控信息和向车载设备发送控制指令等。所预计的主要功能将包括视频音频监控,酒精检测,传感器报警,语音对讲,远程云台控制等。车载设备通过3G无线数据模块无线接入网络,以实现车载移动监控。系统部署图 整个系统部署结构如图,其中:车载设备连接模拟摄像机,并通过3G数据模块拨号连接网络。实现视频音频采集,可以把实时音频视频发送至服务器。并且可以挂接硬盘存储设备,把采集的视频和音频存储至硬盘。存储的视频可通过网络点播,并可以通过模拟输出
2、端口直接把存储的视频音频输出到电视机进行播放,播放时有图形操作界面。车载设备的通过带酒精度传感器的外接设备进行酒精检测。酒精检测后将检测数值传到服务器,并发送提醒短信到用户手机。在本地对酒精值进行分析和声音播报。车载设备的报警传感器安装在需要的位置,检测到非法入侵时,可通过3G模块以发送手机短信的方法通知用户。车载设备可从服务器接收音频数据并且进行播放。服务器可将车载设备的视频音频数据转发至客户端,可以把来自客户端的指令信息和音频数据转发至车载设备。客户端可接收视频音频数据并进行播放,可以控制车载设备的摄像机云台,可以通过话筒向车载设备讲话。 客户端与网络服务器逻辑分开,服务器可以同时连接多个
3、车载设备和多个客户端。并把每个客户端与该客户的若干设备对应。根据实际需要,PC客户端也可以并入服务器系统。1.1 系统功能流程1.服务器监听连接请求,服务器分别通过针对双方的TCP控制端口监听来自监控前端和来自客户端的TCP连接。2.前端设备注册,当有监控前端连接到服务器后,监控前端会发送注册指令信息到服务器,指令信息中的数据区包含设备号信息。并连接到语音流转发TCP端口。服务器将该设备注册为在线设备。3.客户端登陆,当客户端连接到服务器后,客户端会发送指令信息到服务器,指令信息中的数据区包含用户名和密码。服务器需对登陆请求进行处理,发送应答信息,接受或者拒绝。若拒绝,应答指令中数据区包含错误
4、信息,用户名密码错误或者设备被占用等。登陆成功后向服务器连接视音频流接收TCP端口,此端口校验成功后连接。并开启一个UDP端口监听来自该客户端的语音流。4.用户设备列表,用户成功登陆后,服务器需对该用户有权限访问的在线设备列表,并将列表发送至客户端。指令信息中的数据区中存放设备列表信息。5.用户指令转发,用户对某个前端发送控制指令时,将指令转发到对应的监控前端。6.视音频传输,当服务器接收到视频请求指令后,服务器开启TCP端口监听来自前端的连接请求。前端设备通过此TCP端口连接服务器,服务器接收到来自监控前端的音频、视频流时,通过视频音频流转发专用TCP端口,将数据转发至对应的客户端。7.用户
5、指令处理,当从客户端对服务器发送指令时,服务器接收并处理。例如用户修改密码,数据区会包括新的密码,服务器需要进行数据库更新。8.语音对讲,当收到语音对讲指令时,服务器开启一个UDP端口监听来自客户端的数据流,并通过语音流转发专用TCP端口转发至对应的前端。9.断开连接,TCP连接断开后,注销设备,并通过该端口继续监听。1.2 数据流程图 灰色底纹字体表示的数据服务器不做处理,只转发数据。车载视频监控系统的数据流程图2 车载前端方案概述 车载设备配备视音频处理芯片,可以连接最多4路摄像机,可连接GPS设备和报警传感器等设备,在Linux系统上运行车载监控端的应用程序,实现各功能模块。通过3G无线
6、数据模块联网,与服务器进行连接。并通过服务器把与客户端进行数据交互,包括音视频流的发送,指令消息的收发,音频数据的接收。车载设备在客户端请求任一路或多路实时视频音频时,将视频音频编码后进行封装,通过服务器转发给客户端;也可应客户端请求查找并调用本地存储的视频音频数据,发送至客户端。客户端可接收来自客户端的音频数据并解码播放。设备启动时或接受到客户端指令时,会进行酒精检测。车载设备系统架构图3 前端软件功能模块1.视频处理模块,实现多路实时视频数据采集、图像处理、基于H.264技术的编解码压缩与数据存储;可进行存储数据的查找和调用。可通过模拟视频输出端口对存储的视频进行播放。车载设备从摄像机采集
7、视频音频数据,并将每一个摄像机获取的视频数据缩放为2种分辨率视频流,一路高清视频数据压缩后的数据保存在本地硬盘,另外一路较低分辨率的可压缩后通过网络传输到服务器。2.音频处理模块,实现多路实时音频数据采集,基于G.711-u技术的编解码压缩,编码后的数据进行本地存储,也可通过网络传输;存储数据的查找和调用。可通过模拟音频输出端口对存储的音频进行播放。3.网络通信模块,设备启动时通过3G数据模块使用ppp协议拨号接入网络,与网络服务器进行连接。把数据进行封装,通过服务器与客户端间接通信,进行数据交互。并可通过AT指令发送手机短信。4.网络指令处理模块,系统启动后采用TCP协议向服务器连接,建立T
8、CP指令通道,通道建立后先向服务器发送注册信息。之后进行监听,从服务器接收转发自客户端的指令,并进行处理。5.云台控制模块,接受到云台控制指令后,进行处理。采用RS485通信接口通信控制云台,实现云台控制。6.酒精检测模块,在设备启动后或接到客户端的指令后,进行酒精检测。酒精检测后将检测数值传到服务器,并发送提醒短信到用户手机。并在本地对酒精值进行分析和声音播报。7.自动报警模块,红外传感器被触发后,系统可检测到并经由3G模块发送报警手机短信。8.语音对讲模块,可接收来自客户端的语音流,采用G.711-u算法解码并实现播放。5.软件结构与功能实现说明PC客户端功能概述应用软件采用多线程实现,X
9、xx_tsk.c中包含每个独立线程。1.int xxx_tskCreate( CAPTURE_CreatePrm *prm) 创建线程结构,为线程分配内存。 OSA_cmemAlloc() 申请内存空间。 OSA_cmemAllocCached () 申请内存空间(缓存模式)。 OSA_cmemGetPhysAddr() 映射物理地址。2.int xxx_tskDelete()清除线程占用的内存。 OSA_cmemFree() 释放内存区。3.int xxx_tskRun()线程处理入口函数 Int xxx_tskMain()线程的主函数 OSA_msgGetPrm() 读取指令存储队列OSA
10、_tskWaitMsg() 监听线程控制指令 OSA_tskAckOrFreeMsg() 清空指令存储区当前指令4.Int xxx_sendCmd()发送线程控制指令 OSA_mbxSendMsg() 发送指令到指令存储区5.int xxx_create(xxx_CreatePrm *prm)创建线程 OSA_tskCreate() 创建线程,运行处理主函数 OSA_mbxCreate() 创建线程指令存储队列6.int xxx_delete()删除线程 OSA_tskDelete() 删除线程 OSA_mbxDelete() 删除线程指令存储区视频采集视频处理的实现涉及3个线程。视频采集线程
11、、视频编码线程和存储处理线程。图 4-1 视频处理模块流程图Capture_tsk.c中是视频采集线程的实现,包括视频数据采集和缩放。1.通过MCVIP_getBuf(),MCVIP_getBufInfo()两个函数获取经tvp5158芯片采集得到的yuv422图像数据。实现VIDIOC_DQBUF,出队列以取得已采集数据的帧缓冲,取得原始采集数据。2.再通过MCVIP_putBuf()实现VIDIOC_QBUF,将缓冲重新入队列尾,这样可以循环采集。3.CAPTURE_tskProcessFrame()中做的是视频图像的缩放。通过ENCODE_getEmptyBuf()申请视频编码缓冲队列中
12、的空buffer,将输出buffer设置为编码压缩的输入区。ENCODE_putFullBuf()将存储有处理后数据的buffer入视频编码队列。4.支持2路输出缩放,可做双码流输出。5.CAPTURE_tskCalcReszClkDiv()传入参数。6.DRV_reszRun()进行缩放。缩放后的数据在ENCODE_getEmptyBuf()申请的buffer中等待压缩。视频压缩Encode_tsk.c中为视频压缩线程的实现。Encode_tsk.c中采集缩放后通过Encode_sendCmd()发送ENCODE_CMD_RUN指令,控制压缩函数的执行压缩多帧图像。1.设置压缩分辨率vidE
13、ncCreatePrm.width = vidEncCreatePrm.height = vidEncCreatePrm.offsetH = vidEncCreatePrm.offsetV = 2.设置压缩比特率,即编码码率pChInfo-newBitrate =3.通过OSA_bufGetFull()和OSA_bufGetBufInfo()申请视频编码缓冲队列内的一个buffer出队列,作为编码器输入buffer。编码后OSA_bufPutEmpty()将缓冲区入编码缓冲队列。4.WRITER_getEmptyBuf()申请存储缓冲队列中的空buffer,将输出buffer设置为存储的输入区
14、。WRITER_putFullBuf()将存储有处理后数据的buffer入存储队列。5.ALG_vidEncRun()进行压缩。压缩后的数据在WRITER_getEmptyBuf()申请的buffer中等待存储和网传。音频采集压缩图4-2 音频处理流程图音频采用G.711-方式编码。在Audio_tsk.c中为音频采集编码线程。1.gAUDIO_ctrl.pCreatePrm()为 MCVIP_CreatePrm()类型的结构体,其中包含了声音参数设置。2.AUDIO_Record()调用MCVIP_audioRecord()获取音频数据。3.AudioWRITER_getEmptyBuf()
15、申请音频存储缓冲队列中的空buffer,将输出buffer设置为存储的输入区。AudioWRITER_putFullBuf()将存储有处理后数据的buffer入音频存储队列。4.AUDIO_audioEncode()压缩音频数据。编码后的数据在AudioWRITER _getEmptyBuf()申请的buffer中等待压缩。流媒体存储Writer_tsk.c中为视频和音频的存储线程的实现。Encode_tsk.c中编码结束后通过WRITER_sendCmd()发送WRITER_CMD_RUN和AUDWRITER_CMD_RUN指令控制流媒体存储线程中存储函数的执行。1.每一帧视频编码后WRIT
16、ER_putFullBuf()调用WRITER_sendCmd()发送指令WRITER_CMD_RUN到指令队列。WRITER_tskRun()中通过OSA_bufGetFull()和OSA_bufGetBufInfo()申请视频存储缓冲队列内的一个buffer出队列,存储后调用OSA_bufPutEmpty()将存储缓冲区入视频存储队列。2.每一帧视频编码后AudioWRITER_putFullBuf()调用WRITER_sendCmd()发送指令AUDWRITER_CMD_RUN到指令队列。AudWRITER_tskRun()中通过OSA_bufGetFull()和OSA_bufGetBu
17、fInfo()申请音频存储缓冲队列内的一个buffer出队列,存储后调用OSA_bufPutEmpty()将存储缓冲区入音频存储队列。3.WRITER_fileSaveRun()进行流媒体存储。在存储的同时,调用函数videostreamFunc()进行网络视频传输,audiostreamFunc()进行网络音频传输。网络通信图5-4 指令通信处理流程图Rawsockio.c中是网络通信的实现。LSOCK为指令通信通道。CSOCK为语音接收通道。DSOCK为流媒体发送通道。1.MainSocketConnect()中创建了3个TCP套接字。设置3个套接字的参数。connect_to_serve
18、r()中实现了本地向服务器的连接。2.ReadSocketData()为建立连接后对数据接收处理的实现。LSOCK对接收的数据进行处理,通过*msgfunccmd函数指针调用指令处理函数。CSOCK调用AUDIO_tskTalkBack()对语音流数据进行循环接收,解码播放。DSOCK不做接受,建立后等待通过该通道发送流媒体数据。指令处理Msghandler.c中定义了网络指令与指令处理入口函数的映射表。通过*msgfunccmd调用指令对应的指令处理函数。Process.c中是各指令处理函数的实现。流媒体传输1.Vstream.c文件中videostreamFunc()为视频网络传输的实现。
19、SystemInfo.StreamEnable为视频网络传输的标识开关。当接受到视频网络传输的指令并建立传输通道口,变开启视频传输。2.Astream.c文件中audiostreamFunc()为音频网络传输的实现。SystemInfo.aStreamEnable为音频网络传输的标识开关。当接受到音频网络传输的指令并建立传输通道口,便开启音频传输。3.数据包格式数据包头为3字节:typedef struct _TEST_PACK_HEAD unsigned char FrameType; /帧格式 视频I帧、P帧、音频帧 unsigned short PackLoadLength; /载荷数据
20、长度TEST_PACK_HEAD; 载荷数据长度最大为1024字节。载荷数据超过1021字节的话进行帧切割操作。酒精检测图5-5 酒精检测流程图Wine_tsk.c中是酒精检测线程的实现。/dev/ttyS0是RS485设备文件,通过RS485接收读取酒精检测设备的数值。/dev/dm365_gpios是GPIO设备文件,用于读取IO口数值。1.set_speed()和set_parity()函数用于设置RS485参数。2.通过设置IO口值控制RS485读取,然后读取RS485接收的酒精参数。格式为“w+酒精值+饮酒程度”。3.接收数值后进行分析。然后通过AUDIO_audioDecode()
21、和AudioPlayback()解码并播放声音提示文件。4.通过TCP指令通信通道向客户端发送测试报告指令,并调用sendMessage()发送短信报警。红外检测图5-6 红外检测流程图 Gpio_tsk.c中是网络通信的实现。1系统运行后线程开始执行,GPIO设备fdser = open(/dev/dm365_gpios, O_RDWR);2进行循环读取IO口数据 count=read(fd1,buf,6); /读取IO数据 接收数值后进行分析。然后可通过AUDIO_audioDecode()和AudioPlayback()解码并播放声音提示文件。 通过TCP指令通信通道向客户端发送报警指令,并调用sendMessage()发送短信报警。3短信发送通过3G网卡进行。 fd=open(/dev/ttyUSB2,O_RDWR | O_NOCTTY); /打开3G数据设备 通过AT指令发送短信,使用pdu方式发送中文短信。