1 eXosip的基本知识

注册流程:

其中 nonce中带有鉴权信息。形如:

Authorization: Digest username="buxiangyi", realm="myvoip.com", nonce="143e882c902a9c38a3286e9043c35d401366083396", uri="sip:172.16.50.189:5060", response="8119330abd3ff5e4e26d2fa87b563b39", algorithm=MD5

对于 eXosip, 其处理过程如下:

2、REGISTER认证过程

涉及的主要API:

eXosip_add_authentication_info

eXosip_register_build_initial_register 

eXosip_register_send_register

1.1 发送一个注册包

eXosip_clear_authentication_info();

eXosip_add_authentication_info(m_userid,m_userid,m_passwd,"MD5",NULL)) 添加认证信息

osip_message_t *reg;

m_localurl.Format("sip:%s@%s",m_userid,SIP_SERVER);

m_nRegisterID = eXosip_register_build_initial_register(m_localurl,m_sipserverurl,NULL,300,&reg);初始化一个注册ID 并产生一个注册包

eXosip_register_send_register(m_nRegisterID,reg)

这样就发出了一个注册请求

1.2 处理服务器回的401注册挑战

在EXOSIP_REGISTRATION_FAILURE中处理中 判断event->response->status_code是否为401

然后 使用event的rid 重现产生一个注册包

osip_message_t *reg;

eXosip_register_build_register(event->rid, 300, &reg);//

// 取回认证的字符串authorization
{
    osip_authorization_t * auth;

    char *strAuth=NULL;

    osip_message_get_authorization(reg,0,&auth);

    osip_authorization_to_str(auth,&strAuth);

    strcpy(m_strAuth,strAuth);//保存认证字符串

    delete []strAuth;
}

eXosip_register_send_register(event->rid,reg);

1.3 发送心跳

在拿到认证字符串后 发送心跳时就不用每次都产生挑战信息了

发送心跳的方法 
osip_message_t *msg=NULL;
eXosip_register_build_register(m_nRegisterID, 300, &msg); //根据以前的RegisterID 重新产生一个注册包
{
    //将认证字符串添加入REGISTER消息中
    osip_header_t *pMsgHeader=NULL;
    osip_message_header_get_byname(msg,(const char *)"authorization",0,&pMsgHeader);
    if (pMsgHeader==NULL)
         osip_message_set_header(msg,(const char *)"authorization",m_strAuth);
    else
         strcpy(pMsgHeader->hvalue,m_strAuth);
}
eXosip_register_send_register(m_nRegisterID,msg);

 1.4 注销

注销的方法与心跳包处理方法相投

不过是 expires为0罢了

osip_message_t *msg=NULL;
eXosip_register_build_register(m_nRegisterID,   0, &msg); //根据以前的RegisterID 重新产生一个注册包
{
    //将认证字符串添加入REGISTER消息中
    osip_header_t *pMsgHeader=NULL;
    osip_message_header_get_byname(msg,(const char *)"authorization",0,&pMsgHeader);
    if (pMsgHeader==NULL)
         osip_message_set_header(msg,(const char *)"authorization",m_strAuth);
    else
         strcpy(pMsgHeader->hvalue,m_strAuth);
}
eXosip_register_send_register(m_nRegisterID,msg);

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐