GB28181协议--校时

2023-05-16

1、简介

根据《GB/T 28181 —2016》7.10、9.10的要求,GB28181设备网络校时功能描述如下:
联网系统内的IP 网络服务器设备宜支持 NTP(见IETF RFC2030) 协议的网络统一校时服务。 网络校时设备分为时钟源和客户端, 支持客户/服务器的工作模式; 时钟源应支持 TCP/IP、UDP 及 NTP协议, 能将输入的或自身产生的时间信号以标准的 NTP 信息包格式输出。联网系统内的IP 网络接入设备应支持SIP 信令的统一校时, 接入设备应在注册时接受来自SIP 服务器通过消息头 Date 域携带的授时。

2、基本流程

联网内设备支持基于SIP 方式或 NTP 方式的网络校时功能, 标准时间为北京时间。流程如下所示:
在这里插入图片描述
在注册成功情况下, 注册流程的最后一个 SIP 应答消息200 OK 中的 Date 头域中携带时间信息。采用的格式为 XML 标准格式:Date: yyyy-MM-dd’T’HH: mm:ss.SSS。
若SIP 代理通过注册方式校时, 其注册过期时间宜设置为小于 SIP 代理与 SIP 服务器出现1 s 误差所经过的运行时间。 例如:SIP 代理与SIP 服务器校时后,SIP 代理运行10 h 后设备时间与SIP 服务器时间相差大于1 s, 则宜将注册过期时间设置为10 h(36 000s) , 以保证SIP 代理与SIP 服务器之间时间误差小于1 s。

3、基于SIP的校时

sip信令处理:

int SipReg(GB28181Param_t *pGB28181Param, int isReg)
{
	int ret = 0;
	int len = 0;
	char *msg;
	int expires = 0 ;
	int regState = 0;
	int unAuthorized = 0;
	eXosip_event_t *je = NULL;
	osip_header_t *dest = NULL;
	osip_message_t *reg = NULL;
	long interval = GetSysSec();


	
	if (!pGB28181Param)
	{
		return SIP_FAILED;
	}

	if (isReg)
	{
		expires = strtoul(pGB28181Param->userParam.sipExpires, 0, 0);
	}

	while(GetSysSec() -interval <= MAX_SIP_REG_TIMEOUT_SEC)
	{
		// 先进行不认证注册
		if (0 == unAuthorized)
		{
			ret = SipRegisterUnauthorized(pGB28181Param, expires);
			if (ret < 0)
			{
				if(je)
				{
					eXosip_event_free(je);
				}
				return SIP_FAILED;
			}
			else 
			{
				unAuthorized = 1;
			}
		}

		je = eXosip_event_wait(0, 100);  		/* 等待新消息的到来 */
		if(NULL == je)
		{
			/* 以下语句会导致eXosip_register_send_register失败 */
			eXosip_automatic_action();
			usleep(100*1000);
			continue;
		}

		/* 返回注册失败 */
		if(EXOSIP_REGISTRATION_FAILURE == je->type)
		{
			/* 未认证注册失败,那么使用认证的方式进行注册 */
			if((je->response!=NULL) && (401==je->response->status_code))
			{
				ret = SipRegisterAuthorized(pGB28181Param, je->rid, expires);
				eXosip_event_free(je);
				if(ret != OSIP_SUCCESS)
				{
					return SIP_FAILED;
				}
			}
			else 
			{
				eXosip_event_free(je);
				unAuthorized = 0;			/* 注册失败, 重新走一遍注册流程 */
				if (isReg)
				{
					return SIP_REREG_AFTER_60S;
				}
				return SIP_FAILED;
			}
		}
		else if (EXOSIP_REGISTRATION_SUCCESS == je->type)
		{
			regState = 1;
			/* 收到服务器返回的注册成功 */
			g_SipState.registerID = je->rid;	
			if (MSG_IS_REGISTER(je->request) && je->response)
			{
				if (OSIP_SUCCESS == osip_message_to_str(je->response, &msg, &len))
				{
					if (osip_message_get_date(je->response, 0, &dest) > 0)
					{
						SipSetSystemTime(dest->hvalue);
					}
				}
			}
			
			eXosip_execute();
			eXosip_automatic_action();
			eXosip_event_free(je);
			break;
		}
		else
		{
			eXosip_event_free(je);
		}
	}

	if( (GetSysSec() -interval > MAX_SIP_REG_TIMEOUT_SEC) && (regState == 0))
	{
		return SIP_FAILED;
	}

	pthread_mutex_lock(&g_SipState.mutex);
	// 更新sip的注册状态
	if (isReg)
	{
		g_SipState.sipRegStatus = 1;
		g_SipState.keepliveAckTime = GetSysSec();
	}
	else 
	{
		g_SipState.sipRegStatus = 0;
	}
	pthread_mutex_unlock(&g_SipState.mutex);
	
	return SIP_SUCCESS;
}

设置系统时间接口:

static int SipSetSystemTime(char *timeStr)
{
	char *beginStr = timeStr;
	char *endStr = NULL;
	char tempStr[10] = {0, };
	struct tm st_time = {0, };
	struct timeval tv = {0, };
	uint32_t stime = 0;

	
	if (!timeStr)
	{
		return SIP_FAILED;
	}

	if ((endStr = strstr(beginStr, "-")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_year = stime - 1900;
	}

	if ((endStr = strstr(beginStr, "-")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_mon = stime - 1;
	}

	if ((endStr = strstr(beginStr, "T")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_mday = stime;
	}

	if ((endStr = strstr(beginStr, ":")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_hour = stime;
	}

	if ((endStr = strstr(beginStr, ":")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_min = stime;
	}

	if ((endStr = strstr(beginStr, ".")))
	{
		memset(tempStr, 0, sizeof(tempStr));
		strncpy(tempStr, beginStr, endStr-beginStr);
		beginStr = endStr + 1;
		stime = strtoul(tempStr, NULL, sizeof(tempStr));
		st_time.tm_sec = stime;
	}

	// 设置系统时间
	if ((tv.tv_sec = mktime(&st_time)) < 0)
	{
		GB_PrintError("mktime failed\n");
		return SIP_FAILED;
	}

	settimeofday(&tv, NULL);

	// 设置RTC时间
	struct tm *stTime = gmtime(&tv);
	if (SetRtcTime(stTime) < 0)
	{
		return SIP_FAILED;		
	}

	return SIP_SUCCESS;
}

参考资料:
《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》
推荐阅读:GB28181协议–设备注册和注销

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GB28181协议--校时 的相关文章

  • 程序员要多跳巢才能涨工资

    不要一辈子呆死在一家公司 都是打工高薪才是王道 fs xff1a 这 篇文章的本意 xff0c 是告诉大家如何识别公司 而不是鼓励大家无脑跳槽 只有当你在一个公司略有所成的时候 xff0c 你才能有所积累 跳槽更多时候 xff0c 应该看到
  • Ajax反正现在我没怎么看懂

    AJAX即 A synchronous J avascript A nd X ML xff08 异步JavaScript和XML xff09 xff0c 是指一种创建交互式 网页应用的网页开发技术 AJAX 61 异步 JavaScript
  • ViewBinding封装基类(BaseActivity,BaseFragment)

    混淆规则 keep class 包名 databinding 使用反射 BaseActivity public class BaseActivity lt T extends ViewBinding gt extends AppCompat
  • acc--›Android无障碍开发手势操作

    文章目录 前言dispatchGesture 96 api gt 61 24 96 GestureDescriptionGestureResultCallback执行手势 DslAccessibilityGestureclick 点击dou

随机推荐

  • C语言基础学习——基本数据类型(float型)

    1 float型 xff08 浮点型 xff09 浮点型是用来表示小数的 xff0c 默认至少有6位有效小数 xff1b 有float xff08 单精度 xff09 xff0c double xff08 双精度 xff09 xff0c l
  • Mybatis整合Spring和SpringMVC配置文件详解

    配置文件 pom xml xff08 配置我们需要的jar包 xff09 web xml xff08 启动spring容器监听器并加载spring的xml文件 xff0c 加载springmvc前端控制器 xff09 springmvc的配
  • 高并发场景下如何保证数据库和缓存的数据一致性

    高并发场景下如何保证数据库和缓存的数据一致性 分析经典做法 分析 只要用缓存 xff0c 就可能会涉及到缓存与数据库双存储双写 xff0c 你只要是双写 xff0c 就一定会有数据一致性的问题 xff0c 那么你如何解决一致性问题 xff1
  • XmlDocument类详解

    xfeff xfeff XmlDocument类 FreeEIM XmlDocument类是 NET框架的DOC解析器 XmlDocument将XML视为树状结构 xff0c 它装载XML文档 xff0c 并在内存中构建该文档的树状结构 下
  • 1024,如果全世界程序员都消失了,会怎样?

    这两天 xff0c 有一个话题引起了程序员的广泛讨论 xff1a 年薪80W程序员相亲被鄙视 某知名互联网社区 xff0c 一网友发帖 xff0c 自己年薪80W去相亲 xff0c 竟然被鄙视不如在二本学校教书的大学老师 估计令他没想到的是
  • AI---是什么?可以做什么?

    1 AI的项目简单介绍 图像识别 描述 xff1a 给定图片 xff0c 识别图片中有什么 xff1f 算法 xff1a KNN CNN 情感分析 描述 xff1a 判断文本包含的情感是正面 负面还是中性 关键 xff1a 文本如何表示成向
  • linux 下 gb18030 转码成 utf8

    iconv f gb18030 t utf8 1 txt o 2 txt
  • ocelot+IdentityServer认证

    IdentityServer4 IdentityServer4是用于ASP NET Core的OpenID Connect和OAuth 2 0框架 具体大家可以自己搜索 xff0c 网上很多 我不想写的就推荐别人的 IdentityServ
  • 图中连通块的个数:并查集

    图的连通性问题 在地图上有若干城镇 xff08 点 xff09 xff0c 已知所有有道路直接相连的城镇对 要解决整幅图的连通性问题 比如 xff0c 随意给你两个点 xff0c 让你判断它们是否连通 xff1b 或者问你整幅图一共有几个连
  • 依赖注入

    举个例子 xff0c 组件A中有类ClassA xff0c 组件B中有接口IB和其对应的实现类B1和B2 那么 xff0c 现在ClassA需要利用IB接口来做一些事情 xff0c 例如 xff1a public class ClassA
  • acc--›Android无障碍开发框架

    文章目录 前言框架介绍目标界面找到元素进行操作 系列文章联系作者 前言 针对Android无障碍开发 和使用场景 封装出来一个可以适用于各种场景的快速开发框架 框架介绍 无障碍的本质就是通过代码模拟人工操作 所以流程很明确 可以归纳为 目标
  • debian(Linux) gnome-control-center

    参考链接 xff1a http iokevins blogspot com 2015 09 gnome 3 system settings gnome control html 问题 今天在simba配置完成后 xff0c gnome co
  • KindEditor上传单个图片成功,页面却提示失败 —— 在Chrome新版本中不兼容的解决方案

    不得不说 xff0c 这个所谓的不兼容 xff0c 就是Chrome浏览器搞的鬼啊 我也不知道是我机子上的Chrome浏览器配置有问题还是怎么回事 xff0c 总之记录下来 xff0c 大家可以看看你们是不是也遇到了一样的问题 先上图 1
  • Zookeeper 应用

    数据发布 订阅 数据发布 订阅 xff08 Publish Subscribe xff09 系统 xff0c 即所谓的配置中 xff0c 顾名思义就是发布者将数据发布到ZooKeeper的 个或 系列节点上 xff0c 供订阅者进 数据订阅
  • ONVIF协议--ONVIF协议简介

    1 ONVIF简介 网络摄像机是网络设备 xff0c 需要有通讯协议 xff0c 早期的网络摄像机硬件提供商都采用私有协议 随着视频监控的网络化应用 xff0c 产业链的分工将越来越细 有些厂商专门做摄像头 xff0c 有些厂商专门做视频服
  • GB28181协议--GB28181协议简介

    1 GB T 28181 2016协议简介 近年来 xff0c 国内视频监控应用发展迅猛 xff0c 系统接入规模不断扩大 xff0c 涌现了大量平台提供商 xff0c 平台提供商的接入协议各不相同 xff0c 终端制造商需要给每款终端维护
  • 网络基础--UPnP基本原理

    1 简介 UPnP是通用即插即用 xff08 Universal Plug and Play xff09 的缩写 xff0c 主要用于设备的智能互联互通 xff0c 使用UPnP协议不需要设备驱动程序 xff0c 它可以运行在目前几乎所有的
  • 数学基础--高斯分布详解

    1 简介 正态分布 xff08 Normal Distribution xff09 xff0c 又名高斯分布 xff08 Gaussian Distribution xff09 xff0c 是一个在数学 物理及工程等领域都非常重要的概率分布
  • GB28181协议--流媒体的几种传输方式(UDP、TCP被动、TCP主动模式)

    1 简介 根据 GB T 28181 2016 4 3 1 5 2的要求 xff0c SIP和流媒体都应该支持TCP和UDP两种方式 如下图所示 xff1a 在附录F xff08 SDP 定义 xff09 中介绍了TCP支持主动模式和被动模
  • GB28181协议--校时

    1 简介 根据 GB T 28181 2016 7 10 9 10的要求 xff0c GB28181设备网络校时功能描述如下 xff1a 联网系统内的IP 网络服务器设备宜支持 NTP 见IETF RFC2030 协议的网络统一校时服务 网