GB28181———注册

文章描述了一个基于arm架构的项目,需要实现球机的实时画面展示、云台控制和语音对讲。由于官方SDK不支持arm,开发者选择使用GB28181协议,并通过exosip2处理SIP注册流程。目前设备在Windows、Linux和arm上已能成功注册,但在SIP鉴权过程中遇到问题,尤其是Windows上编译exosip2较为复杂。文章详细阐述了GB28181协议的注册流程,并展示了处理401Unauthorized响应的代码片段。
摘要由CSDN通过智能技术生成

一、适用平台
近期的项目采用的arm架构,需要实现球机的实时画面展示、云台控制、语音对讲,官方的SDK不支持arm架构,尝试使用gb28181协议实现,现阶段设备注册已实现
windows、Linux、arm都已测试,注册没有问题,SIP协议采用的exosip2,windows上编译的时候挺费劲
二、注册流程
基本流程是根据GBT28181_2016文档来实现的
具体步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体的内容是通过开源的平台抓包
设备注册请求
在这里插入图片描述

平台回复401
在这里插入图片描述

设备确认后再次发送注册消息
在这里插入图片描述

平台鉴权后回复 200 ok

在这里插入图片描述
三、主要代码

//检测事件类型
 switch (event->type)
    { 
    case  EXOSIP_MESSAGE_NEW:
    {
        osip_message_t* pRegisterMsg = NULL;
        pRegisterMsg = event->request;
        if (0 == strcmp(event->request->sip_method, "REGISTER"))
        {


            if (pWWWAuEcho == NULL)
            {
                //  qDebug("摄像机第一次发来未鉴权注册信息,返回401  %d\r\n" , iRet);  // 摄像机第一次发来未鉴权注册信息,返回401
                register401_Unauthorized(ctx, event);
            }
            else
            {
                //注册鉴权

                char result[32];
                Authentication(pWWWAuEcho, result);
                std::string response = pWWWAuEcho->response;

                //去除信息中的“号
                response.erase(std::remove(response.begin(), response.end(), '"'), response.end());

                //数据转换进行 判断鉴权
                std::string src = result;
                src = src.substr(0, 32);
                if (src == response)
                {
                    send_message(ctx, event->tid, SIP_OK, true, 3600, pRegisterMsg->req_uri);
                }
                else
                {
                    break;
                } 
            }
        }
        else if (0 == strcmp(event->request->sip_method, "MESSAGE"))
        {
            qDebug("---MESSAGE----\n");           
                osip_message_t* pRegisterMsg = NULL;
                pRegisterMsg = event->request;
                osip_header_t*        p_header = NULL;
                int                expires = -1;
                //查找有效信息头
                osip_message_get_expires(pRegisterMsg, 0, &p_header);
                if (p_header != NULL)
                {
                    if (p_header->hvalue != NULL)
                    {
                        expires = atoi(p_header->hvalue);
                    }
                }
                
                send_message(ctx, event->tid, SIP_OK, true, expires, pRegisterMsg->req_uri);            
        }
    }
    break;
    }

/*
功能:回复带有鉴权信息
ctx:eXosip_t结构体
pSipEvt:eXosip_event_t 事件描述信息
*/
int GB28181::register401_Unauthorized(eXosip_t * ctx, eXosip_event_t * pSipEvt)
{
    int iReturnCode = 0;
    osip_message_t * pSRegister = NULL;

    osip_www_authenticate_t * header = NULL;
    osip_www_authenticate_init(&header);

    //添加www_authenticate信息(根据GB28181交互流程)
    osip_www_authenticate_set_auth_type(header, osip_strdup("Digest"));
    osip_www_authenticate_set_realm(header, osip_enquote(pcRealm.c_str()));
    osip_www_authenticate_set_nonce(header, osip_enquote(pcNonce.c_str()));

    char *pDest = NULL;
    osip_www_authenticate_to_str(header, &pDest);

    iReturnCode = eXosip_message_build_answer(ctx, pSipEvt->tid, SIP_UNAUTHORIZED, &pSRegister);

    if (iReturnCode == 0 && pSRegister != NULL)
    {
        osip_message_set_www_authenticate(pSRegister, pDest);
        osip_message_set_content_type(pSRegister, "Application/MANSCDP+xml");
        eXosip_lock(ctx);
        eXosip_message_send_answer(ctx, pSipEvt->tid, SIP_UNAUTHORIZED, pSRegister);
        eXosip_unlock(ctx);
    }

    osip_www_authenticate_free(header);
    free(pDest);
    pDest = NULL;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值