呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机。通常情况下我们通过软交换平台FreeSWITCH、Asterisk即可搭建分机注册服务。
但单台FreeSWITCH或Asterisk难以承载高并发的注册服务,而且从服务模块化的角度,我们也希望将注册服务和媒体服务相分离,所以我们通常会是使用OpenSIPS 或 Kamailio 来搭建注册服务器。
今天就让我们一同来看一下,如何通过OpenSIPS搭建一个简单的分机注册服务器吧……
目录:
业务场景
运行环境
关键模块
涉及的数据库表
分机注册信令细节
注册的认证过程
auth_db模块变量说明
个性化功能
禁止单个分机账户多地注册
注册脚步详情
术语解释
测试方法
-
业务场景:
OpenSIPS为分机提供注册服务,分机可以经过OpenSIPS进行互打
-
运行环境:
CentOS 7.4
OpenSIPS 2.4.2 -
使用的关键模块:
SIP signaling modules : registrar、signaling、sl
Auth modules : auth、auth_db
Data caching : usrloc -
涉及的数据库表:
subscriber : 存放分机号、密码等信息
location : 已注册的分机信息 -
分机注册信令细节(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
-
注册的认证过程:
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 )