国标GB28181协议客户端开发(二)程序架构和注册

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 国标GB28181协议客户端开发(二)程序架构和注册

国标GB28181协议客户端开发(二)程序架构和注册

本系列文章旨在探讨国标GB28181协议设备端的开发过程。本文将聚焦于架构设计和设备注册,并详细介绍了设备端的程序架构设计、exosip库介绍和接口分类,以及GB28181设备端的注册流程和信令交互报文。通过阅读本文,读者将深入了解GB28181协议设备端的架构设计原则、exosip库的使用方法,以及设备的注册过程和信令交互的关键报文。

一、程序架构设计

在GB28181协议设备端的开发中,良好的程序架构设计是保证系统稳定性和可扩展性的基础。我们可以考虑以下方面:

  1. 分层架构:将设备端的功能划分为不同的层次,如媒体层、控制层、存储层和网络层等,以实现模块化的开发和维护。
  2. 模块设计:根据功能需求,将设备端划分为不同的模块,如平台接入模块、媒体解析模块、编码模块、解码模块等。每个模块负责特定的功能,通过接口进行交互和通信。
  3. 数据结构设计:GB28181协议涉及到丰富的数据结构,如设备信息、媒体流、信令消息等。在设计数据结构时,需要考虑数据的组织和访问效率,以及与协议规范的兼容性。

以下为开发GB28181协议设备端的程序框架:

二、exosip库介绍和接口分类

eXosip是一个基于oSIP库的扩展库,用于实现SIP协议的开发。它提供了一个事件驱动的编程接口,用于处理SIP信令和实现SIP应用程序,广泛用于GB28181设备端的开发。它提供了丰富的接口和功能,可以简化开发过程。下面是eXosip的内部架构的概述:

  1. SIP上下文(SIP Context):
    eXosip库使用SIP上下文来管理和处理SIP会话。每个SIP上下文都有一个唯一的ID,可以通过函数eXosip_malloc()创建上下文。应用程序可以创建多个上下文来处理不同的SIP会话。
  2. 事件循环(Event Loop):
    eXosip库通过事件循环机制处理接收到的SIP消息和事件。事件循环会持续监听网络套接字,等待SIP消息的到达或定时器事件的触发。当有事件发生时,eXosip库将生成相应的事件,并将其放入事件队列中等待处理。
  3. 事件处理器(Event Handler):
    eXosip库提供了一组事件处理器函数,用于处理各种类型的事件,如注册、呼叫邀请、消息收发等。应用程序可以根据需要注册相应的事件处理器函数,并在事件发生时执行自定义的逻辑。
  4. SIP消息处理器(SIP Message Handler):
    eXosip库提供了一组函数来处理SIP消息,包括解析和构建SIP请求和响应。它使用oSIP库的底层功能来处理SIP消息的解析和组装,并提供了更高级别的接口供应用程序使用。
  5. 网络通信:
    eXosip库使用底层的网络套接字进行SIP通信。它提供了与网络层交互的功能,如创建和绑定套接字、发送和接收SIP消息等。应用程序可以根据需要配置和管理网络通信相关的参数。

eXosip库的内部架构充分利用了oSIP库提供的底层功能,并提供了更高级别的接口和事件驱动的编程模型,使开发者能够更方便地实现基于SIP的应用程序。

exosip库的接口可以分为以下几类:

  1. 初始化和配置接口:包括库的初始化、设置SIP协议栈的参数、配置监听端口等。
  2. 注册和注销接口:用于设备的注册和注销操作,包括注册请求的发送和接收处理等。
  3. 信令交互接口:用于发送和接收SIP信令消息,如呼叫邀请、媒体流控制等。

三、exosip初始化和消息循环

在使用exosip库前,需要进行初始化和配置的操作。具体步骤如下:

  1. 初始化exosip库:调用初始化接口,初始化exosip库,并设置一些全局参数。
  2. 配置SIP协议栈:通过配置接口,设置SIP协议栈的相关参数,如IP地址、端口等。
  3. 创建SIP上下文:使用上下文接口,创建一个SIP上下文,用于后续的注册和信令交互操作。
#include <osip2/osip.h>
#include <eXosip2/eXosip.h>
// 初始化eXosip和osip栈
exosip_ = eXosip_malloc();
ret_code = eXosip_init(exosip_);
if (ret_code != OSIP_SUCCESS)
{
   SIMPLE_LOG("Can't initialize eXosip!");
   exit(1);
}
// 配置exosip库参数,如IP地址和端口
ret_code = eXosip_listen_addr(exosip_, IPPROTO_UDP, NULL, cfg_.sip_local_port, AF_INET, 0);
if (ret_code != OSIP_SUCCESS)
{
   SIMPLE_LOG("eXosip_listen_addr error!");
   eXosip_quit(exosip_);
   exit(1);
}
eXosip_set_user_agent(exosip_, "HbsGBSIP-1.0");
// 发送初始注册报文
SipSendRegister(false, nullptr);
// 接收和处理SIP报文
while (!is_need_stop_)
{
   // 处理事件
   eXosip_event_t* sip_event = eXosip_event_wait(exosip_, 0, 10);
   // 一般处理401/407采用库默认处理
   eXosip_lock(exosip_);
   eXosip_default_action(exosip_, sip_event);
   eXosip_unlock(exosip_);
   // 超时
   if (sip_event == NULL)
   {
      continue;
   }
   // 尝试解析报文头部信息
   OSipMsgParser msg_parser;
   if (sip_event->request)
   {
      msg_parser.ParseHeader(sip_event->request);
   }
   switch (sip_event->type)
   {
      case EXOSIP_REGISTRATION_SUCCESS: {
         // 注册成功处理
         break;
      }
      case EXOSIP_REGISTRATION_FAILURE: {
         // 注册失败处理
         break;
      }
      case EXOSIP_MESSAGE_NEW: {
         // 收到新的SIP消息处理
         if (sip_event->request) {
            // 处理请求消息
            osip_message_t* request = sip_event->request;
            // 解析和处理请求消息
         } else if (sip_event->response) {
            // 处理响应消息
            osip_message_t* response = sip_event->response;
            // 解析和处理响应消息
         }
         break;
      }
      case EXOSIP_CALL_INVITE: {
         // 收到呼叫邀请处理
         // 解析和处理呼叫邀请消息
         break;
      }
      // 其他事件处理...
      default:
         break;
      }
   // 释放事件
   eXosip_event_free(sip_event);
}
// 清理exosip库资源
eXosip_quit(exosip_);
osip_free(exosip_);
exosip_ = NULL;

四、GB28181注册过程中的信令交互报文

注册流程描述如下:

  1. SIP代理向SIP服务器发送 Register请求;
  2. SIP服务器向 SIP代理发送响应401,并在响应的消息头 WWW_Authenticate字段中给出
    适合SIP代理的认证体制和参数;
  3. SIP代理重新向SIP服务器发送 Register请求,在请求的 Authorization字段给出信任书,
    包含认证信息;
  4. SIP 服务器对请求进行验证,如果检查出 SIP 代理身份合法,向 SIP 代理发送成功响应
    200OK,如果身份不合法则发送拒绝服务应答。

WireShark截包后可见:

  1. 第一次注册:
REGISTER sip:34020000002000000001@192.168.1.54:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK639602844
From: <sip:34020000001110000002@192.168.1.54:10561>;tag=91827836
To: <sip:34020000001110000002@192.168.1.54:10561>
Call-ID: 2847584547
CSeq: 1 REGISTER
Contact: <sip:34020000001110000002@192.168.1.54:10561;line=00c3a618be4c249>
Max-Forwards: 70
User-Agent: HbsGBSIP-1.0
Expires: 3600
Content-Length: 0
  1. GB28181平台返回401错误:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK639602844
From: <sip:34020000001110000002@192.168.1.54:10561>;tag=91827836
To: <sip:34020000001110000002@192.168.1.54:10561>;tag=1724123124
Call-ID: 2847584547
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="34020000", nonce="awer23sdfj123123", opaque="c3a02f1ecb122d255c4ae2266129d044", algorithm=MD5
User-Agent: General
Content-Length: 0
  1. 加上鉴权信息后第二次发送注册报文:
REGISTER sip:34020000002000000001@192.168.1.54:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK2311457380
From: <sip:34020000001110000002@192.168.1.54:10561>;tag=91827836
To: <sip:34020000001110000002@192.168.1.54:10561>
Call-ID: 2847584547
CSeq: 0 REGISTER
Contact: <sip:34020000001110000002@192.168.1.54:10561;line=00c3a618be4c249>
Authorization: Digest username="34020000001110000002", realm="34020000", nonce="awer23sdfj123123", uri="sip:34020000002000000001@192.168.1.54:5060", response="dc953f5c48a92517ff6542ef6cd97e20", algorithm=MD5, opaque="c3a02f1ecb122d255c4ae2266129d044"
Max-Forwards: 70
User-Agent: HbsGBSIP-1.0
Expires: 3600
Content-Length: 0
  1. GB28181平台返回200注册成功:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK2311457380
From: <sip:34020000001110000002@192.168.1.54:10561>;tag=91827836
To: <sip:34020000001110000002@192.168.1.54:10561>;tag=31243r3412
Call-ID: 2847584547
CSeq: 0 REGISTER
User-Agent: General
Date: 2023-03-15T16:18:33
Expires: 300
Content-Length: 0

调用eXosip进行注册的代码如下:

osip_message_t* reg = nullptr;
SIMPLE_LOG("new build register\n");
std::string from_str = MakeSIPFromToStr(cfg_.sip_local_device_id,
   cfg_.sip_local_ip, cfg_.sip_local_port);
std::string to_str = MakeSIPFromToStr(cfg_.sip_server_id,
      cfg_.sip_server_ip, cfg_.sip_server_port);
register_id_ = eXosip_register_build_initial_register(exosip_,
   from_str.c_str(),   //"sip:34010000002000000001@127.0.0.1:7777",
   to_str.c_str(),     //"sip:34020000002000000001@127.0.0.1:5060",
   NULL, expire_val, &reg);
auto ret = eXosip_register_send_register(exosip_, register_id_, reg);
目录
相关文章
|
1月前
|
监控 Java 持续交付
后端开发中的微服务架构实践与挑战####
在当今快速迭代的软件开发领域,微服务架构以其灵活性和可扩展性成为众多企业的首选。本文探讨了微服务架构的核心概念、实施策略及面临的主要挑战,旨在为后端开发者提供一个全面的指南。通过分析真实案例,揭示微服务在提升系统敏捷性的同时,如何有效应对分布式系统的复杂性问题。 ####
|
1月前
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
34 3
|
1月前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
12天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
44 3
|
10天前
|
前端开发 搜索推荐 安全
陪玩系统架构设计陪玩系统前后端开发,陪玩前端设计是如何让人眼前一亮的?
陪玩系统的架构设计、前后端开发及前端设计是构建吸引用户、功能完善的平台关键。架构需考虑用户需求、技术选型、安全性等,确保稳定性和扩展性。前端可选用React、Vue或Uniapp,后端用Spring Boot或Django,数据库结合MySQL和MongoDB。功能涵盖用户管理、陪玩者管理、订单处理、智能匹配与通讯。安全性方面采用SSL加密和定期漏洞扫描。前端设计注重美观、易用及个性化推荐,提升用户体验和平台粘性。
37 0
|
1月前
|
消息中间件 监控 持续交付
后端开发中的微服务架构设计与实践####
在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用的关键策略。本文将深入探讨微服务架构的核心概念、设计原则与实战技巧,通过实例解析如何在后端开发中有效实施微服务,以应对复杂业务需求和技术挑战。我们将从微服务的拆分策略、通信机制、数据管理到持续集成/持续部署(CI/CD)流程,全面剖析其背后的技术细节与最佳实践,为读者提供一份详尽的微服务架构设计与实践指南。 ####
|
26天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
25天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
37 1
|
1月前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
26天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
44 1

热门文章

最新文章