由于已经成功搭建好基于eXosip的UAC的开发环境,并且也与SPVMN测试系统交互成功,所以现在开始针对注册、查询等业务进行详细的研究。

今天先研究下设备注册的流程,模拟一个IPC向SPVMN系统注册,记录下交互的消息,详细研究了下:

转载请注明出处:http://blog.csdn.net/longlong530

一.环境搭建:

环境准备:http://blog.csdn.net/longlong530/article/details/9176989

UAC(模拟IPC):

IP:192.168.10.117

Port:5061

UAS(模拟SIP服务器):

IP:192.168.10.177

Port:5060

二.业务时序图:

三.消息详解:

第一步:UAC --> UAS

UAC向UAS注册,下面是具体注册消息:

REGISTER sip:192.168.10.177:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.10.117:5061;rport=5061;branch=z9hG4bK2509000523;received=192.168.10.117
From: <sip:34020000001320000001@192.168.10.177>;tag=2577708869
To: <sip:34020000001320000001@192.168.10.177>
Call-ID: 939764460
CSeq: 1 REGISTER
Contact: <sip:34020000001320000001@192.168.10.117:5061;line=6513f93347c330b>
Max-Forwards: 70
User-Agent: eXosip/3.6.0
Expires: 3600
Authorization: Capability, algorithm="H:MD5"
Content-Length: 0

字段说明:

请求起始行:表示UAC向IP地址为192.168.10.177的服务器发起注册,SIP版本号为2.0

From字段:指明该REGISTER请求消息由UAS(IP地址:192.168.10.177)控制的UAC发起的。

To字段:指明REGISTER请求接收方的地址。此时REGISTER请求的接收方为IP地址为192.168.10.177的UAS。(这个值和To头域的值相同,除非这个请求是第三方发起的注册请求。)
Call-ID字段:UAC发出的给某个注册服务器(registrar)的所有注册请求都应该有相同的Call-ID头域值。如果相同的客户端用了不同的Call-ID值,注册服务器(registrar)就不能检测是否一个REGISTER请求由于延时的关系导致了故障。
Cseq字段:Cseq值保证了REGISTER请求的正确顺序。一个UA为每一个具备相同的Call-ID的REGISTER请求顺序递增这个Cseq字段。
Contact字段:在REGISTER请求中的Contact字段指明用户可达位置。
Expires字段:表示该登记生存期为3600s。
Content-Length字段:表明此请求消息消息体的长度为空,即此消息不带会话描述。

第二步,UAS-->UAC

UAS返回401 Unauthorized(无权限)响应,表明要求对UAC进行用户认证,并且通过WWW-Authenticate字段携带UAS支持的认证方式,产生本次认证的nonce

SIP/2.0 401 Unauthorized
To: <sip:34020000001320000001@192.168.10.177>;tag=66081813_53173353_54026835-98f6-4d1e-b562-0d969636b944
Via: SIP/2.0/UDP 192.168.10.117:5061;rport=5061;branch=z9hG4bK2509000523;received=192.168.10.117
CSeq: 1 REGISTER
Call-ID: 939764460
From: <sip:34020000001320000001@192.168.10.177>;tag=2577708869
WWW-Authenticate: Digest realm="3402000000",nonce="324cab6e557268e0"
Content-Length: 0

第三步,UAC-->UAS

UAC重新向UAS发起注册请求,携带WWW-Authorization字段

REGISTER sip:192.168.10.177:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.10.117:5061;rport=5061;branch=z9hG4bK3163110852;received=192.168.10.117
From: <sip:34020000001320000001@192.168.10.177>;tag=2577708869
To: <sip:34020000001320000001@192.168.10.177>
Call-ID: 939764460
CSeq: 2 REGISTER
Contact: <sip:34020000001320000001@192.168.10.117:5061;line=6513f93347c330b>
Authorization: Digest username="34020000001320000001",realm="3402000000",nonce="324cab6e557268e0",uri="sip:192.168.10.177:5060",response="7f536c8ce38593239f9130e37a72276e",algorithm=MD5
Max-Forwards: 70
User-Agent: eXosip/3.6.0
Expires: 3600
Content-Length: 0

第四步,UAS-->UAC

UAS收到UAC的注册请求,首先检查NONCE的正确性,如果和在401 Unauthorized响应中产生的NONCE相同,则通过。否则,直接返回失败。然后,UAS会根据NONCE、用户名、密码(服务器端可以根据本地用户信息获取用户的密码)、URI等采用和终端相同的算法生成
RESPONSE,并且对此RESPONSE和请求消息中的RESPONSE进行比较,如果二者一致则用户认证成功,否则认证失败。此时,UAS返回200 OK响应消息,表明终端认证成功。

SIP/2.0 200 OK
To: <sip:34020000001320000001@192.168.10.177>;tag=31428812_53173353_376bd3d9-cb9d-4b4f-a950-da26d575cff5
Via: SIP/2.0/UDP 192.168.10.117:5061;rport=5061;branch=z9hG4bK3163110852;received=192.168.10.117
CSeq: 2 REGISTER
Call-ID: 939764460
From: <sip:34020000001320000001@192.168.10.177>;tag=2577708869
Contact: <sip:34020000001320000001@192.168.10.117:5061;line=6513f93347c330b>
Expires: 3600
Date: 2013-06-26T16:08:37.164
Content-Length: 0

附代码:

int eXosip_register(int expires)/*expires/注册消息过期时间,单位为秒*/
{int ret = 0;eXosip_event_t *je  = NULL;osip_message_t *reg = NULL;char from[100];/*sip:主叫用户名@被叫IP地址*/char proxy[100];/*sip:被叫IP地址:被叫IP端口*/memset(from, 0, 100);memset(proxy, 0, 100);sprintf(from, "sip:%s@%s", device_info.ipc_id, device_info.server_ip);sprintf(proxy, "sip:%s:%s", device_info.server_ip, device_info.server_port);/*发送不带认证信息的注册请求*/
retry:eXosip_lock();g_register_id = eXosip_register_build_initial_register(from, proxy, NULL, expires, ®);osip_message_set_authorization(reg, "Capability algorithm=\"H:MD5\"");if(0 > g_register_id){eXosip_unlock();printf("eXosip_register_build_initial_register error!\r\n");return -1;}printf("eXosip_register_build_initial_register success!\r\n");ret = eXosip_register_send_register(g_register_id, reg);eXosip_unlock();if(0 != ret){printf("eXosip_register_send_register no authorization error!\r\n");return -1;}printf("eXosip_register_send_register no authorization success!\r\n");printf("g_register_id=%d\r\n", g_register_id);for(;;){je = eXosip_event_wait(0, 50);/*侦听消息的到来*/if(NULL == je)/*没有接收到消息*/{continue;}if(EXOSIP_REGISTRATION_FAILURE == je->type)/*注册失败*/{printf("<EXOSIP_REGISTRATION_FAILURE>\r\n");printf("je->rid=%d\r\n", je->rid);/*收到服务器返回的注册失败/401未认证状态*/if((NULL != je->response)&&(401 == je->response->status_code)){reg = NULL;/*发送携带认证信息的注册请求*/eXosip_lock();eXosip_clear_authentication_info();/*清除认证信息*/eXosip_add_authentication_info(device_info.ipc_id, device_info.ipc_id, device_info.ipc_pwd, "MD5", NULL);/*添加主叫用户的认证信息*/eXosip_register_build_register(je->rid, expires, ®);ret = eXosip_register_send_register(je->rid, reg);eXosip_unlock();if(0 != ret){printf("eXosip_register_send_register authorization error!\r\n");return -1;}printf("eXosip_register_send_register authorization success!\r\n");}else/*真正的注册失败*/{printf("EXOSIP_REGISTRATION_FAILURE error!\r\n");goto retry;/*重新注册*/}}else if(EXOSIP_REGISTRATION_SUCCESS == je->type){/*收到服务器返回的注册成功*/printf("<EXOSIP_REGISTRATION_SUCCESS>\r\n");g_register_id = je->rid;/*保存注册成功的注册ID*/printf("g_register_id=%d\r\n", g_register_id);break;}}return 0;
}

【GBT28181开发:SIP协议实践】之注册流程相关推荐

  1. 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件l ...

  2. 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...

  3. 基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3966794.html. 上章节讲解了讲解一个用eXosip2库实现 ...

  4. 【GBT28181开发:SIP协议实践】之设备远程启动

    下面学习的是设备远程控制的流程,和设备信息.设备目录.设备状态的流程差不多,主要是描述的协议字段不同,模拟SPVMN系统向源设备发送远程启动控制指令,记录下交互的消息,详细研究了下: 转载请注明出处: ...

  5. sip 时序图_[置顶] 【GBT28181开发:SIP协议实践】之设备远程启动

    下面学习的是设备远程控制的流程,和设备信息.设备目录.设备状态的流程差不多,主要是描述的协议字段不同,模拟SPVMN系统向源设备发送远程启动控制指令,记录下交互的消息,详细研究了下: 一.环境搭建: ...

  6. Skype For Business Server 中 SIP协议处理模块的注册

    知识准备 SIP 协议 Skype For Business (SFB) Server 基础 MSPL 脚本 SIP协议处理模块注册流程 为自己的SIP模块指定一个URL,这个URL就是以后这个SIP ...

  7. VoLTE技术(含IMS注册/去注册流程、IMS呼叫流程、呼叫保持流程、二次协商过程)

    文章目录 VoLTE技术 IMS简介 SIP消息结构 IMS注册流程 IMS去注册流程 什么是Ghost Call 预留资源的呼叫流程 挂断电话流程(主动挂断.拒接) SDP协议,二次协商过程 呼叫保 ...

  8. 图解基于SIP协议的VoIP通话过程

    基于SIP协议的VoIP通话流程: 一次通话过程的抓包情况: 呼叫请求报文内容: 呼叫响应报文内容: 客户端样机上抓的RTP/RTCP语音流数据报文: RTP数据报文内容: RTCP报文内容(RTP数 ...

  9. freeswitch系列四 通过实例学习sip协议的注册、呼叫、挂断流程

    1. 概述 本文通过tcpdump对真实环境里的软电话的注册.呼叫.挂断流程进行抓包,通过真实的例子学习SIP协议.本文主要包括以下方面: A. 详解软电话的注册时的SIP包和流程图 B. 详解软电话 ...

最新文章

  1. 5分钟带你读懂“语音识别”工作原理
  2. 摄像头(Ov965x)驱动分析
  3. python地理数据处理 下载_python-doc/将Python用于地理空间数据处理.md at master · zhuxinyizhizun/python-doc · GitHub...
  4. SpringBoot+Vue+Openlayers实现地图上新增和编辑坐标并保存提交
  5. 系列(四)—Http协议
  6. 一段java并发编程代码
  7. STM32位带操作实现过程解析
  8. Git 仓库中文件名大小写问题
  9. velodyne显示点云中grid的单位_孝感好的舞台背景显示屏施工创新服务_胜辉屏安...
  10. 毕设日志——TensorFlow安装的numpy覆盖?掉了pytorch的numpy
  11. matlab晶闸管整流电路,基于Matlab GUI的整流电路仿真
  12. hp服务器修改风扇转速,如何改变惠普笔记本风扇转速
  13. windows安全中心接口
  14. r语言导入spss数据_R 中数据导入
  15. 使用HBuilder打包App教程(图文教程)
  16. 0.1uf 电容浅析
  17. 别让“鼠标手”伸向你
  18. deepin20如何换源_Deepin更换镜像源
  19. (转)零基础入门--中文命名实体识别
  20. Linux下python环境搭建

热门文章

  1. 人工智能主要研究内容
  2. 黑马C++之 数据类型——整形、实型、字符型、转义字符、字符串类型、布尔类型
  3. 如何将QQ音乐SQ品质FLAC格式转换成MP3音乐
  4. 监控摄像机选型攻略之视频监控技术发展概况
  5. 《统计学习方法》学习笔记 第二十一章 PageRank算法
  6. RestfulCRUD 规范
  7. 转载:天涯——散文天下——《劳动力短缺》——作者:南方孤驴
  8. 什么是封装java_什么是封装java
  9. matlab实现CP分解 代码
  10. cmd查看CPU信息