GB28181协议--心跳

article/2025/9/19 16:10:28

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 公共安全视频监控联网系统信息传输、交换、控制技术要求》


http://chatgpt.dhexx.cn/article/jUg1GeRi.shtml

相关文章

国标28181: 视频国标28181协议

国标的由来 GB28181国标解决平台与平台对接问题 比如A平台大连交警系统需要看B平台上海交警系统的视频。需要对接过来&#xff0c;实现调度视频。这时候需要知道他们取流的协议&#xff0c;各家厂商都自定义了一套协议&#xff0c;就很麻烦&#xff0c;因此国家就制定了GB28…

【C/C++】isalpha、islower、isupper、isalnum、isblank、isspace函数cctype / ctype.h头文件

isalpha、islower、isupper、isalnum、isblank、isspace这些函数都在<cctype>&#xff08;即C语言中的<ctype.h>&#xff09;的头文件里面&#xff0c;下图是它们所表示的范围&#xff1a; 总的来说就是&#xff1a; isalpha &#xff08;字母&#xff0c;包括大写…

细微之处见真章之StringUtils的isBlank函数细节解读

一、背景 技术群里有一个老铁分享了一段 commons-lang 的 StringUtils 工具类的代码&#xff1a; public static boolean isBlank(final CharSequence cs) {int strLen;if (cs null || (strLen cs.length()) 0) {return true;}for (int i 0; i < strLen; i) {if (Char…

字符串判空,isBlank 和 isEmpty 到底选那个?

字符串的判空&#xff0c;日常开发是经常要做的一种校验&#xff0c;common-lang包帮我们做了一些字符串判空的封装 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency> 并对外提…

sbrk() 函数是干什么的?

brk和sbrk主要的工作是实现虚拟内存到内存的映射. 在GNU C中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G&#xff0c;但在程序编译时&#xff0c;不可能也没必要为程序分配这么大的空间&#xff0c;只分配并不大的数据段空间&#xff0c;程序中动态分配的空间就是从这…

ORACLE如何修改默认端口号

oracle在安装的的时候&#xff0c;除了可以默认端口号&#xff0c;也可以填入自定义的端口号。但是项目上会出现这样的情况&#xff0c;项目在进展时期&#xff0c;需要对数据库安全升级&#xff0c;首先要修改数据库的默认端口号。那如何来设置oracle的默认端口号&#xff0c;…

Oracle如何更改端口号

Oracle默认端口号为8080&#xff0c;因为Tomcat端口默认也是8080所以需要把Oracle端口更改一下&#xff0c;不建议更改Tomcat端口号 运行cmd命令行操作 查看Oracle版本&#xff1a; 链接Oracle数据库&#xff1a; conn system/root as sysdba&#xff0c;system/root用户名和…

Oracle 19c中默认端口

Oracle官网https://docs.oracle.com/en/database/oracle/oracle-database/19/rilin/port-numbers-and-protocols-of-oracle-components.html#GUID-D168F70C-BECE-4F9A-B616-D9103A35F1FFhttps://www.cndba.cn/hbhe0316/article/87226https://www.cndba.cn/hbhe0316/article/872…

oracle 数据库改端口

Oracle 11g修改默认端口1521为其他值 1、修改listener.ora 打开文件D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora&#xff0c;修改PORT 后的数值&#xff0c;如下图 修改listener.ora文件 2、重启TNSListener服务 在Windows服务中重启OracleOr…

如何查看oracle的服务端口号

查看 oracle服务端口的步骤&#xff1a; 按住WinR键&#xff0c;弹出DOS命令窗口。 输入cmd命令&#xff0c;点击确定。 弹出的DOS窗口中&#xff0c;i输入 lsnrctl status 命令&#xff0c;并点击Enter键。 找到窗口中&#xff0c;以下文字‘监听端点概要 (DESCRIPTION…

JUC是什么?

JUC表示什么 JUC是java.util.concurrent包的缩写&#xff0c;其包结构如下。 JUC框架结构 JUC是包的简称&#xff0c;JUC可能也是Java核心里最难的一块儿&#xff0c;JUC指的是Java的并发工具包&#xff0c;里边提供了各种各样的控制同步和线程通信的工具类。学习JUC之前&a…

JUC总结系列篇 (二) : 对线程的理解和使用总结

文章内容&#xff1a; 一.为什么需要多线程 二.线程的创建 三.线程的方法sleep(),run(),wait(),yeid(),join(),interrupt()等方法归纳总结 四.线程的状态及其转换 五.线程的交替执行案例 六.多个线程依次执行案例 七.多线程并发带来的线程安全问题 一.为什么需要多线程&#x…

JUC源码系列-ReentrantReadWriteLock

继承关系 ReadLock和WriteLock是ReentrantReadWriteLock的两个内部类&#xff0c;Lock的上锁和释放锁都是通过AQS来实现的。 AQS定义了独占模式的acquire()和release()方法&#xff0c;共享模式的acquireShared()和releaseShared()方法。 还定义了抽象方法tryAcquire()、tryA…

了解JUC

高级技术之 JUC 高并发编程 内容概览 1 、什么是JUC2 、Lock接口3 、线程间通信4 、集合的线程安全5 、多线程锁6 、Callable接口7 、JUC三大辅助类: CountDownLatch CyclicBarrier Semaphore8 、读写锁: ReentrantReadWriteLock9 、阻塞队列10 、ThreadPool线程池11 、Fork/…

juc系列(1)---进程,线程,并行,并发

目录 概述进程线程关系并发并行&#xff1a;同步异步&#xff1a;对比 概述 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU,数据加载至内 存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加…

JUC系列(九) CAS 与锁的理解

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

JUC系列(四)

1、CAS 1.1、没有CAS之前&#xff0c;保证线程安全的方式 多线程环境不使用原子类保证线程安全&#xff08;基本数据类型&#xff09; public class T3 {volatile int number 0;//读取public int getNumber(){return number;}//写入加锁保证原子性public synchronized void…

1、什么是juc

1、juc简介 在java中&#xff0c;线程部分是重点&#xff0c;juc就是java.util.concurrent工具包的简称。这是一个处理线程的工具包&#xff0c;从jdk1.5开始出现 2、进程与线程 进程&#xff1a;指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff1…

JUC系列(六) 线程池

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

JUC系列(五)

1、ThreadLocal 1.1、什么是ThreadLocal 线程局部变量。 1.2、ThreadLocal的作用以及可以为什么保证线程安全&#xff1f; 多线程访问同一个共享变量的时候容易出现并发问题&#xff0c;特别是多个线程对一个变量进行写入的时候&#xff0c;为了保证线程安全&#xff0c;一…