国标GB28181服务平台对接 您所在的位置:网站首页 gb28181协议接入后图像是绿色的 国标GB28181服务平台对接

国标GB28181服务平台对接

2023-12-21 13:33| 来源: 网络整理| 查看: 265

     今天抽空写下以GB28181的方式获取摄像机视频流以备后用,同时也希望能帮助到正着手开发GB28181对接视频的道友,这块的资料实在不多。

今天讲的内容不涉及到平台对接,平台对接下次有时间再讲,平台对接相对更麻烦点。通过GB28181获取摄像机视频流,首先需要摄像机支持GB28181

,如何知道摄像机是否支持GB28181协议呢?请看下图:

                                                            图1.摄像机28181协议配置图

图1 展示了海康摄像机配置GB28181页面,其他厂家摄像机GB28181配置页面(我遇到的)基本跟海康配置的页面相同。

下面介绍下各配置项基本意义:

   本地端口:默认为5060,SIP服务发送命令给摄像机时需要知道摄像机GB28181端口号,要不向哪发?

SIP服务器ID:说简单就是 服务器的标识,只不过这个标识有一定的要求,具体请参见28181-2001标准安全防范视频监控联网系统信息传输交换控制技术要求.pdf

                    当然也可以参考新点的文档,新旧文档这部分差异不大。文档在从群里下载。

SIP服务域:实际就是SIP服务器ID前10位。

SIP服务器地址:SIP服务所在机器的IP地址(如果存在多网卡建议将不用的网卡禁用掉)。

SIP服务器端口:SIP服务Port,其他SIP服务发送命令到此端口与之通信。

其他的配置默认即可。

   GB28181配置好以后,需要启动摄像机GB28181服务。

启动摄像机GB28181的方法是勾选“启用”选项,启动成功后,摄像机会向SIP Server发送注册消息,通过抓包可以看到具体的注册消息内容:

                            图2 摄像机发送注册消息图

看下注册消息的具体内容:

                                       图3 具体注册消息图

重要是Cantact信息,包含了摄像机GB28181 SIP ID 以及IP地址和端口号,这样与摄像机通信的SIP服务就知道往哪里回应答消息。

     摄像机端基本介绍了完了(摄像机端相当于SIP Client),下面 介绍CG28181 服务端也即 SIP Server,这正是我们要实现的。

实现CG28181服务端可以借助于现有的开源库 PJSIP,自己实现开发量还是很大的,具体的实现步骤如下:

一. 将PJSIP运行起来,毕竟人家是一个服务。只有运行以后才能接收客户端发来的消息。

bool Init(std::string concat, int logLevel) { this->concat = concat; pj_log_set_level(logLevel); auto status = pj_init(); status = pjlib_util_init(); pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0); status = pjsip_endpt_create(&cachingPool.factory, nullptr, &endPoint); status = pjsip_tsx_layer_init_module(endPoint); status = pjsip_ua_init_module(endPoint, nullptr); pool = pj_pool_create(&cachingPool.factory, "proxyapp", 4000, 4000, nullptr); auto pjStr =StrToPjstr(GetAddr()); pj_sockaddr_in pjAddr; pjAddr.sin_family = pj_AF_INET(); pj_inet_aton(&pjStr, &pjAddr.sin_addr); auto port = GetPort(); pjAddr.sin_port = pj_htons(static_cast(GetPort()));     status = pjsip_udp_transport_start(endPoint, &pjAddr, nullptr, 1, nullptr); if (status != PJ_SUCCESS) return status; auto realm = StrToPjstr(GetLocalDomain()); return pjsip_auth_srv_init(pool, &authentication, &realm, lookup, 0) == PJ_SUCCESS ? true : false; }

  以上是PJSip初始化的代码,需要将服务将要监听的端口传给PJSIP,这样服务就在监听的端口接收SIP 消息了。

二. 应答注册消息

       摄像机端发送来Register消息后,如果服务端不应答,摄像机端会一直发送直到收到服务端应答为止。如果服务器端重新运行,

需要手动再次开启摄像机,如果等摄像机自己再次发送注册消息可能是一个小时以后,我们当然不希望那么久。服务端应答注册

消息代码。

bool OnReceive(pjsip_rx_data* rdata) override { if(rdata->msg_info.cseq->method.id == PJSIP_REGISTER_METHOD) {   auto expires = static_cast(pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_EXPIRES, nullptr));   auto authHdr = static_cast(pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_AUTHORIZATION, nullptr));   if(expires && expires->ivalue > 0 )   { if(authHdr) {   cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有