基于OpenSIPS 实现分机注册服务器

呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机。通常情况下我们通过软交换平台FreeSWITCH、Asterisk即可搭建分机注册服务。
但单台FreeSWITCH或Asterisk难以承载高并发的注册服务,而且从服务模块化的角度,我们也希望将注册服务和媒体服务相分离,所以我们通常会是使用OpenSIPS 或 Kamailio 来搭建注册服务器。
今天就让我们一同来看一下,如何通过OpenSIPS搭建一个简单的分机注册服务器吧……

目录:

业务场景
运行环境
关键模块
涉及的数据库表
分机注册信令细节
注册的认证过程
auth_db模块变量说明
个性化功能
    禁止单个分机账户多地注册
注册脚步详情
术语解释
测试方法
  1. 业务场景:

    OpenSIPS为分机提供注册服务,分机可以经过OpenSIPS进行互打

  2. 运行环境:
    CentOS 7.4
    OpenSIPS 2.4.2

  3. 使用的关键模块:
    SIP signaling modules : registrar、signaling、sl
    Auth modules : auth、auth_db
    Data caching : usrloc

  4. 涉及的数据库表:
    subscriber : 存放分机号、密码等信息
    location : 已注册的分机信息

  5. 分机注册信令细节(RFC3261):

    分机注册、取消注册都是使用 SIP REGISTER 方法,只是取消注册的时候,消息头中的过期时长expires的值是 0
    分机注册需要进行认证
    注册服务器返回 401/407 来要求终端发起认证
    认证不通过,则注册服务器返回 403 (Forbidden)
    认证过程中,注册服务器找不到AOR (Address-of-Record),则返回404 (Not Found)
    分机注册的(建议)过期时长可以依次从下面两个地方获取 :
    Contact 头中的 expires 参数
    Expires 头
    以上两项都没有,则由注册服务器指定一个默认值 (如OpenSIPS的registrar模块配置"default_expires=120)
    注册成功后的实际过期时长是由注册服务器来决定,并在注册服务器返回的200 OK中的Contact里通过携带 'expires’参数来告知分机终端注册信息实际的有效时长:
    终端REGISTER请求中的expires可能不在注册服务器允许expires范围内,注册服务器会强制使用自己指定的expires值
    比如REGISTER中的Expires=20, 而OpenSIPS配置的min_expires=30,那么OpenSIPS返回的200 OK中的expires值是30 (如:Contact: sip:401999@10.32.26.19:56862;rinstance=870ce245f5361eaf;expires=30)
    分机终端需要周期性发送保活注册包
    保活过程中,每次重发注册请求,CSeq 值自增 1
    保活注册时,Call-ID始终不变
    保活注册包发送周期:在达到注册服务器返回的200 OK中的expires时长之前,重发保活注册请求 (如Yealink会在expires/2时长后重新注册,而Zoiper、EyeBeam会在注册过期前5秒重新注册)
    如果注册的响应报文包含Date 消息头,那么SIP终端需要通过该值来保持跟注册服务器的时间同步,以确保注册周期的准确性!http://www.wcsdyc.com

View Code

  1. 注册的认证过程:

    SIP 是采用HTTP摘要方式(Digest)进行认证。

    认证:
    调用auth_db模块的www_authorize("", “subscriber”)进行分机身份认证,根据认证情况继续
    返回 -3 (stale nonce)、-4 (no credentials),则调用 auth 模块的 www_challenge("",“0”)要求分机携带认证凭证再次注册。该方法会返回SIP 401,并且消息头中有一个 WWW-Authenticate 头,等SIP终端再次发送注册请求时就会在SIP INVITE 内携带 Authorization 头信息
    返回 -1 (invalid user),则调用signaling模块send_reply(“404”, “Not Found”)
    返回 -2 (invalid password)、-5 (generic error),则调用signaling模块send_reply(“403”, “Forbidden”)
    返回 1 (success),进行下一步
    存储注册信息:
    调用registrar模块的save(“location”, “f”) 将注册信息写入location表
    写入DB失败,则调用 sl 模块的 sl_reply_error() 返回错误信息

    www_authorize(realm, table_name) :
    realm : 所注册分机所属的域,通常是域名或IP

    该值并不一定是subscriber中的domain字段,具体根据auth_db里的参数配置决定。 (注册服务器返回401时,一定会有该参数,在所有的盘问中都必须有。它的目的是鉴别SIP消息中的机密。在SIP实际应用中,它通常设置为SIP代理服务器所负责的域名)

    通常该值是REG服务器的IP,如果realm填空串"",对于REGISTER注册请求而言,会从To头取domain/ip地址(相当于 t d )

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值