Estructura y registro del programa de desarrollo de cliente del protocolo estándar nacional GB28181 (2)

Estructura y registro del programa de desarrollo de cliente del protocolo estándar nacional GB28181 (2)

Esta serie de artículos tiene como objetivo explorar el proceso de desarrollo del lado del dispositivo del protocolo estándar nacional GB28181. Este artículo se centrará en el diseño de la arquitectura y el registro del dispositivo, y presentará en detalle el diseño de la arquitectura del programa, la introducción de la biblioteca exosip y la clasificación de la interfaz en el lado del dispositivo, así como el proceso de registro y los mensajes de interacción de señalización en el lado del dispositivo GB28181. Al leer este artículo, los lectores comprenderán en profundidad los principios de diseño arquitectónico del lado del dispositivo del protocolo GB28181, cómo utilizar la biblioteca exosip, así como el proceso de registro del dispositivo y los mensajes clave para la interacción de señalización.

1. Diseño de arquitectura del programa.

En el desarrollo del lado del dispositivo del protocolo GB28181, un buen diseño de la arquitectura del programa es la base para garantizar la estabilidad y escalabilidad del sistema. Podemos considerar los siguientes aspectos:

  1. Arquitectura en capas: divida las funciones del lado del dispositivo en diferentes capas, como capa de medios, capa de control, capa de almacenamiento, capa de red, etc., para lograr un desarrollo y mantenimiento modulares.

  2. Diseño del módulo: según los requisitos funcionales, el dispositivo se divide en diferentes módulos, como módulo de acceso a plataforma, módulo de análisis de medios, módulo de codificación, módulo de decodificación, etc. Cada módulo es responsable de funciones específicas, interactuando y comunicándose a través de interfaces.

  3. Diseño de estructura de datos: el protocolo GB28181 implica estructuras de datos ricas, como información del dispositivo, flujos de medios, mensajes de señalización, etc. Al diseñar una estructura de datos, es necesario considerar la organización de los datos y la eficiencia del acceso, así como la compatibilidad con las especificaciones del protocolo.

El siguiente es el marco del programa para desarrollar el lado del dispositivo del protocolo GB28181:

Insertar descripción de la imagen aquí

2. Introducción a la biblioteca exosip y clasificación de interfaces.

eXosip es una biblioteca de extensión basada en la biblioteca oSIP, que se utiliza para implementar el desarrollo de protocolos SIP. Proporciona una interfaz de programación basada en eventos para procesar señales SIP e implementar aplicaciones SIP, y se usa ampliamente en el desarrollo del lado del dispositivo GB28181. Proporciona interfaces y funciones ricas para simplificar el proceso de desarrollo. Aquí hay una descripción general de la arquitectura interna de eXosip:

Insertar descripción de la imagen aquí

  1. Contexto SIP:
    la biblioteca eXosip utiliza el contexto SIP para administrar y procesar sesiones SIP. Cada contexto SIP tiene una ID única y el contexto se puede crear mediante la función eXosip_malloc(). Las aplicaciones pueden crear múltiples contextos para manejar diferentes sesiones SIP.

  2. Bucle de eventos:
    la biblioteca eXosip procesa mensajes y eventos SIP recibidos a través del mecanismo de bucle de eventos. El bucle de eventos continuará escuchando el socket de red, esperando la llegada de mensajes SIP o la activación de eventos del temporizador. Cuando ocurre un evento, la biblioteca eXosip generará el evento correspondiente y lo colocará en la cola de eventos esperando su procesamiento.

  3. Controlador de eventos:
    la biblioteca eXosip proporciona un conjunto de funciones de controlador de eventos para manejar varios tipos de eventos, como registro, invitaciones a llamadas, envío y recepción de mensajes, etc. Las aplicaciones pueden registrar las funciones correspondientes del controlador de eventos según sea necesario y ejecutar lógica personalizada cuando ocurren eventos.

  4. Controlador de mensajes SIP:
    la biblioteca eXosip proporciona un conjunto de funciones para procesar mensajes SIP, incluido el análisis y la construcción de solicitudes y respuestas SIP. Utiliza la funcionalidad de bajo nivel de la biblioteca oSIP para manejar el análisis y ensamblaje de mensajes SIP y proporciona una interfaz de nivel superior para el uso de aplicaciones.

  5. Comunicación de red:
    la biblioteca eXosip utiliza sockets de red subyacentes para la comunicación SIP. Proporciona funciones para interactuar con la capa de red, como crear y vincular sockets, enviar y recibir mensajes SIP, etc. Las aplicaciones pueden configurar y administrar parámetros relacionados con la comunicación de red según sea necesario.

La arquitectura interna de la biblioteca eXosip aprovecha al máximo las funciones subyacentes proporcionadas por la biblioteca oSIP y proporciona interfaces de nivel superior y modelos de programación basados ​​en eventos, lo que facilita a los desarrolladores la implementación de aplicaciones basadas en SIP.

Las interfaces de la biblioteca exosip se pueden dividir en las siguientes categorías:

  1. Interfaz de inicialización y configuración: incluida la inicialización de la biblioteca, la configuración de los parámetros de la pila del protocolo SIP, la configuración de los puertos de escucha, etc.

  2. Interfaz de registro y baja: se utiliza para las operaciones de registro y baja del dispositivo, incluido el envío y recepción del procesamiento de solicitudes de registro.

  3. Interfaz de interacción de señalización: se utiliza para enviar y recibir mensajes de señalización SIP, como invitaciones de llamadas, control de flujo de medios, etc.

Tercero, inicialización de exosip y bucle de mensajes.

Antes de utilizar la biblioteca exosip, se requieren operaciones de inicialización y configuración. Los pasos específicos son los siguientes:

  1. Inicialice la biblioteca exosip: llame a la interfaz de inicialización, inicialice la biblioteca exosip y establezca algunos parámetros globales.

  2. Configure la pila de protocolos SIP: establezca los parámetros relevantes de la pila de protocolos SIP, como la dirección IP, el puerto, etc., configurando la interfaz.

  3. Cree un contexto SIP: utilice la interfaz de contexto para crear un contexto SIP para operaciones posteriores de interacción de señalización y registro.

#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;

4. Señalización de mensajes de interacción durante el proceso de registro GB28181.

Insertar descripción de la imagen aquí

El proceso de registro se describe a continuación:

  1. El proxy SIP envía una solicitud de registro al servidor SIP;


  2. El servidor SIP envía una respuesta 401 al proxy SIP y proporciona el sistema de autenticación y los parámetros adecuados para el proxy SIP en el campo WWW_Authenticate del encabezado de respuesta ;

  3. El proxy SIP reenvía la solicitud de Registro al servidor SIP, brindando un certificado de confianza e
    incluyendo información de autenticación en el campo Autorización de la solicitud;

  4. El servidor SIP verifica la solicitud. Si se comprueba que la identidad del proxy SIP es legítima, se
    envía una respuesta de éxito de 200 OK al proxy SIP. Si la identidad no es legítima, se envía una respuesta de denegación de servicio.

Después de que WireShark intercepte el paquete, podrá ver:

Insertar descripción de la imagen aquí

  1. Regístrate por primera vez:
REGISTER sip:[email protected]:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK639602844
From: <sip:[email protected]:10561>;tag=91827836
To: <sip:[email protected]:10561>
Call-ID: 2847584547
CSeq: 1 REGISTER
Contact: <sip:[email protected]:10561;line=00c3a618be4c249>
Max-Forwards: 70
User-Agent: HbsGBSIP-1.0
Expires: 3600
Content-Length: 0
  1. La plataforma GB28181 devuelve el error 401:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK639602844
From: <sip:[email protected]:10561>;tag=91827836
To: <sip:[email protected]: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. Después de agregar la información de autenticación, envíe el mensaje de registro por segunda vez:
REGISTER sip:[email protected]:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK2311457380
From: <sip:[email protected]:10561>;tag=91827836
To: <sip:[email protected]:10561>
Call-ID: 2847584547
CSeq: 0 REGISTER
Contact: <sip:[email protected]:10561;line=00c3a618be4c249>
Authorization: Digest username="34020000001110000002", realm="34020000", nonce="awer23sdfj123123", uri="sip:[email protected]:5060", response="dc953f5c48a92517ff6542ef6cd97e20", algorithm=MD5, opaque="c3a02f1ecb122d255c4ae2266129d044"
Max-Forwards: 70
User-Agent: HbsGBSIP-1.0
Expires: 3600
Content-Length: 0
  1. La plataforma GB28181 devuelve 200 registros exitosos:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.54:10561;rport;branch=z9hG4bK2311457380
From: <sip:[email protected]:10561>;tag=91827836
To: <sip:[email protected]:10561>;tag=31243r3412
Call-ID: 2847584547
CSeq: 0 REGISTER
User-Agent: General
Date: 2023-03-15T16:18:33
Expires: 300
Content-Length: 0

El código para llamar a eXosip para registrarse es el siguiente:

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:[email protected]:7777",
   to_str.c_str(),     //"sip:[email protected]:5060",
   NULL, expire_val, &reg);

auto ret = eXosip_register_send_register(exosip_, register_id_, reg);

]

Agregue el autor hbstream ( http://haibindev.cnblogs.com ) para cooperar, indique el autor y la fuente al reimprimir.

Supongo que te gusta

Origin blog.csdn.net/haibindev/article/details/131380985
Recomendado
Clasificación