应用软件设计与功能实现说明文档.docx
《应用软件设计与功能实现说明文档.docx》由会员分享,可在线阅读,更多相关《应用软件设计与功能实现说明文档.docx(25页珍藏版)》请在冰豆网上搜索。
![应用软件设计与功能实现说明文档.docx](https://file1.bdocx.com/fileroot1/2023-7/2/bb358c2d-a41d-416b-b3ee-dd4b8a268d7d/bb358c2d-a41d-416b-b3ee-dd4b8a268d7d1.gif)
应用软件设计与功能实现说明文档
1车载监控系统概述
整套监控系统将包括车载设备、网络服务器、客户端三大组成部分。
客户端通过服务器的中转与车载设备间接通信,以实现从车载设备接收监控信息和向车载设备发送控制指令等。
所预计的主要功能将包括视频音频监控,酒精检测,传感器报警,语音对讲,远程云台控制等。
车载设备通过3G无线数据模块无线接入网络,以实现车载移动监控。
系统部署图
整个系统部署结构如图,其中:
Ø车载设备连接模拟摄像机,并通过3G数据模块拨号连接网络。
实现视频音频采集,可以把实时音频视频发送至服务器。
并且可以挂接硬盘存储设备,把采集的视频和音频存储至硬盘。
存储的视频可通过网络点播,并可以通过模拟输出端口直接把存储的视频音频输出到电视机进行播放,播放时有图形操作界面。
Ø车载设备的通过带酒精度传感器的外接设备进行酒精检测。
酒精检测后将检测数值传到服务器,并发送提醒短信到用户手机。
在本地对酒精值进行分析和声音播报。
Ø车载设备的报警传感器安装在需要的位置,检测到非法入侵时,可通过3G模块以发送手机短信的方法通知用户。
Ø车载设备可从服务器接收音频数据并且进行播放。
Ø服务器可将车载设备的视频音频数据转发至客户端,可以把来自客户端的指令信息和音频数据转发至车载设备。
Ø客户端可接收视频音频数据并进行播放,可以控制车载设备的摄像机云台,可以通过话筒向车载设备讲话。
客户端与网络服务器逻辑分开,服务器可以同时连接多个车载设备和多个客户端。
并把每个客户端与该客户的若干设备对应。
根据实际需要,PC客户端也可以并入服务器系统。
1.1系统功能流程
1.服务器监听连接请求,服务器分别通过针对双方的TCP控制端口监听来自监控前端和来自客户端的TCP连接。
2.前端设备注册,当有监控前端连接到服务器后,监控前端会发送注册指令信息到服务器,指令信息中的数据区包含设备号信息。
并连接到语音流转发TCP端口。
服务器将该设备注册为在线设备。
3.客户端登陆,当客户端连接到服务器后,客户端会发送指令信息到服务器,指令信息中的数据区包含用户名和密码。
服务器需对登陆请求进行处理,发送应答信息,接受或者拒绝。
若拒绝,应答指令中数据区包含错误信息,用户名密码错误或者设备被占用等。
登陆成功后向服务器连接视音频流接收TCP端口,此端口校验成功后连接。
并开启一个UDP端口监听来自该客户端的语音流。
4.用户设备列表,用户成功登陆后,服务器需对该用户有权限访问的在线设备列表,并将列表发送至客户端。
指令信息中的数据区中存放设备列表信息。
5.用户指令转发,用户对某个前端发送控制指令时,将指令转发到对应的监控前端。
6.视音频传输,当服务器接收到视频请求指令后,服务器开启TCP端口监听来自前端的连接请求。
前端设备通过此TCP端口连接服务器,服务器接收到来自监控前端的音频、视频流时,通过视频音频流转发专用TCP端口,将数据转发至对应的客户端。
7.用户指令处理,当从客户端对服务器发送指令时,服务器接收并处理。
例如用户修改密码,数据区会包括新的密码,服务器需要进行数据库更新。
8.语音对讲,当收到语音对讲指令时,服务器开启一个UDP端口监听来自客户端的数据流,并通过语音流转发专用TCP端口转发至对应的前端。
9.断开连接,TCP连接断开后,注销设备,并通过该端口继续监听。
1.2数据流程图
灰色底纹字体表示的数据服务器不做处理,只转发数据。
监控前端
服务器
设备ID
前端交互
发送注册信息
接收控制指令
监控前端注册
转发控制指令
TCP
转发语音流
接收语音流
TCP
TCP
接收
视频流
音频流
输出
视频流
音频流
客户端
客户端交互
登陆服务器
发送用户指令
接收设备列表
发送控制指令
用户校验登陆
用户管理
发送设备列表
接收控制指令
TCP
TCP
接收
视频流
音频流
转发
视频流
音频流
发送
语音流
UDP
接收
语音流
数据库
用户信息:
用户ID
登陆密码
所有权限
车载视频监控系统的数据流程图
2车载前端方案概述
车载设备配备视音频处理芯片,可以连接最多4路摄像机,可连接GPS设备和报警传感器等设备,在Linux系统上运行车载监控端的应用程序,实现各功能模块。
通过3G无线数据模块联网,与服务器进行连接。
并通过服务器把与客户端进行数据交互,包括音视频流的发送,指令消息的收发,音频数据的接收。
车载设备在客户端请求任一路或多路实时视频音频时,将视频音频编码后进行封装,通过服务器转发给客户端;也可应客户端请求查找并调用本地存储的视频音频数据,发送至客户端。
客户端可接收来自客户端的音频数据并解码播放。
设备启动时或接受到客户端指令时,会进行酒精检测。
车载设备系统架构图
3前端软件功能模块
1.视频处理模块,实现多路实时视频数据采集、图像处理、基于H.264技术的编解码压缩与数据存储;可进行存储数据的查找和调用。
可通过模拟视频输出端口对存储的视频进行播放。
车载设备从摄像机采集视频音频数据,并将每一个摄像机获取的视频数据缩放为2种分辨率视频流,一路高清视频数据压缩后的数据保存在本地硬盘,另外一路较低分辨率的可压缩后通过网络传输到服务器。
2.音频处理模块,实现多路实时音频数据采集,基于G.711-u技术的编解码压缩,编码后的数据进行本地存储,也可通过网络传输;存储数据的查找和调用。
可通过模拟音频输出端口对存储的音频进行播放。
3.网络通信模块,设备启动时通过3G数据模块使用ppp协议拨号接入网络,与网络服务器进行连接。
把数据进行封装,通过服务器与客户端间接通信,进行数据交互。
并可通过AT指令发送手机短信。
4.网络指令处理模块,系统启动后采用TCP协议向服务器连接,建立TCP指令通道,通道建立后先向服务器发送注册信息。
之后进行监听,从服务器接收转发自客户端的指令,并进行处理。
5.云台控制模块,接受到云台控制指令后,进行处理。
采用RS485通信接口通信控制云台,实现云台控制。
6.酒精检测模块,在设备启动后或接到客户端的指令后,进行酒精检测。
酒精检测后将检测数值传到服务器,并发送提醒短信到用户手机。
并在本地对酒精值进行分析和声音播报。
7.自动报警模块,红外传感器被触发后,系统可检测到并经由3G模块发送报警手机短信。
8.语音对讲模块,可接收来自客户端的语音流,采用G.711-u算法解码并实现播放。
5.软件结构与功能实现说明
PC客户端功能概述
应用软件采用多线程实现,Xxx_tsk.c中包含每个独立线程。
1.intxxx_tskCreate(CAPTURE_CreatePrm*prm)
创建线程结构,为线程分配内存。
OSA_cmemAlloc()申请内存空间。
OSA_cmemAllocCached()申请内存空间(缓存模式)。
OSA_cmemGetPhysAddr()映射物理地址。
2.intxxx_tskDelete()
清除线程占用的内存。
OSA_cmemFree()释放内存区。
3.intxxx_tskRun()
线程处理入口函数
Intxxx_tskMain()
线程的主函数
OSA_msgGetPrm()读取指令存储队列
OSA_tskWaitMsg()监听线程控制指令
OSA_tskAckOrFreeMsg()清空指令存储区当前指令
4.Intxxx_sendCmd()
发送线程控制指令
OSA_mbxSendMsg()发送指令到指令存储区
5.intxxx_create(xxx_CreatePrm*prm)
创建线程
OSA_tskCreate()创建线程,运行处理主函数
OSA_mbxCreate()创建线程指令存储队列
6.intxxx_delete()
删除线程
OSA_tskDelete()删除线程
OSA_mbxDelete()删除线程指令存储区
视频采集
视频处理的实现涉及3个线程。
视频采集线程、视频编码线程和存储处理线程。
图4-1视频处理模块流程图
Capture_tsk.c中是视频采集线程的实现,包括视频数据采集和缩放。
1.通过MCVIP_getBuf(),MCVIP_getBufInfo()两个函数获取经tvp5158芯片采集得到的yuv422图像数据。
实现VIDIOC_DQBUF,出队列以取得已采集数据的帧缓冲,取得原始采集数据。
2.再通过MCVIP_putBuf()实现VIDIOC_QBUF,将缓冲重新入队列尾,这样可以循环采集。
3.CAPTURE_tskProcessFrame()中做的是视频图像的缩放。
通过ENCODE_getEmptyBuf()申请视频编码缓冲队列中的空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.设置压缩分辨率
vidEncCreatePrm.width=
vidEncCreatePrm.height=
vidEncCreatePrm.offsetH=
vidEncCreatePrm.offsetV=
2.设置压缩比特率,即编码码率
pChInfo->newBitrate=
3.通过OSA_bufGetFull()和OSA_bufGetBufInfo()申请视频编码缓冲队列内的一个buffer出队列,作为编码器输入buffer。
编码后OSA_bufPutEmpty()将缓冲区入编码缓冲队列。
4.WRITER_getEmptyBuf()申请存储缓冲队列中的空buffer,将输出buffer设置为存储的输入区。
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()申请音频存储缓冲队列中的空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.每一帧视频编码后WRITER_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_bufGetBufInfo()申请音频存储缓冲队列内的一个buffer出队列,存储后调用OSA_bufPutEmpty()将存储缓冲区入音频存储队列。
3.WRITER_fileSaveRun()进行流媒体存储。
在存储的同时,调用函数videostreamFunc()进行网络视频传输,audiostreamFunc()进行网络音频传输。
网络通信
图5-4指令通信处理流程图
Rawsockio.c中是网络通信的实现。
LSOCK为指令通信通道。
CSOCK为语音接收通道。
DSOCK为流媒体发送通道。
1.MainSocketConnect()中创建了3个TCP套接字。
设置3个套接字的参数。
connect_to_server()中实现了本地向服务器的连接。
2.ReadSocketData()为建立连接后对数据接收处理的实现。
LSOCK对接收的数据进行处理,通过*msgfunc[cmd]函数指针调用指令处理函数。
CSOCK调用AUDIO_tskTalkBack()对语音流数据进行循环接收,解码播放。
DSOCK不做接受,建立后等待通过该通道发送流媒体数据。
指令处理
Msghandler.c中定义了网络指令与指令处理入口函数的映射表。
通过*msgfunc[cmd]调用指令对应的指令处理函数。
Process.c中是各指令处理函数的实现。
流媒体传输
1.Vstream.c文件中videostreamFunc()为视频网络传输的实现。
SystemInfo.StreamEnable为视频网络传输的标识开关。
当接受到视频网络传输的指令并建立传输通道口,变开启视频传输。
2.Astream.c文件中audiostreamFunc()为音频网络传输的实现。
SystemInfo.aStreamEnable为音频网络传输的标识开关。
当接受到音频网络传输的指令并建立传输通道口,便开启音频传输。
3.数据包格式
数据包头为3字节:
typedefstruct_TEST_PACK_HEAD
{
unsignedcharFrameType;//帧格式视频I帧、P帧、音频帧
unsignedshortPackLoadLength;//载荷数据长度
}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()和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方式发送中文短信。
当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。
于是,我降临在了人间。
我出生在一个官僚知识分子之家,父亲在朝中做官,精读诗书,母亲知书答礼,温柔体贴,父母给我去了一个好听的名字:
李清照。
小时侯,受父母影响的我饱读诗书,聪明伶俐,在朝中享有“神童”的称号。
小时候的我天真活泼,才思敏捷,小河畔,花丛边撒满了我的诗我的笑,无可置疑,小时侯的我快乐无虑。
“兴尽晚回舟,误入藕花深处。
争渡,争渡,惊起一滩鸥鹭。
”青春的我如同一只小鸟,自由自在,没有约束,少女纯净的心灵常在朝阳小,流水也被自然洗礼,纤细的手指拈一束花,轻抛入水,随波荡漾,发髻上沾着晶莹的露水,双脚任水流轻抚。
身影轻飘而过,留下一阵清风。
可是晚年的我却生活在一片黑暗之中,家庭的衰败,社会的改变,消磨着我那柔弱的心。
我几乎对生活绝望,每天在痛苦中消磨时光,一切都好象是灰暗的。
“寻寻觅觅冷冷清清凄凄惨惨戚戚”这千古叠词句就是我当时心情的写照。
最后,香消玉殒,我在痛苦和哀怨中凄凉的死去。
在天堂里,我又见到了上帝。
上帝问我过的怎么样,我摇摇头又点点头,我的一生有欢乐也有坎坷,有笑声也有泪水,有鼎盛也有衰落。
我始终无法客观的评价我的一生。
我原以为做一个着名的人,一生应该是被欢乐荣誉所包围,可我发现我错了。
于是在下一轮回中,我选择做一个平凡的人。
我来到人间,我是一个平凡的人,我既不着名也不出众,但我拥有一切的幸福:
我有温馨的家,我有可亲可爱的同学和老师,我每天平凡而快乐的活着,这就够了。
天儿蓝蓝风儿轻轻,暖和的春风带着春的气息吹进明亮的教室,我坐在教室的窗前,望着我拥有的一切,我甜甜的笑了。
我拿起手中的笔,不禁想起曾经作诗的李清照,我虽然没有横溢的才华,但我还是拿起手中的笔,用最朴实的语言,写下了一时的感受:
人生并不总是完美的,每个人都会有不如意的地方。
这就需要我们静下心来阅读自己的人生,体会其中无尽的快乐和与众不同。
“富不读书富不久,穷不读书终究穷。
”为什么从古到今都那么看重有学识之人?
那是因为有学识之人可以为社会做出更大的贡献。
那时因为读书能给人带来快乐。
自从看了《丑小鸭》这篇童话之后,我变了,变得开朗起来,变得乐意同别人交往,变得自信了……因为我知道:
即使现在我是只“丑小鸭”,但只要有自信,总有一天我会变成“白天鹅”的,而且会是一只世界上最美丽的“白天鹅”……
我读完了这篇美丽的童话故事,深深被丑小鸭的自信和乐观所折服,并把故事讲给了外婆听,外婆也对童话带给我们的深刻道理而惊讶不已。
还吵着闹着多看几本名着。
于是我给外婆又买了几本名着故事,她起先自己读,读到不认识的字我就告诉她,如果这一面生字较多,我就读给她听整个一面。
渐渐的,自己的语文阅读能力也提高了不少,与此同时我也发现一个人读书的乐趣远不及两个人读的乐趣大,而两个人读书的乐趣远不及全家一起读的乐趣大。
于是,我便发展“业务”带动全家一起读书……现在,每每遇到好书大家也不分男女老少都一拥而上,争先恐后“抢书”,当我说起我最小应该让我的时候,却没有人搭理我。
最后还把书给撕坏了,我生气地哭了,妈妈一边安慰我一边对外婆说:
“孩子小,应该让着点。
”外婆却不服气的说:
“我这一把年纪的了,怎么没人让我呀?
”大家人你一言我一语,谁也不肯相让……读书让我明白了善恶美丑、悲欢离合,读一本好书,犹如同智者谈心、谈理想,教你辨别善恶,教你弘扬正义。
读一本好书,如品一杯香茶,余香缭绕。
读一本好书,能使人心灵得到净化。
书是我的老师,把知识传递给了我;书是我的伙伴,跟我诉说心里话;书是一把钥匙,给我敞开了知识的大门;书更是一艘不会沉的船,引领我航行在人生的长河中。
其实读书的真真乐趣也就在于此处,不是一个人闷头苦读书;也不是读到好处不与他人分享,独自品位;更不是一个人如痴如醉地沉浸在书的海洋中不能自拔。
而是懂得与朋友,家人一起分享其中的乐趣。
这才是读书真正之乐趣呢!
这所有的一切,不正是我从书中受到的教益吗?
我阅读,故我美丽;我思考,故我存在。
我从内心深处真切地感到:
我从读书中受到了教益。
当看见有些同学宁可买玩具亦不肯买书时,我便想到培根所说的话:
“世界上最庸俗的人是不读书的人,最吝啬的人是不买书的人,最可怜的人是与书无缘的人。
”许许多多的作家、伟人都十分喜欢看书,例如毛泽东主席,他半边床上都是书,一读起书来便进入忘我的境界。
书是我生活中的好朋友,是我人生道路上的航标,读书,读好书,是我无怨无悔的追求。