视频监控安防平台-GB28181-系统目录查询TCP协议和系统录像文件检索TCP协议

本文主要是介绍视频监控安防平台-GB28181-系统目录查询TCP协议和系统录像文件检索TCP协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                   视频监控安防平台-GB28181-系统目录查询TCP协议和系统录像文件检索TCP协议

国标28181-2016检测的时候标准规定了平台必须支持系统目录查询和系统录像文件检索回应必须支持TCP,主要是由于这两个的资源数量比较多,采用TCP比较更安全可靠,tcp发送流程简单讲就是收到目录查询或则录像文件检索的时候,建立一个临时的tcpclient去连接平台地址,将目录回应的信息和录像文件检索的信息全部发送到上级(这里注意每次发送的大小最好不要超过10M),收到上级回复的200OK再发生下一组资源列表。下面简单讲解下两个流程,两个流程都采用的是有应答设备控制流程:


命令流程描述如下:
a ) 1 : 源设备向 S I P 服务器发送设备控制命令, 设备控制命令采用 M e s s a g e 方法携带;
b ) 2 : S I P 服务器收到命令后返回 2 0 0OK ;
c ) 3 : S I P 服务器向目标设备发送设备控制命令, 设备控制命令采用 M e s s a g e 方法携带;
d ) 4 : 目标设备收到命令后返回 2 0 0OK ;
e ) 5 : 目标设备向 S I P 服务器发送设备控制响应命令, 设备控制响应命令采用 M e s s a g e 方法携带;
f ) 6 : S I P 服务器收到命令后返回 2 0 0OK ;
g ) 7 : S I P 服务器向源设备转发设备控制响应命令, 设备控制响应命令采用 M e s s a g e 方法携带;
h ) 8 : 源设备收到命令后返回 2 0 0OK 。
消息示范见 J .

粘贴一下系统目录查询检测的图片:



录像文件检索截图:



下面粘贴一下系统目录查询和系统录像文件检索tcp管理的发送代码逻辑,支持多个tcp连接:


// 版权说明, 2010-2020, // 文件名 :   SipTcpConnectMgr.h
// 作  者 :
// 版  本 :   1.0
// 日  期 :   2016-07-08
// 功能描述:  和上级平台建立tcp短连接的管理  接收数据和发送数据处理
// 其他说明:  
//
// 修改历史:
// 日期(YYYY-MM-DD)     版本        修改人        修改内容
//       2016-07-08		  1.0		  宋小文 	    初始创建#ifndef __SIP_TCP_CONNECT_MGR_H__
#define __SIP_TCP_CONNECT_MGR_H__using namespace std;#include "StrHash.h"
#include "TypeDef.h"
#include "publicid.h"
#include "structs.h"
#include "Log.h"
#include "Module.h"
#include "SysIf.h"
#include "MsgCenter.h"
#include "SPushCatalog.h"
#include "jthread.h"
#include <sys/socket.h>#include "osip2/osip.h"
#include "osipparser2/osip_list.h"
#include "eXosip2/eXosip.h"
#include "osipparser2/osip_uri.h"
//#include "eXosip2.h"
//#include "ABase.h"using namespace jthread;
/* ASC-II char mapped table */
#define TCP_CHAR_LIST_NUMBER 62
static const char TCP_CHAR_LIST_MAP[TCP_CHAR_LIST_NUMBER] = 
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};#define TCP_MAX_CONNECT_TIME    60 //建立TCP最大的时间,超过将删除tcp连接   从最后一次发送tcp包时间算起  stypedef enum
{TC_NOTIFY_CATALOG,		//tcp 发送notify 目录资源TC_MESSAGE_CATALOG,		//tcp发送message目录资源TC_MESSAGE_RECOED		//tcp发送message录像查询
}TcpSendType_E;class CSipTcpConnect: public JThread
{
public:CSipTcpConnect(void);~CSipTcpConnect(void);public:bool Init(const char *pEpAor, const char* pDsIp, int nPort);void Unit(void);void SetSubNotifyInfo(osip_call_id_t *pCall_id, osip_from_t *pFrom, osip_to_t *pTo, TSendNotifyInfo NotifyInfo);int SendSipPacket(void *pData, TcpSendType_E etype);bool IsTimeOut();void SetTcpPushPolicy(UpperPolicy_T	PushPolicy){TcpPushPolicy = PushPolicy;}
private:int Connect(const char* pDsIp, int nPort);void SipTcpStickyPacket(const char *pData, int len);int RecvFullSipPacket(char *pData, int len);int Recv(int h, char* buff, int len, int timeout);void RecvAndParse(void);int SendMessage(string strMessage, TcpSendType_E etype = TC_MESSAGE_CATALOG);int SendSubNotify(const char* pXmlStr, TcpSendType_E etype = TC_NOTIFY_CATALOG);int SendTcpData(osip_message_t* pSipMsg, TcpSendType_E etype, bool bCloneCallid = true);int CloneCallId(const osip_call_id_t* pCallId, TcpSendType_E etype = TC_MESSAGE_CATALOG);bool IsTheSameCallId(osip_call_id_t *pCallId, TcpSendType_E etype = TC_MESSAGE_CATALOG);unsigned int TcpGetCSeq(void);unsigned int TcpGenerateRandom(UINT32 i1, UINT32 i2);char* TcpGenerateRandomCallID(char* pStr);char* TcpGenerateRandomBranchParam(char* pStr);char* TcpGenerateRandomTag(char* pStr);int TcpBuildSipNotify(osip_message_t*& pDest, const char Method[], const osip_from_t* pFrom, const osip_to_t* pTo, const osip_call_id_t* pCallId, const osip_list_t* pRoute, const osip_contact_t* pContact);int TcpBuildSipRequest(osip_message_t*& pDest, const char Method[], const char *pFrom, const char *pTo, const char Contact[], const char *pRoute, char* Proxy = NULL);
private://Jstream Entry Pointvoid* Thread(void);void  ThreadQuit(void);
public:	char 			m_DevPubID[PUBID_TOTAL_LEN+1];  	//上级平台或则客户端的 地址编码 唯一标识符	//TraverseAddr_T  TvsAddr;
private:int 			m_ConnectTime; 						//tcp 连接的时间,每次发送数据 更新相应的时间TcpSendType_E	m_eTcpSendType;						//tcp发送数据的类型bool  			ExitFlag;int 			m_SocketFd;							//建立TCP的句柄		//char 			From[SIP_AOR_MAX_SIZE+1];			//SIP消息的from信息//char 			To[SIP_AOR_MAX_SIZE+1];				//SIP消息的to信息//char 			Route[SIP_AOR_MAX_SIZE+1];			//SIP消息的Route信息char 			*m_RecvBuf;							//TCP接收得buffer (单个包)//TCP粘包后的数据和长度char 			*m_TcpRecvData;						//TCP接收一个完整sip包的数据int 			m_nTcpRecvLen;						//TCP接收一个完整sip包的长度CPushCatalog 	MsgPushCatalog; 					//message推送资源的类,编译接收200OK后再发送下一条资源osip_call_id_t 	*m_pCatalogCallId;  					//keepalive callidbool 			m_bSubNotify;						//判断是否为订阅notifyCPushCatalog 	NotifyPushCatalog; 						osip_call_id_t 	*m_pNotifyCallId;  					//keepalive callidosip_from_t 	*m_pSubNotifyFrom;osip_to_t 		*m_pSubNotifyTo;TSendNotifyInfo m_SubNotifyInfo;//连接及登录信息char m_cDSIP[16];          		//服务器的ip地址int m_nDSPort;              	//服务器的port//资源推送的策略UpperPolicy_T	TcpPushPolicy;
};class CSipTcpConnectMgr:public CMyThread
{
public:CSipTcpConnectMgr(void);~CSipTcpConnectMgr(void);
public: //Allocate and delete class instancestatic CSipTcpConnectMgr* GetInstance(void){static CSipTcpConnectMgr TcpConnectMgr;return &TcpConnectMgr;}int SendTcpPacket(const char EpAor[], const char* pDsIp, int nPort, void *pData, UpperPolicy_T PushPolicy, TcpSendType_E etype);CSipTcpConnect* OpenATcpConnect(const char EpAor[], const char* pDsIp, int nPort, UpperPolicy_T PushPolicy);
private://Main Worker Thread functionint ThreadProc(void);	
private:CSipTcpConnect* FindATcpConnect(const char EpAor[]);void RemoveATcpConnect(const char EpAor[]);int PollTcpConnect(void);
private:bool 								m_bStart;static CStrHash<CSipTcpConnect> 		TcpConnectHashList;static CCritSec 						CritSec_TcpConnectMgr;	
};#endif  //#if !defined(__DEVICECONTROL_PRIORITY_MGR_H__)





这篇关于视频监控安防平台-GB28181-系统目录查询TCP协议和系统录像文件检索TCP协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631595

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项