介绍
把分机信息存储到redis,需要验证的时候,从redis读取存储的信息转换成XML格式,让FreeSWITCH完成验证。优点就是redis的读取性能非常快,可以让FreeSWITCH支持大量的分机,并且配置可以实时生效。
配置说明
cti_exten@domain [哈希表]
- key 分机名
- value
{ "param": { "allow-empty-password": false, "password": "123", "auth-acl": "", "sip-forbid-register": false }, "variable": { "sip-force-contact": "NDLB-connectile-dysfunction-2.0" }, "attribute": { "cacheable": "10000", "number-alias": "myphone" } }
|

- param 参数
- password 分机密码(分机密码要设置足够复杂,预防给盗打电话)
- a1-hash 小写的md5(username:realm:passwd),如果担心明文密码不安全,可以使用a1-hash。
- realm 就是internal配置的sip-ip,也可以internal->challenge-realm 配置一个域名。
- auth-acl 设置允许注册的IP 。比如 192.168.0.100/255,cidr格式,多个用逗号隔开。
- allow-empty-password 是否允许空密码
- sip-forbid-register 是否禁止注册。
- user-agent-filter 终端的user-agent必须和这个设置匹配才可以注册。这个配置是一个正则表达式。
- max-registrations-per-extension 最大允许同时注册的终端数量,就是一个账户可以在多少个地方同时注册。
- variable 变量,可以通过模板自己添加
- sip-force-contact 使用NDLB-connectile-dysfunction-2.0 ,可以解决NAT问题。
- sip-force-expires 强制注册间隔,UDP注册方式,如果分机在内网fs在外网,为了维持NAT,要设置为60。
- attribute 属性
- cacheable 缓存时间 单位毫秒,如果需要修改配置实时生效,就不能设置缓存,设置true永不过期。
- number-alias 别名,比如分机号是的字母,你可以配置一个数字的别名。
分机信息记录到redis
默认会把注册信息和呼叫信息记录到cti_userinfo@域名。
{ "FreeSWITCH-Switchname": "ai", "register": { "Hostname": "ai", "IPv4": "192.168.31.57", //SIP服务器IP "IPv6": "::1", "cluster_ip": "192.168.31.57", "cluster_port": "11452", "network-ip": "192.168.31.57", //客户端IP "user-agent": "www.ddrj.com", "status": "Registered(AUTO-NAT-2.0)", "Timestamp": "1675404112729408" //最后注册的时间戳(微秒) }, "linepause": { //示忙,示闲 信息,如果没个信息就是示闲。 "122": 0 } "calls": [ //一个分机可以同时拨打多个通话所以是数组 { "Unique-ID": "6a5ab91c-866d-403e-b889-cdbb6d6b3676", //分机端的callid "Created-Time": "1675404116812248", //通话发起时间戳(微秒) "Progress-Time": "1675404116951249",//通话回铃(180或者183)时间戳(微秒) "Answered-Time": "1675404116951249",//通话应答时间戳(微秒) "Call-Direction": "inbound", "Call-Number": "5555", "Timestamp": "1675404116951249", //最后更新的信息的时间错 "Signal-Bond": "a9055088-1a38-4ba1-89c3-b4410ad5003e", //对端的callid "call_source": "acd", //呼叫来源 "source_name": "8001", //来源名称 "source_number": "13600000", //来源号码 "bond_call_source": "queuedialer",//对端呼叫来源 "bond_source_name": "3000", //对端来源名称 "bond_source_number": "13600000",//对端来源号码 } ] }
|
计算通话时间的方法,可以调用httpcli接口获取 http://127.0.0.1:88/cli?key=abc&cmd=cti_timestamp
服务器当前时间戳减去Created-Time来得到。
分机注册信息记录到redis
也可以cti.json配置注册信息单独记录到redis
"gui": { "registration": { "hash": "registrations", "channel": "", "list": "" } }
|
如果分机注册会在哈希表registrations添加一个记录,如果分机注销会删除这个记录。
key:分机号
value:注册信息
{ "Event-Name": "CUSTOM", "Core-UUID": "7eca4f88-39c1-48c2-bc00-ffe7f11d92f8", "FreeSWITCH-Hostname": "ai", "FreeSWITCH-Switchname": "ai", "FreeSWITCH-IPv4": "192.168.31.57", "FreeSWITCH-IPv6": "::1", "Event-Date-Local": "2022-04-07 23:04:50", "Event-Date-GMT": "Thu, 07 Apr 2022 15:04:50 GMT", "Event-Date-Timestamp": "1649343890838195", "Event-Calling-File": "sofia_reg.c", "Event-Calling-Function": "sofia_reg_handle_register_token", "Event-Calling-Line-Number": "2079", "Event-Sequence": "882", "Event-Subclass": "sofia::register", "profile-name": "internal", "from-user": "121", "from-host": "192.168.31.57", "presence-hosts": "n/a", "contact": "\"\" <sip:121@192.168.31.57:55458;ob;fs_nat=yes;fs_path=sip%3A121%40192.168.31.57%3A55458>", "call-id": "220551059ccc409e9a42606f4e5c52bf", "rpid": "unknown", "status": "Registered(AUTO-NAT-2.0)", "expires": "20", "to-user": "121", "to-host": "192.168.31.57", "network-ip": "192.168.31.57", "network-port": "55458", "username": "121", "realm": "192.168.31.57", "user-agent": "unknown", "sip_number_alias": "121", "sip_auth_username": "121", "sip_auth_realm": "192.168.31.57", "number_alias": "121", "user_name": "121", "domain_name": "192.168.31.57", "sip-force-contact": "NDLB-connectile-dysfunction-2.0", "effective_caller_id_name": "121", "sip-allow-multiple-registrations": "false", "sip-force-expires": "20", "force_ping": "false" }
|
分机呼叫信息记录到redis
cti.json
"gui": { /*分机呼叫信息推送到redis*/ "call": { /*呼叫信息需要记录的变量*/ "fields": [ "Caller-Destination-Number", "Caller-Caller-ID-Number", "Caller-Callee-ID-Number", "Caller-Profile-Created-Time", "Caller-Profile-Created-Time", "Caller-Channel-Answered-Time","Caller-Channel-Hangup-Time", "Caller-Channel-Progress-Time", "Caller-Channel-Progress-Media-Time", "Answer-State", "variable_signal_bond","Caller-Channel-Bridged-Time", "Event-Date-Timestamp" ], "hash": "calls", "remove_hangup":false, /*通话挂断后是否删除hash中对应的记call记录*/ "channel": "", "list": "" } }
|
如果分机呼出或者呼入,哈希表calls添加一个记录,value就是呼叫信息。如果配置了写入hash表,最后一个挂断的通话信息会缓存。
key:分机号
value:呼叫信息
{ "username": "121", "current": "47768dc2-9856-4dbd-809e-5b559004881f", "notify": "answer", "47768dc2-9856-4dbd-809e-5b559004881f": { "Caller-Destination-Number": "5555", "Caller-Caller-ID-Number": "121", "Caller-Callee-ID-Number": "", "Caller-Profile-Created-Time": "1649344241663800", "Caller-Channel-Answered-Time": "1649344243343194" }, "activity": [ "47768dc2-9856-4dbd-809e-5b559004881f" ] }
|
- current: 最后状态发生变化的uuid
- notify:current指向UUID通道的状态,
- callout 呼出
- callin 呼入
- progress 振铃
- answer 应答
- hangup 挂断
- bridge 桥接(绑定2个通道)
- unbridge 取消桥接(取消绑定2个通道)
- activity: 当前所有的通话
- uuid: 这个通话的通道变量,fields可以配置要记录的通道变量。
- Caller-Profile-Created-Time:通话的发起时间,单位是微妙的时间戳。
- Caller-Channel-Answered-Time: 通话的接通时间,单位是微妙的时间戳。
- Caller-Channel-Hangup-Time: 通话的挂断时间
- Caller-Channel-Progress-Time: 180时间
- Caller-Channel-Progress-Media-Time: 183时间
- Answer-State: 通话状态
- variable_signal_bond:对端通道CALLID
监听分机通话
调用httpcli接口http://127.0.0.1:88/cli?key=abc&cmd=bgapi&arg=cti_originate user/121 &eavesdrop(17583c94-c7fd-4ccc-9410-abfaf69e2e88)
注意,arg=后面的要url编码,参数说明user/121,监听者(管理员)分机号, eavesdrop(分机通话UUID)
在监听过程允许通过DTMF按键切换监听模式,1:切换到对分机对端喊话 2:切换到对分机喊话 3:切换到3方通话,0:恢复到监听
http://127.0.0.1:88/cli?key=abc&cmd=bgapi&arg=cti_originate user/121 set:eavesdrop_enable_dtmf=true,eavesdrop:1851bbde-08f5-4d42-8b5c-5250fab4172f inline
秘语(分机和其他人通话,管理员对分机进行喊话提醒)
和监听一样添加一个变量 eavesdrop_whisper_aleg=true,对分机喊话,或者eavesdrop_whisper_bleg=true,对对端进行喊话
http://127.0.0.1:88/cli?key=abc&cmd=bgapi&arg=cti_originate user/121 set:eavesdrop_whisper_aleg=true,eavesdrop:1851bbde-08f5-4d42-8b5c-5250fab4172f inline
三方通话(分机和其他人通话,管理员加入进行三方通话)
http://127.0.0.1:88/cli?key=abc&cmd=bgapi&arg=cti_originate user/121 three_way:156fd768-67b1-49c7-9a4b-bc9ef658912a inline
强拆分机通话(管理员通过web界面挂断分机通话)
调用httpcli接口http://127.0.0.1:88/cli?key=abc&cmd=uuid_kill&arg=7ba065a0-37b0-4495-a39d-546787ed1cc8
arg是分机通话的UUID或者signal_bond的UUID,建议执行2次,一次是分机的uuid一次是signal_bond。 ,分机通话的UUID,通过cti_userinfo@域名,或者gui.call配置的hash里面获取。