我是靠谱客的博主 高挑诺言,最近开发中收集的这篇文章主要介绍GB28181协议--心跳,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、心跳介绍:

根据《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》9.6.1状态信息报送章节描述。

当源设备(包括网关、SIP 设备、SIP 客户端或联网系统) 发现工作异常时, 应立即向本 SIP 监控域的SIP服务器发送状态信息; 无异常时, 应定时向本SIP 监控域的SIP 服务器发送状态信息。 SIP 设备宜在状态信息中携带故障子设备描述信息。

通过周期性的状态信息报送, 实现注册服务器与源设备之间的状态检测即心跳机制。

心跳发送方、 接收方需统一配置“心跳间隔”参数, 按照“心跳间隔”定时发送心跳消息, 默认心跳间隔60 s。 心跳发送方、 接收方需统一配置“心跳超时次数”参数, 心跳消息连续超时达到“心跳超时次数”。则认为对方下线, 默认心跳超时次数3 次。

心跳接收方在心跳发送方上线状态下检测到心跳消息连续超时达到商定次数则认为心跳发送方离线; 心跳发送方在心跳接收方上线状态下检测到心跳消息响应消息连续超时达到商定次数则认为心跳接收方离线。

2、命令流程

状态信息报送流程见下图:
在这里插入图片描述

  • 源设备向SIP 服务器发送设备状态信息报送命令。 设备状态信息报送命令采用 Message 方
    法携带;
  • SIP 服务器收到命令后返回200 OK。

状态信息报送需要携带的信息如下:
在这里插入图片描述
传输信息示范:
在这里插入图片描述

3、软件代码:

GB28181保活可以开启一个定时器或者一个线程,按照指定的时间发送如下指令(GB28181Keeplive) ,如果超过最大的超时次数(心跳超时时间=超时次数*定时发送心跳间隔),设备需要重新注册。

GB28181Keeplive实现如下所示,GB28181Keeplive基于libosip和libeXsip开发:

int GB28181Keeplive(GB28181Param_t *pGB28181Param)
{
	char from[128] = {0,};  
	char proxy[128] = {0,}; 
	char xml_body[1024] = {0,};
	osip_message_t *rqt_msg = NULL;

	
	// sip还未注册,那么不保活
	if (!g_SipState.sipRegStatus || !pGB28181Param)
	{
		return -1;
	}

	snprintf(from, sizeof(from), "sip:%s@%s:%s", 
			pGB28181Param->userParam.devSipID, 
			pGB28181Param->userParam.devSipIP,
			pGB28181Param->userParam.devSipPort);

	snprintf(proxy, sizeof(proxy), "sip:%s@%s:%s", 
			pGB28181Param->userParam.sipServerID, 
			pGB28181Param->userParam.sipServerIP,
			pGB28181Param->userParam.sipServerPort);

	/* 构建"MESSAGE"请求 */
	if (eXosip_message_build_request(&rqt_msg, "MESSAGE", proxy, from, NULL)!=OSIP_SUCCESS)
	{
		return -1;
	}

	snprintf(xml_body, 
			sizeof(xml_body), 
			"<?xml version="1.0"?>rn"
			"<Notify>rn"
			"<CmdType>Keepalive</CmdType>rn"/*命令类型*/
			"<SN>%d</SN>rn"/*命令序列号*/
			"<DeviceID>%s</DeviceID>rn"/*设备编码*/
			"<Status>OK</Status>rn"/*是否正常工作*/
			"</Notify>rn",
			GetSipSN(), 
			pGB28181Param->userParam.devSipID);

	if (osip_message_set_content_type(rqt_msg, "Application/MANSCDP+xml")!=OSIP_SUCCESS)
	{
		osip_message_free(rqt_msg);
		return -1;
	}

	if (osip_message_set_body(rqt_msg, xml_body, strlen(xml_body))!=OSIP_SUCCESS)
	{
		osip_message_free(rqt_msg);
		return -1;
	}

	/* 发送消息 */
	eXosip_lock();
	eXosip_message_send_request(rqt_msg);
	eXosip_unlock();
	
	return 0;
}

建议阅读:
GB28181协议–设备注册和注销

参考资料:
《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》

最后

以上就是高挑诺言为你收集整理的GB28181协议--心跳的全部内容,希望文章能够帮你解决GB28181协议--心跳所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部