3.1系统总体网络结构设计
本系统借鉴物联网的联网和控制思路,将视频监控系统中的每个摄像头连接到互联网中,并通过终端设备APP随时随地远程控制和查看楼宇实时状态。
系统中的每个摄像头都带有自己的IP,且地址独一无二,方便直接控制每个摄像头的监控方向和角度。另外,每个摄像头都是硬盘录像机的一部分,其视频流的传输分为并列两路,一路流向自带硬盘存储;另一路跳过硬盘直接流向互联网。
在物业监控室电视墙上可以查看每摄像头的采集信息,同时,PC管理主机用来处理视频数据,可实现快进、快退、不同时间点等多种查看方式。终端设备可以是平板电脑、手机等,安装终端APP后即可实现联网远程查看和控制。系统总体网络结构设计见图1
图1 系统总体网络结构
3.2 视频数据码率设计
视频的传输过程中,数据码率控制是一个重要环节,首先数据源通过编码器进行每一帧数据的编码,之后数据被送入缓存器,经过网络传输和解码最终还原视频数据,具体控制过程见图2
图2 数据码率控制框图
码率控制过程关系到数据的还原度,从而影响影像的失真率和清晰度,其控制基本原则就是保证缓存器不会出现数据溢出。本系统选择的是可变码率控制(VBR),通过调控码率实现不同分辨率数据的传输,不同帧率要求和分辨率下的码率对应关系见表1
表1 码率对应表
可变码率控制的优点在于灵活性较强,比如,夜间光线较弱的时间段可以调控为码率最高的传输方式,以获得更多的像素信息;根据楼宇监控点位的重要程度可选择不同码率的传输方式,这样可以充分节约存储空间。
3.3硬盘容量设计与带宽计算
3.3.1视频数据存储空间设计
若规划最大回放日期为d天,匹配硬盘容量的计算公式见式(1):
式中,z是硬盘录像机所匹配的存储总容量;m是比特率,代表视频数据传输的快慢,kbps;
3.3.2 带宽计算
带宽的计算需要充分考虑数据打包封装以及网路重连占用的带宽资源,上行带宽计算公式见式(3):
当
当
由于下行数据内容主要为控制指令,可不用计算下行带宽。
3.4 视频数据控制接口设计
1)系统中视频数据的解码方式为硬件解码,选择硬件解码矩阵板卡可实现相应码率下的视频数据转换与解码。
硬件解码卡直接设计到主服务器中,在视频数据通过互联网上传到主服务器的同时就可实现同步解码。解码后视频数据既可以传输到电视墙PC管理主机,也可以通过联网终端APP实现远程监控。
2)视频监控系统中,用视频流控制器实现影像同步播放功能时,一方面可以选择开放SDK接口的视频流控制器以简化设计负责程度、缩短开发周期;另一方面,主服务器可将数据分段处理并存储,并提供预览查看、参数调整、加速回放等多种管理功能。
3.5 联网终端APP软件架构设计
随着人们对现代楼宇智能安防需求的逐步提高,为提高工作效率和生活乐趣,可将安防视频监控接入互联网,并通过联网终端和物联网技术的应用,借助软、硬件平台的有效结合和多种视频设备的远程控制,为人们打造一个安全、智能的楼宇环境。
软件的整体架构包含Linux Kernel、Application以及运行库,需要编程的部分为Linux Kernel和Application。在Linux Kernel中添加新的Wi-Fi Driver和ZigBee Driver以适配和驱动新的硬件模块,在Application中直接完成通信程序、数据处理和人机交互等部分。软件架构设计方案见图3所示。
图3 联网终端APP软件架构设计
3.5.1 LwIP协议栈移植
LwIP是瑞士的AdamDunkels等开发的开源TCP/IP协议栈,此协议栈体积较小,易于移植。相对uIP、uC/IP、Linux TCP/IP协议栈,LwIP具有以下特点:
1)移植与有无系统无关。
2)内存使用量为40KB ROM和几十KB RAM。
3)参考的资料较多,并且有多重方式与应用程序通信。
4)部分实现TCP/IP协议,且有套接字。
由于LwIP对应用层的支持度方面应用较方便,在移植性方面优势较明显,且具有以上列举的优势。因此系统通过移植LwIP协议栈到此平台以实现TCP/IP协议栈。TCP/IP协议数据收发处理流程图见图4
图4 TCP/IP协议数据收发处理流程图
3.5.2 编写TCP网络数据交互文件
在房间控制器与下端各个节点间的Wi-Fi通信中,实现长久可靠的数据交换以及完成网络文件的首发还需要编写TCP/IP文件系统。
其中,TCP_Connetction.c包含以下函数:
客户端回调函数ClientTcpConnected()、
TCP/IP客户端初始化函数TCP_Clinet_Connection_init()、
TCP/IP服务器端初始化函数TCP_Connection_init()、
LwIP工作函数vETH_SimpleStateMachine_Init(),
下面给出一些TCP通信关键程序说明:
/*------------------------------------------------------------------------------------------
*函数名称:TCP_Clinet_Connection_init()
*函数功能:客户机建立TCP服务函数
*返回值: TCP_Connection_Error_TypeDef类型
-------------------------------------------------------------------------------------------*/
TCP_Connection_Error_TypeDefTCP_Clinet_Connection_init(void)
{
structtcp_pcb *New_upcb; //定义一个pcb变量
structip_addr remote_ipaddr; //定义一个服务器地址
UINT32udwRemoteIPPort; //定义一个服务器端口
udwRemoteIPPort= 5000; //服务器端口5000
New_upcb= tcp_new(); //创建一个PCB
if(New_upcb==NULL) //PCB为空判断
{
memp_free(MEMP_TCP_PCB, New_upcb);
return TCP_MemoryError;
}
tcp_setprio(New_upcb,TCP_PRIO_NORMAL); //设置PCB连接优先权
tcp_err(New_upcb,tcp_Error_callback); //设置PCB错误返回函数
if(tcp_connect(New_upcb,&remote_ipaddr,udwRemoteIPPort,ClientTcpConnected)!=ERR_OK)//PCB连接判断
{
tcp_abandon(New_upcb,0);
memp_free(MEMP_TCP_PCB, New_upcb);
return TCP_ConnectionError;
}
Currentpcb= New_upcb;
returnTCP_OK; //返回TCP连接返回值
}
/*------------------------------------------------------------------------------------------
*函数名称:TCP_Connection_init()
*函数功能:主机建立TCP服务函数
*返回值: TCP_Connection_Error_TypeDef类型
------------------------------------------------------------------------------------------*/
TCP_Connection_Error_TypeDefTCP_Connection_init(void)
{
structtcp_pcb *New_upcb; //定义一个PCB变量
Demo_upcb= tcp_new(); //创建一个PCB
if(Demo_upcb==NULL) //PCB为空判断
{
return TCP_MemoryError;
}
New_upcb= tcp_listen_with_backlog(Demo_upcb, Incoming_Queue_Limit);
udwListenTimes++; //监听事件累加
if(New_upcb==NULL) //监听为空,释放此PCB
{
memp_free(MEMP_TCP_PCB, Demo_upcb);
return TCP_MemoryError;
}
Else
{
Demo_upcb = New_upcb;
}
tcp_arg(Demo_upcb,NULL); //PCB参数设置清空
tcp_accept(Demo_upcb,tcp_Accept_callback); //设置PCB错误返回函数
returnTCP_OK; //返回TCP连接返回值
}
联系客服