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\"?>\r\n"
			"<Notify>\r\n"
			"<CmdType>Keepalive</CmdType>\r\n"/*命令类型*/
			"<SN>%d</SN>\r\n"/*命令序列号*/
			"<DeviceID>%s</DeviceID>\r\n"/*设备编码*/
			"<Status>OK</Status>\r\n"/*是否正常工作*/
			"</Notify>\r\n",
			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 公共安全视频监控联网系统信息传输、交换、控制技术要求》

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GB28181协议是中国监控领域的一种视频监控设备间通信协议,旨在实现设备之间的互通互联。GB28181协议的实现源码对于开发者来说非常重要,可以帮助他们理解和实现该协议相关功能。 针对GB28181协议的Android源码实现,主要包括以下几个方面的内容: 1. SIP协议处理:GB28181协议使用SIP协议作为信令传输协议,Android源码实现需要涉及到SIP协议的处理。包括SIP消息的解析、组装和传输等。 2. RTP媒体传输:GB28181协议使用RTP协议传输视频和音频数据,Android源码实现需要包括RTP协议的解析和组装,以及相应的数据传输功能。 3. 设备管理功能:GB28181协议实现源码还需要包括设备管理的相关功能,例如设备注册、心跳、查询设备列表等。这些功能可以通过Android源码实现,提供给开发者进行二次开发和定制。 4. 实时监控功能:GB28181协议主要用于实现视频监控设备之间的实时监控功能,Android源码实现需要包括视频流的接收、解码和显示等功能。 实现GB28181协议的Android源码可以通过使用Android的网络通信框架,如SIP协议的实现可以使用Jain-SIP库,RTP协议的实现可以使用Android的MediaCodec等相关API。 需要指出的是,GB28181协议的实现源码是非常复杂的,其中涉及到的技术细节较多,需要开发者具备相应的网络通信和视频处理的知识。因此,在使用和修改GB28181实现源码时,开发者需要谨慎并且具备相应的专业知识,以确保功能的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值